ck_epoch: ck_epoch_end returns true if forward progress has been made.

ck_pring
Samy Al Bahra 8 years ago
parent 6a9da5c91d
commit ffe9cbf9ca

@ -168,9 +168,10 @@ ck_epoch_begin(ck_epoch_record_t *record, ck_epoch_section_t *section)
} }
/* /*
* Marks the end of an epoch-protected section. * Marks the end of an epoch-protected section. Returns true if no more
* sections exist for the caller.
*/ */
CK_CC_FORCE_INLINE static void CK_CC_FORCE_INLINE static bool
ck_epoch_end(ck_epoch_record_t *record, ck_epoch_section_t *section) ck_epoch_end(ck_epoch_record_t *record, ck_epoch_section_t *section)
{ {
@ -178,9 +179,9 @@ ck_epoch_end(ck_epoch_record_t *record, ck_epoch_section_t *section)
ck_pr_store_uint(&record->active, record->active - 1); ck_pr_store_uint(&record->active, record->active - 1);
if (section != NULL) if (section != NULL)
_ck_epoch_delref(record, section); return _ck_epoch_delref(record, section);
return; return record->active == 0;
} }
/* /*

@ -88,7 +88,8 @@ test_simple_read_section(void)
ck_epoch_begin(&record, &section); ck_epoch_begin(&record, &section);
ck_epoch_call(&record, &entry, cleanup); ck_epoch_call(&record, &entry, cleanup);
assert(cleanup_calls == 0); assert(cleanup_calls == 0);
ck_epoch_end(&record, &section); if (ck_epoch_end(&record, &section) == false)
ck_error("expected no more sections");
ck_epoch_barrier(&record); ck_epoch_barrier(&record);
assert(cleanup_calls == 1); assert(cleanup_calls == 1);

@ -139,7 +139,7 @@ CK_STACK_CONTAINER(struct ck_epoch_entry, stack_entry,
#define CK_EPOCH_SENSE_MASK (CK_EPOCH_SENSE - 1) #define CK_EPOCH_SENSE_MASK (CK_EPOCH_SENSE - 1)
void bool
_ck_epoch_delref(struct ck_epoch_record *record, _ck_epoch_delref(struct ck_epoch_record *record,
struct ck_epoch_section *section) struct ck_epoch_section *section)
{ {
@ -150,7 +150,7 @@ _ck_epoch_delref(struct ck_epoch_record *record,
current->count--; current->count--;
if (current->count > 0) if (current->count > 0)
return; return false;
/* /*
* If the current bucket no longer has any references, then * If the current bucket no longer has any references, then
@ -161,8 +161,7 @@ _ck_epoch_delref(struct ck_epoch_record *record,
* If no other active bucket exists, then the record will go * If no other active bucket exists, then the record will go
* inactive in order to allow for forward progress. * inactive in order to allow for forward progress.
*/ */
other = &record->local.bucket[(i + 1) & other = &record->local.bucket[(i + 1) & CK_EPOCH_SENSE_MASK];
CK_EPOCH_SENSE_MASK];
if (other->count > 0 && if (other->count > 0 &&
((int)(current->epoch - other->epoch) < 0)) { ((int)(current->epoch - other->epoch) < 0)) {
/* /*
@ -172,7 +171,7 @@ _ck_epoch_delref(struct ck_epoch_record *record,
ck_pr_store_uint(&record->epoch, other->epoch); ck_pr_store_uint(&record->epoch, other->epoch);
} }
return; return true;
} }
void void

Loading…
Cancel
Save