NanoMsg-Raw
view release on metacpan or search on metacpan
hdr.msg_iovlen = iovlen;
C_ARGS:
s, &hdr, flags
POSTCALL:
if (RETVAL < 0) {
PERL_NN_SET_ERRNO;
XSRETURN_UNDEF;
}
nbytes = RETVAL;
if (iovlen == 1 && iov[0].iov_len == NN_MSG) {
SV *obj = SvRV(ST(2));
msg->len = RETVAL;
SvPVX(obj) = msg->buf;
SvCUR_set(obj, RETVAL);
SvPOK_on(obj);
}
else {
for (i = 0; i < iovlen; i++) {
size_t max = iov[i].iov_len < nbytes ? iov[i].iov_len : nbytes;
SvCUR_set(ST(i*2 + 2), max);
if (nbytes > 0)
nbytes -= max;
}
}
CLEANUP:
Safefree(iov);
perl_nn_messagebuf
nn_allocmsg (size, type)
size_t size
int type
const char *
nn_strerror (errnum)
int errnum
SV *
nn_errno ()
CODE:
RETVAL = SvREFCNT_inc(errno_sv);
OUTPUT:
RETVAL
perl_nn_int_bool
nn_device (s1, s2)
int s1
int s2
INIT:
if (ST(0) == &PL_sv_undef)
s1 = -1;
if (ST(1) == &PL_sv_undef)
s2 = -1;
void
nn_term ()
void
_symbols ()
PREINIT:
int i;
PPCODE:
for (i = 0; i <= av_len(symbol_names); i++)
mXPUSHs(SvREFCNT_inc(*av_fetch(symbol_names, i, 0)));
BOOT:
symbol_names = newAV();
errno_sv = newSV(0);
sv_upgrade(errno_sv, SVt_PVIV);
message_stash = gv_stashpvs("NanoMsg::Raw::Message", 0);
message_freed_stash = gv_stashpvs("NanoMsg::Raw::Message::Freed", GV_ADD);
{
CV *cv;
const char *sym;
int val, i = 0;
char name[4096] = "NanoMsg::Raw::";
size_t prefixlen = sizeof("NanoMsg::Raw::") - 1;
while ((sym = nn_symbol(i++, &val)) != NULL) {
size_t symlen = strlen(sym);
if (strncmp(sym, "EFAULT", sizeof("EFAULT")-1) == 0)
continue;
av_push(symbol_names, newSVpv(sym, symlen));
memcpy(name + prefixlen, sym, symlen+1);
cv = newXS(name, XS_NanoMsg__Raw_nn_constant, file);
XSANY.any_iv = val;
}
memcpy(name + prefixlen, "NN_MSG", sizeof("NN_MSG"));
cv = newXS(name, XS_NanoMsg__Raw_nn_constant, file);
XSANY.any_iv = NN_MSG;
}
MODULE=NanoMsg::Raw PACKAGE=NanoMsg::Raw::Message
void
copy (sv, src)
SV *sv
SV *src
PREINIT:
const void *buf;
STRLEN len;
SV *obj;
struct perl_nn_message *msg;
INIT:
obj = SvRV(sv);
buf = SvPV(src, len);
msg = perl_nn_message_mg_find(aTHX_ obj);
if (len > msg->len)
croak("Trying to copy "SIZETf" bytes into a message buffer of size "SIZETf,
SIZETfARG(len), SIZETfARG(msg->len));
CODE:
memcpy(msg->buf, buf, len);
SvPVX(obj) = msg->buf;
SvCUR_set(obj, len);
SvPOK_on(obj);
( run in 1.322 second using v1.01-cache-2.11-cpan-5511b514fd6 )