SysV-SharedMem

 view release on metacpan or  search on metacpan

lib/SysV/SharedMem.xs  view on Meta::CPAN

#define SET_HASH(key, value) hv_store(hash, key, sizeof key - 1, newSViv(value), 0)

#define get_shmid(var, description) get_svsh_magic(aTHX_ var, description)->shmid

MODULE = SysV::SharedMem				PACKAGE = SysV::SharedMem

PROTOTYPES: DISABLED

void
_shmat(var, shmid, offset, length, flags)
	SV* var;
	int shmid;
	ssize_t offset;
	size_t length;
	int flags;
	PREINIT:
		ptrdiff_t correction;
		void* address;
		struct svsh_info* magical;
	CODE:
		check_new_variable(aTHX_ var);
		
		correction = offset % page_size();
		address = do_mapping(aTHX_ shmid, flags);
		
		magical = initialize_svsh_info(shmid, address, length, correction);
		reset_var(var, magical);
		add_magic(aTHX_ var, magical, 1);

SV*
shared_stat(var)
	SV* var;
	PREINIT:
		int shmid;
		struct shmid_ds buffer;
		HV* hash;
	CODE:
		my_shmctl(get_shmid(var, "shared_stat"), IPC_STAT, &buffer, "Could not shared_stat: %s");
		
		hash = newHV();
		
		SET_HASH("uid", buffer.shm_perm.uid);
		SET_HASH("gid", buffer.shm_perm.gid);
		SET_HASH("cuid", buffer.shm_perm.cuid);
		SET_HASH("cgid", buffer.shm_perm.cgid);
		SET_HASH("mode", buffer.shm_perm.mode);

		SET_HASH("segsz", buffer.shm_segsz);
		SET_HASH("lpid", buffer.shm_lpid);
		SET_HASH("cpid", buffer.shm_cpid);
		SET_HASH("nattch", buffer.shm_nattch);
		SET_HASH("atime", buffer.shm_atime);
		SET_HASH("dtime", buffer.shm_dtime);
		SET_HASH("ctime", buffer.shm_ctime);

		RETVAL = newRV_noinc((SV*)hash);
	OUTPUT:
		RETVAL

void
shared_chown(var, uid, gid = &PL_sv_undef)
	SV* var;
	IV uid;
	SV* gid;
	PREINIT:
	int shmid;
	struct shmid_ds buffer;
	CODE:
		shmid = get_shmid(var, "shared_chown");
		my_shmctl(shmid, IPC_STAT, &buffer, "Could not shared_chown: %s");
		buffer.shm_perm.uid = uid;
		if (SvOK(gid))
			buffer.shm_perm.gid = SvIV(gid);
		my_shmctl(shmid, IPC_SET, &buffer, "Could not shared_chown: %s");

void
shared_chmod(var, mode)
	SV* var;
	int mode;
	PREINIT:
	int shmid;
	struct shmid_ds buffer;
	CODE:
		shmid = get_shmid(var, "shared_chmod");
		my_shmctl(shmid, IPC_STAT, &buffer, "Could not shared_chmod: %s");
		buffer.shm_perm.mode = (buffer.shm_perm.mode & ~0777) | (mode & 0777);
		my_shmctl(shmid, IPC_SET, &buffer, "Could not shared_chmod: %s");

void
shared_remove(var)
	SV* var;
	PREINIT:
	int shmid;
	CODE:
		my_shmctl(get_shmid(var, "shared_remove"), IPC_RMID, NULL, "Could not shared_remove: %s");

void
shared_detach(var)
	SV* var;
	CODE:
		get_svsh_magic(aTHX_ var, "shared_detach");
		unmagic(var);

IV
shared_identifier(var)
	SV* var;
	CODE:
		RETVAL = get_shmid(var, "shared_identifier");
	OUTPUT:
		RETVAL



( run in 0.640 second using v1.01-cache-2.11-cpan-5511b514fd6 )