diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-01-29 01:41:54 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-01-29 01:41:54 +0000 |
commit | f969d69ba9f952e5bdd38278e25e26a3e4a61a70 (patch) | |
tree | b3530d803df59d726afaabebc6626987dee1ca05 /ipc/util.h | |
parent | a10ce7ef2066b455d69187643ddf2073bfc4db24 (diff) |
Merge with 2.3.27.
Diffstat (limited to 'ipc/util.h')
-rw-r--r-- | ipc/util.h | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/ipc/util.h b/ipc/util.h new file mode 100644 index 000000000..a58eadebc --- /dev/null +++ b/ipc/util.h @@ -0,0 +1,78 @@ +/* + * linux/ipc/util.h + * Copyright (C) 1999 Christoph Rohland + * + * ipc helper functions (c) 1999 Manfred Spraul <manfreds@colorfullife.com> + */ + +#define USHRT_MAX 0xffff +#define SEQ_MULTIPLIER (IPCMNI) + +void sem_init (void); +void msg_init (void); +void shm_init (void); + +struct ipc_ids { + int size; + int in_use; + int max_id; + unsigned short seq; + unsigned short seq_max; + struct semaphore sem; + spinlock_t ary; + struct ipc_id* entries; +}; + +struct ipc_id { + struct ipc_perm* p; +}; + + +void __init ipc_init_ids(struct ipc_ids* ids, int size); + +/* must be called with ids->sem acquired.*/ +int ipc_findkey(struct ipc_ids* ids, key_t key); +int ipc_addid(struct ipc_ids* ids, struct ipc_perm* new, int size); + +/* must be called with both locks acquired. */ +struct ipc_perm* ipc_rmid(struct ipc_ids* ids, int id); + +int ipcperms (struct ipc_perm *ipcp, short flg); + +/* for rare, potentially huge allocations. + * both function can sleep + */ +void* ipc_alloc(int size); +void ipc_free(void* ptr, int size); + +extern inline struct ipc_perm* ipc_lock(struct ipc_ids* ids, int id) +{ + struct ipc_perm* out; + int lid = id % SEQ_MULTIPLIER; + if(lid > ids->size) + return NULL; + + spin_lock(&ids->ary); + out = ids->entries[lid].p; + if(out==NULL) + spin_unlock(&ids->ary); + return out; +} + +extern inline void ipc_unlock(struct ipc_ids* ids, int id) +{ + spin_unlock(&ids->ary); +} + +extern inline int ipc_buildid(struct ipc_ids* ids, int id, int seq) +{ + return SEQ_MULTIPLIER*seq + id; +} + +extern inline int ipc_checkid(struct ipc_ids* ids, struct ipc_perm* ipcp, int uid) +{ + if(uid/SEQ_MULTIPLIER != ipcp->seq) + return 1; + return 0; +} + |