Data-Log-Shared
view release on metacpan or search on metacpan
SV *
new_memfd(class, name, data_size)
const char *class
const char *name
UV data_size
PREINIT:
char errbuf[LOG_ERR_BUFLEN];
CODE:
LogHandle *h = log_create_memfd(name, data_size, errbuf);
if (!h) croak("Data::Log::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[LOG_ERR_BUFLEN];
CODE:
LogHandle *h = log_open_fd(fd, errbuf);
if (!h) croak("Data::Log::Shared->new_from_fd: %s", errbuf);
MAKE_OBJ(class, h);
OUTPUT:
RETVAL
void
DESTROY(self)
SV *self
CODE:
if (!SvROK(self)) return;
LogHandle *h = INT2PTR(LogHandle*, SvIV(SvRV(self)));
if (!h) return;
sv_setiv(SvRV(self), 0);
log_destroy(h);
SV *
append(self, data)
SV *self
SV *data
PREINIT:
EXTRACT_LOG(self);
CODE:
STRLEN len;
const char *buf = SvPV(data, len);
if (len == 0) croak("append: data must not be empty");
if (len > (STRLEN)(UINT32_MAX - LOG_ENTRY_HDR - 3))
croak("append: data too large");
int64_t off = log_append(h, buf, (uint32_t)len);
RETVAL = (off >= 0) ? newSViv((IV)off) : &PL_sv_undef;
OUTPUT:
RETVAL
void
read_entry(self, offset, ...)
SV *self
UV offset
PREINIT:
EXTRACT_LOG(self);
PPCODE:
const uint8_t *out_data;
uint32_t out_len;
uint64_t next_off;
/* Optional third arg: abandon_wait_us (default LOG_ABANDON_WAIT_US).
* Pass 0 to immediately treat any uncommitted slot as abandoned. */
uint64_t wait_us = (items > 2) ? (uint64_t)SvUV(ST(2)) : (uint64_t)LOG_ABANDON_WAIT_US;
int rc = log_read_ex(h, offset, &out_data, &out_len, &next_off, wait_us);
if (rc == LOG_READ_OK) {
EXTEND(SP, 2);
PUSHs(sv_2mortal(newSVpvn((const char *)out_data, out_len)));
PUSHs(sv_2mortal(newSVuv((UV)next_off)));
} else if (rc == LOG_READ_ABANDONED) {
/* Signal "skip this slot" â data is undef, next_off is set. */
EXTEND(SP, 2);
PUSHs(sv_newmortal()); /* undef */
PUSHs(sv_2mortal(newSVuv((UV)next_off)));
}
/* LOG_READ_EMPTY: return empty list. */
UV
tail_offset(self)
SV *self
PREINIT:
EXTRACT_LOG(self);
CODE:
RETVAL = (UV)log_tail_offset(h);
OUTPUT:
RETVAL
UV
entry_count(self)
SV *self
PREINIT:
EXTRACT_LOG(self);
CODE:
RETVAL = (UV)log_entry_count(h);
OUTPUT:
RETVAL
UV
data_size(self)
SV *self
PREINIT:
EXTRACT_LOG(self);
CODE:
RETVAL = (UV)log_data_size(h);
OUTPUT:
RETVAL
UV
available(self)
SV *self
PREINIT:
EXTRACT_LOG(self);
CODE:
RETVAL = (UV)log_available(h);
OUTPUT:
RETVAL
bool
( run in 1.220 second using v1.01-cache-2.11-cpan-71847e10f99 )