Data-Heap-Shared

 view release on metacpan or  search on metacpan

Shared.xs  view on Meta::CPAN

    HeapHandle *h = heap_create(p, capacity, errbuf);
    if (!h) croak("Data::Heap::Shared->new: %s", errbuf);
    MAKE_OBJ(class, h);
  OUTPUT:
    RETVAL

SV *
new_memfd(class, name, capacity)
    const char *class
    const char *name
    UV capacity
  PREINIT:
    char errbuf[HEAP_ERR_BUFLEN];
  CODE:
    HeapHandle *h = heap_create_memfd(name, capacity, errbuf);
    if (!h) croak("Data::Heap::Shared->new_memfd: %s", errbuf);
    MAKE_OBJ(class, h);
  OUTPUT:
    RETVAL

SV *
new_from_fd(class, fd)
    const char *class
    int fd
  PREINIT:
    char errbuf[HEAP_ERR_BUFLEN];
  CODE:
    HeapHandle *h = heap_open_fd(fd, errbuf);
    if (!h) croak("Data::Heap::Shared->new_from_fd: %s", errbuf);
    MAKE_OBJ(class, h);
  OUTPUT:
    RETVAL

void
DESTROY(self)
    SV *self
  CODE:
    if (!SvROK(self)) return;
    HeapHandle *h = INT2PTR(HeapHandle*, SvIV(SvRV(self)));
    if (!h) return;
    sv_setiv(SvRV(self), 0);
    heap_destroy(h);

bool
push(self, priority, value)
    SV *self
    IV priority
    IV value
  PREINIT:
    EXTRACT_HEAP(self);
  CODE:
    RETVAL = heap_push(h, (int64_t)priority, (int64_t)value);
  OUTPUT:
    RETVAL

void
pop(self)
    SV *self
  PREINIT:
    EXTRACT_HEAP(self);
  PPCODE:
    int64_t p, v;
    if (heap_pop(h, &p, &v)) {
        EXTEND(SP, 2);
        PUSHs(sv_2mortal(newSViv((IV)p)));
        PUSHs(sv_2mortal(newSViv((IV)v)));
    }

void
pop_wait(self, ...)
    SV *self
  PREINIT:
    EXTRACT_HEAP(self);
    double timeout = -1;
  PPCODE:
    if (items > 1) timeout = SvNV(ST(1));
    int64_t p, v;
    if (heap_pop_wait(h, &p, &v, timeout)) {
        EXTEND(SP, 2);
        PUSHs(sv_2mortal(newSViv((IV)p)));
        PUSHs(sv_2mortal(newSViv((IV)v)));
    }

void
peek(self)
    SV *self
  PREINIT:
    EXTRACT_HEAP(self);
  PPCODE:
    int64_t p, v;
    if (heap_peek(h, &p, &v)) {
        EXTEND(SP, 2);
        PUSHs(sv_2mortal(newSViv((IV)p)));
        PUSHs(sv_2mortal(newSViv((IV)v)));
    }

UV
size(self)
    SV *self
  PREINIT:
    EXTRACT_HEAP(self);
  CODE:
    RETVAL = heap_size(h);
  OUTPUT:
    RETVAL

UV
capacity(self)
    SV *self
  PREINIT:
    EXTRACT_HEAP(self);
  CODE:
    RETVAL = (UV)h->hdr->capacity;
  OUTPUT:
    RETVAL

bool
is_empty(self)
    SV *self
  PREINIT:
    EXTRACT_HEAP(self);
  CODE:
    RETVAL = heap_size(h) == 0;
  OUTPUT:
    RETVAL

bool
is_full(self)
    SV *self
  PREINIT:
    EXTRACT_HEAP(self);
  CODE:
    RETVAL = heap_size(h) >= (UV)h->hdr->capacity;
  OUTPUT:
    RETVAL

void
clear(self)
    SV *self
  PREINIT:
    EXTRACT_HEAP(self);
  CODE:
    heap_clear(h);

SV *
path(self)
    SV *self
  PREINIT:
    EXTRACT_HEAP(self);



( run in 3.422 seconds using v1.01-cache-2.11-cpan-71847e10f99 )