Data-Heap-Shared

 view release on metacpan or  search on metacpan

heap.h  view on Meta::CPAN


    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 )