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 )