Data-Heap-Shared
view release on metacpan or search on metacpan
HeapHeader *hdr = h->hdr;
struct timespec dl, rem;
int has_dl = (timeout > 0);
if (has_dl) heap_make_deadline(timeout, &dl);
__atomic_add_fetch(&hdr->stat_waits, 1, __ATOMIC_RELAXED);
for (;;) {
__atomic_add_fetch(&hdr->waiters_pop, 1, __ATOMIC_RELEASE);
uint32_t cur = __atomic_load_n(&hdr->size, __ATOMIC_ACQUIRE);
if (cur > h->capacity) { /* corrupt size: heap_pop can never succeed, so do not busy-spin */
__atomic_sub_fetch(&hdr->waiters_pop, 1, __ATOMIC_RELAXED);
return 0;
}
if (cur == 0) {
struct timespec *pts = NULL;
if (has_dl) {
if (!heap_remaining(&dl, &rem)) {
__atomic_sub_fetch(&hdr->waiters_pop, 1, __ATOMIC_RELAXED);
__atomic_add_fetch(&hdr->stat_timeouts, 1, __ATOMIC_RELAXED);
return 0;
( run in 0.734 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )