Linux-Event
view release on metacpan or search on metacpan
UV
timer_heap_at_ns(heap, deadline_ns, cb)
SV *heap
IV deadline_ns
SV *cb
CODE:
if (!SvROK(cb) || SvTYPE(SvRV(cb)) != SVt_PVCV) {
croak("callback must be a coderef");
}
le_timer_heap_t *h = le_timer_heap_from_sv(heap);
UV id = h->next_id++;
if (id >= h->live_cap) le_timer_live_grow(h, id);
h->live[id] = 1;
if (h->size >= h->cap) le_timer_heap_grow(h, h->size);
UV i = h->size++;
h->heap[i].deadline_ns = deadline_ns;
h->heap[i].id = id;
h->heap[i].cb = newSVsv(cb);
le_timer_sift_up(h, i);
RETVAL = id;
OUTPUT:
RETVAL
IV
timer_heap_cancel(heap, id)
SV *heap
UV id
CODE:
le_timer_heap_t *h = le_timer_heap_from_sv(heap);
if (id < h->live_cap && h->live[id]) {
h->live[id] = 0;
h->cancelled++;
RETVAL = 1;
}
else {
RETVAL = 0;
}
OUTPUT:
RETVAL
SV *
timer_heap_next_deadline_ns(heap)
SV *heap
CODE:
le_timer_heap_t *h = le_timer_heap_from_sv(heap);
le_timer_drop_cancelled_roots(h);
if (!h->size) {
RETVAL = &PL_sv_undef;
}
else {
RETVAL = newSViv(h->heap[0].deadline_ns);
}
OUTPUT:
RETVAL
void
timer_heap_pop_expired(heap, now_ns)
SV *heap
IV now_ns
PPCODE:
le_timer_heap_t *h = le_timer_heap_from_sv(heap);
while (h->size) {
le_timer_drop_cancelled_roots(h);
if (!h->size) break;
if (h->heap[0].deadline_ns > now_ns) break;
UV id = h->heap[0].id;
IV deadline_ns = h->heap[0].deadline_ns;
SV *cb = newSVsv(h->heap[0].cb);
if (id < h->live_cap) h->live[id] = 0;
le_timer_pop_root(h);
AV *av = newAV();
av_push(av, newSVuv(id));
av_push(av, cb);
av_push(av, newSViv(deadline_ns));
XPUSHs(sv_2mortal(newRV_noinc((SV *)av)));
}
UV
timer_heap_size(heap)
SV *heap
CODE:
le_timer_heap_t *h = le_timer_heap_from_sv(heap);
RETVAL = h->size;
OUTPUT:
RETVAL
SV *
epoll_new(class = "Linux::Event::XS::Epoll", max_events = 256)
const char *class
IV max_events
CODE:
if (max_events <= 0) {
croak("max_events must be positive");
}
le_epoll_t *ep;
Newxz(ep, 1, le_epoll_t);
ep->epfd = epoll_create1(EPOLL_CLOEXEC);
if (ep->epfd < 0) {
Safefree(ep);
croak("epoll_create1 failed: %s", strerror(errno));
}
ep->max_events = (int)max_events;
Newxz(ep->events, ep->max_events, struct epoll_event);
SV *inner = newSViv(PTR2IV(ep));
SV *ref = newRV_noinc(inner);
sv_bless(ref, gv_stashpv(class, GV_ADD));
RETVAL = ref;
OUTPUT:
RETVAL
void
epoll_add(epobj, fd, mask)
SV *epobj
IV fd
IV mask
CODE:
le_epoll_t *ep = le_epoll_from_sv(epobj);
struct epoll_event ev;
( run in 1.442 second using v1.01-cache-2.11-cpan-4e7a2411597 )