IPC-Mmap
view release on metacpan or search on metacpan
# by addr, into the Perl scalar var returns the actual length read
void
mmap_read(addr, maxlen, off, var, len)
SV * addr
size_t maxlen
int off
SV * var
size_t len
PROTOTYPE: $$$$$
PPCODE:
UV tmp = SvUV(addr);
caddr_t lcladdr = INT2PTR(caddr_t, (tmp + off));
if (len > maxlen - off)
len = maxlen - off;
# printf("\nmmap_read: length is %i\n", len);
sv_setpvn(var, lcladdr, len);
SvSETMAGIC(var);
ST(0) = sv_2mortal(newSVnv(len));
XSRETURN(1);
# returns the number of bytes actually written
void
mmap_write(addr, maxlen, off, var, len)
SV * addr
int maxlen
int off
SV * var
int len
PROTOTYPE: $$$$$
PPCODE:
UV tmp = SvUV(addr);
caddr_t lcladdr = INT2PTR(caddr_t, (tmp + off));
STRLEN varlen;
char * ptr;
# printf("\nmmap_write: addr %p maxlen %i off %i len %i\n",
# lcladdr, maxlen, off, len);
ptr = SvPV(var, varlen);
if (len > (int)varlen)
constant(name,arg)
char * name
int arg
void
_mmap_anon(len, prot, flags)
size_t len
int prot
int flags
PROTOTYPE: $$$
PPCODE:
int fd;
void * addr;
int slop;
/* struct stat st; */
# printf("\n_mmap: len %i prot %i flags %i\n", len, prot, flags);
EXTEND(SP, 3);
fd = -1;
if (!len) {
croak("mmap: MAP_ANON specified, but no length specified. cannot infer length from file");
PUSHs(sv_2mortal(newSVnv((int) slop)));
XSRETURN(3);
void
_mmap(len, prot, flags, fh)
size_t len
int prot
int flags
FILE * fh
PROTOTYPE: $$$*
PPCODE:
int fd;
void * addr;
int slop;
struct stat st;
# printf("\n_mmap: len %i prot %i flags %i\n", len, prot, flags);
EXTEND(SP, 3);
if (flags&MAP_ANON) {
fd = -1;
if (!len) {
PUSHs(sv_2mortal(newSVuv(PTR2UV(addr))));
PUSHs(sv_2mortal(newSVnv((int) len + slop)));
PUSHs(sv_2mortal(newSVnv((int) slop)));
XSRETURN(3);
void
_munmap(addr, len)
void * addr
size_t len
PROTOTYPE: $$
PPCODE:
#
# XXX refrain from dumping core if this
# var wasnt previously mmap'd
#
# printf("_munmap: addr %p len %i\n", addr, len);
if (munmap(addr, len) == -1) {
# printf("_munmap failed! errno %d\n", errno);
croak("munmap failed! errno %d %s\n", errno, strerror(errno));
ST(0) = &PL_sv_undef;
}
( run in 0.902 second using v1.01-cache-2.11-cpan-71847e10f99 )