Linux-Event

 view release on metacpan or  search on metacpan

Event.xs  view on Meta::CPAN


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 )