Data-HierTimingWheel-Shared
view release on metacpan or search on metacpan
int fd
PREINIT:
char errbuf[HW_ERR_BUFLEN];
CODE:
HwHandle *h = hw_open_fd(fd, errbuf);
if (!h) croak("Data::HierTimingWheel::Shared->new_from_fd: %s", errbuf);
MAKE_OBJ(class, h);
OUTPUT:
RETVAL
void
DESTROY(self)
SV *self
CODE:
if (sv_isobject(self) && sv_derived_from(self, "Data::HierTimingWheel::Shared")) {
HwHandle *h = INT2PTR(HwHandle*, SvIV(SvRV(self)));
if (h) { sv_setiv(SvRV(self), 0); hw_destroy(h); } /* null first: activates EXTRACT's use-after-destroy croak + makes a double DESTROY a no-op */
}
UV
add(self, delay, payload)
SV *self
UV delay
UV payload
PREINIT:
EXTRACT(self);
int64_t id;
CODE:
hw_rwlock_wrlock(h);
id = hw_add_locked(h, (uint64_t)delay, (uint64_t)payload);
__atomic_fetch_add(&h->hdr->stat_ops, 1, __ATOMIC_RELAXED);
hw_rwlock_wrunlock(h);
if (id == -2)
croak("Data::HierTimingWheel::Shared->add: delay %" UVuf " exceeds the wheel range (max %" UVuf "); use more levels or slots",
(UV)delay, (UV)(h->tick[h->num_levels] - 1));
if (id < 0) croak("Data::HierTimingWheel::Shared->add: timer pool is full (capacity %u)", (unsigned)h->capacity);
RETVAL = (UV)id;
OUTPUT:
RETVAL
int
cancel(self, timer_id)
SV *self
UV timer_id
PREINIT:
EXTRACT(self);
CODE:
hw_rwlock_wrlock(h);
RETVAL = hw_cancel_locked(h, (uint64_t)timer_id);
__atomic_fetch_add(&h->hdr->stat_ops, 1, __ATOMIC_RELAXED);
hw_rwlock_wrunlock(h);
OUTPUT:
RETVAL
void
advance(self, ticks = 1)
SV *self
UV ticks
PREINIT:
EXTRACT(self);
PPCODE:
{
REEXTRACT(self); /* `ticks = 1` is converted after PREINIT, so its magic already ran */
uint64_t *out = NULL, fired = 0, i, cap = h->capacity;
if (cap) { Newx(out, (size_t)cap, uint64_t); SAVEFREEPV(out); } /* alloc BEFORE the lock */
hw_rwlock_wrlock(h);
fired = cap ? hw_advance_locked(h, (uint64_t)ticks, out, cap) : 0;
__atomic_fetch_add(&h->hdr->stat_ops, 1, __ATOMIC_RELAXED);
hw_rwlock_wrunlock(h);
EXTEND(SP, (SSize_t)fired);
for (i = 0; i < fired; i++) PUSHs(sv_2mortal(newSVuv((UV)out[i]))); /* Perl alloc AFTER unlock */
}
UV
now(self)
SV *self
PREINIT:
EXTRACT(self);
UV v;
CODE:
hw_rwlock_rdlock(h);
v = (UV)h->hdr->now;
hw_rwlock_rdunlock(h);
RETVAL = v;
OUTPUT:
RETVAL
UV
count(self)
SV *self
PREINIT:
EXTRACT(self);
UV v;
CODE:
hw_rwlock_rdlock(h);
v = (UV)h->hdr->count;
hw_rwlock_rdunlock(h);
RETVAL = v;
OUTPUT:
RETVAL
UV
capacity(self)
SV *self
PREINIT:
EXTRACT(self);
CODE:
RETVAL = (UV)h->hdr->capacity;
OUTPUT:
RETVAL
UV
num_slots(self)
SV *self
PREINIT:
EXTRACT(self);
CODE:
RETVAL = (UV)h->hdr->num_slots;
OUTPUT:
RETVAL
( run in 1.274 second using v1.01-cache-2.11-cpan-92ad3014f07 )