Data-Intern-Shared

 view release on metacpan or  search on metacpan

Shared.xs  view on Meta::CPAN

void
DESTROY(self)
    SV *self
  CODE:
    if (sv_isobject(self) && sv_derived_from(self, "Data::Intern::Shared")) {
        SiHandle *h = INT2PTR(SiHandle*, SvIV(SvRV(self)));
        if (h) { sv_setiv(SvRV(self), 0); si_destroy(h); }   /* null first: activates EXTRACT's use-after-destroy croak + makes a double DESTROY a no-op */
    }

UV
count(self)
    SV *self
  PREINIT:
    EXTRACT(self);
  CODE:
    si_rwlock_rdlock(h);
    RETVAL = h->hdr->count;
    si_rwlock_rdunlock(h);
  OUTPUT:
    RETVAL

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

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

UV
arena_used(self)
    SV *self
  PREINIT:
    EXTRACT(self);
  CODE:
    si_rwlock_rdlock(h);
    RETVAL = h->hdr->arena_used;
    si_rwlock_rdunlock(h);
  OUTPUT:
    RETVAL

void
clear(self)
    SV *self
  PREINIT:
    EXTRACT(self);
  CODE:
    si_rwlock_wrlock(h);
    si_clear_locked(h);
    si_rwlock_wrunlock(h);

SV *
intern(self, str)
    SV *self
    SV *str
  PREINIT:
    EXTRACT(self);
    STRLEN n;
    const char *s;
    int64_t id;
  CODE:
    s = SvPVbyte(str, n);
    si_rwlock_wrlock(h);
    id = si_intern_locked(h, s, n);
    __atomic_fetch_add(&h->hdr->stat_ops, 1, __ATOMIC_RELAXED);
    si_rwlock_wrunlock(h);
    RETVAL = (id < 0) ? &PL_sv_undef : newSVuv((UV)id);
  OUTPUT:
    RETVAL

SV *
id_of(self, str)
    SV *self
    SV *str
  PREINIT:
    EXTRACT(self);
    STRLEN n;
    const char *s;
    uint32_t id;
  CODE:
    s = SvPVbyte(str, n);
    si_rwlock_rdlock(h);
    int found = si_id_of_locked(h, s, n, &id);
    si_rwlock_rdunlock(h);
    RETVAL = found ? newSVuv(id) : &PL_sv_undef;
  OUTPUT:
    RETVAL

SV *
string(self, id)
    SV *self
    UV id
  PREINIT:
    EXTRACT(self);
  CODE:
    si_rwlock_rdlock(h);
    {
        SV *out = &PL_sv_undef;
        if (id < h->hdr->count) {
            uint32_t l;
            const char *str = si_arena_str(h, h->reverse[id], &l);
            out = newSVpvn(str, l);
        }
        si_rwlock_rdunlock(h);
        RETVAL = out;
    }
  OUTPUT:
    RETVAL

bool
exists(self, str)
    SV *self
    SV *str
  PREINIT:
    EXTRACT(self);
    STRLEN n;
    const char *s;
    uint32_t id;
  CODE:
    s = SvPVbyte(str, n);
    si_rwlock_rdlock(h);
    RETVAL = si_id_of_locked(h, s, n, &id);
    si_rwlock_rdunlock(h);
  OUTPUT:
    RETVAL

SV *
stats(self)
    SV *self
  PREINIT:
    EXTRACT(self);
  CODE:
    {
        HV *hv = newHV();
        si_rwlock_rdlock(h);
        SiHeader *hd = h->hdr;
        hv_stores(hv, "count",       newSVuv(hd->count));
        hv_stores(hv, "max_strings", newSVuv(hd->max_strings));
        hv_stores(hv, "hash_slots",  newSVuv(hd->hash_slots));
        hv_stores(hv, "hash_load",   newSVnv((double)hd->count / (double)hd->hash_slots));
        hv_stores(hv, "arena_used",  newSVuv(hd->arena_used));
        hv_stores(hv, "arena_bytes", newSVuv(hd->arena_bytes));
        hv_stores(hv, "arena_load",  newSVnv((double)hd->arena_used / (double)hd->arena_bytes));
        hv_stores(hv, "ops",         newSVuv(hd->stat_ops));
        hv_stores(hv, "mmap_size",   newSVuv((UV)h->mmap_size));
        si_rwlock_rdunlock(h);
        RETVAL = newRV_noinc((SV *)hv);
    }
  OUTPUT:
    RETVAL

SV *
path(self)
    SV *self
  PREINIT:
    EXTRACT(self);
  CODE:
    RETVAL = h->path ? newSVpv(h->path, 0) : &PL_sv_undef;
  OUTPUT:
    RETVAL

int
memfd(self)
    SV *self
  PREINIT:
    EXTRACT(self);
  CODE:
    RETVAL = h->backing_fd;
  OUTPUT:
    RETVAL

void
sync(self)
    SV *self
  PREINIT:
    EXTRACT(self);
  CODE:
    if (si_msync(h) != 0) croak("sync: %s", strerror(errno));

void
unlink(self, ...)
    SV *self



( run in 0.730 second using v1.01-cache-2.11-cpan-bbe5e583499 )