Data-Sync-Shared

 view release on metacpan or  search on metacpan

Shared.xs  view on Meta::CPAN

    RETVAL = h->notify_fd;
  OUTPUT:
    RETVAL

bool
notify(self)
    SV *self
  PREINIT:
    EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
  CODE:
    RETVAL = sync_notify(h);
  OUTPUT:
    RETVAL

SV *
eventfd_consume(self)
    SV *self
  PREINIT:
    EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
  CODE:
    int64_t v = sync_eventfd_consume(h);
    RETVAL = (v >= 0) ? newSViv((IV)v) : &PL_sv_undef;
  OUTPUT:
    RETVAL

void
sync(self)
    SV *self
  PREINIT:
    EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
  CODE:
    if (sync_msync(h) != 0) croak("msync: %s", strerror(errno));

void
unlink(self_or_class, ...)
    SV *self_or_class
  CODE:
    const char *p;
    if (sv_isobject(self_or_class)) {
        SyncHandle *h = INT2PTR(SyncHandle*, SvIV(SvRV(self_or_class)));
        if (!h) croak("Attempted to use a destroyed object");
        p = h->path;
    } else {
        if (items < 2) croak("Usage: ...->unlink($path)");
        p = SvPV_nolen(ST(1));
    }
    if (!p) croak("cannot unlink anonymous or memfd object");
    if (unlink(p) != 0)
        croak("unlink(%s): %s", p, strerror(errno));

SV *
stats(self)
    SV *self
  PREINIT:
    EXTRACT_HANDLE("Data::Sync::Shared::RWLock", self);
  CODE:
    HV *hv = newHV();
    SyncHeader *hdr = h->hdr;
    uint32_t val = __atomic_load_n(&hdr->value, __ATOMIC_RELAXED);
    const char *state;
    if (val == 0) state = "unlocked";
    else if (val < SYNC_RWLOCK_WRITER_BIT) state = "read_locked";
    else state = "write_locked";
    hv_store(hv, "state", 5, newSVpv(state, 0), 0);
    hv_store(hv, "readers", 7,
        newSVuv(val < SYNC_RWLOCK_WRITER_BIT ? val : 0), 0);
    hv_store(hv, "waiters", 7, newSVuv((UV)__atomic_load_n(&hdr->waiters, __ATOMIC_RELAXED)), 0);
    hv_store(hv, "mmap_size", 9, newSVuv((UV)h->mmap_size), 0);
    hv_store(hv, "acquires", 8, newSVuv((UV)__atomic_load_n(&hdr->stat_acquires, __ATOMIC_RELAXED)), 0);
    hv_store(hv, "releases", 8, newSVuv((UV)__atomic_load_n(&hdr->stat_releases, __ATOMIC_RELAXED)), 0);
    hv_store(hv, "recoveries", 10, newSVuv((UV)__atomic_load_n(&hdr->stat_recoveries, __ATOMIC_RELAXED)), 0);
    RETVAL = newRV_noinc((SV *)hv);
  OUTPUT:
    RETVAL

MODULE = Data::Sync::Shared  PACKAGE = Data::Sync::Shared::Condvar

PROTOTYPES: DISABLE

SV *
new(class, path)
    const char *class
    SV *path
  PREINIT:
    char errbuf[SYNC_ERR_BUFLEN];
  CODE:
    const char *p = SvOK(path) ? SvPV_nolen(path) : NULL;
    SyncHandle *h = sync_create(p, SYNC_TYPE_CONDVAR, 0, 0, errbuf);
    if (!h) croak("Data::Sync::Shared::Condvar->new: %s", errbuf);
    MAKE_OBJ(class, h);
  OUTPUT:
    RETVAL

SV *
new_memfd(class, name)
    const char *class
    const char *name
  PREINIT:
    char errbuf[SYNC_ERR_BUFLEN];
  CODE:
    SyncHandle *h = sync_create_memfd(name, SYNC_TYPE_CONDVAR, 0, 0, errbuf);
    if (!h) croak("Data::Sync::Shared::Condvar->new_memfd: %s", errbuf);
    MAKE_OBJ(class, h);
  OUTPUT:
    RETVAL

SV *
new_from_fd(class, fd)
    const char *class
    int fd
  PREINIT:
    char errbuf[SYNC_ERR_BUFLEN];
  CODE:
    SyncHandle *h = sync_open_fd(fd, SYNC_TYPE_CONDVAR, errbuf);
    if (!h) croak("Data::Sync::Shared::Condvar->new_from_fd: %s", errbuf);
    MAKE_OBJ(class, h);
  OUTPUT:
    RETVAL

void
DESTROY(self)
    SV *self
  CODE:



( run in 2.475 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )