IPC-Mmap

 view release on metacpan or  search on metacpan

Mmap.xs  view on Meta::CPAN

# 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);

Mmap.xs  view on Meta::CPAN

# 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)

Mmap.xs  view on Meta::CPAN

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");

Mmap.xs  view on Meta::CPAN

	 	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)  {

Mmap.xs  view on Meta::CPAN

	 	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 )