util.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * linux/ipc/util.h
  3.  * Copyright (C) 1999 Christoph Rohland
  4.  *
  5.  * ipc helper functions (c) 1999 Manfred Spraul <manfreds@colorfullife.com>
  6.  */
  7. #define USHRT_MAX 0xffff
  8. #define SEQ_MULTIPLIER (IPCMNI)
  9. void sem_init (void);
  10. void msg_init (void);
  11. void shm_init (void);
  12. struct ipc_ids {
  13. int size;
  14. int in_use;
  15. int max_id;
  16. unsigned short seq;
  17. unsigned short seq_max;
  18. struct semaphore sem;
  19. spinlock_t ary;
  20. struct ipc_id* entries;
  21. };
  22. struct ipc_id {
  23. struct kern_ipc_perm* p;
  24. };
  25. void __init ipc_init_ids(struct ipc_ids* ids, int size);
  26. /* must be called with ids->sem acquired.*/
  27. int ipc_findkey(struct ipc_ids* ids, key_t key);
  28. int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size);
  29. /* must be called with both locks acquired. */
  30. struct kern_ipc_perm* ipc_rmid(struct ipc_ids* ids, int id);
  31. int ipcperms (struct kern_ipc_perm *ipcp, short flg);
  32. /* for rare, potentially huge allocations.
  33.  * both function can sleep
  34.  */
  35. void* ipc_alloc(int size);
  36. void ipc_free(void* ptr, int size);
  37. extern inline void ipc_lockall(struct ipc_ids* ids)
  38. {
  39. spin_lock(&ids->ary);
  40. }
  41. extern inline struct kern_ipc_perm* ipc_get(struct ipc_ids* ids, int id)
  42. {
  43. struct kern_ipc_perm* out;
  44. int lid = id % SEQ_MULTIPLIER;
  45. if(lid >= ids->size)
  46. return NULL;
  47. out = ids->entries[lid].p;
  48. return out;
  49. }
  50. extern inline void ipc_unlockall(struct ipc_ids* ids)
  51. {
  52. spin_unlock(&ids->ary);
  53. }
  54. extern inline struct kern_ipc_perm* ipc_lock(struct ipc_ids* ids, int id)
  55. {
  56. struct kern_ipc_perm* out;
  57. int lid = id % SEQ_MULTIPLIER;
  58. if(lid >= ids->size)
  59. return NULL;
  60. spin_lock(&ids->ary);
  61. out = ids->entries[lid].p;
  62. if(out==NULL)
  63. spin_unlock(&ids->ary);
  64. return out;
  65. }
  66. extern inline void ipc_unlock(struct ipc_ids* ids, int id)
  67. {
  68. spin_unlock(&ids->ary);
  69. }
  70. extern inline int ipc_buildid(struct ipc_ids* ids, int id, int seq)
  71. {
  72. return SEQ_MULTIPLIER*seq + id;
  73. }
  74. extern inline int ipc_checkid(struct ipc_ids* ids, struct kern_ipc_perm* ipcp, int uid)
  75. {
  76. if(uid/SEQ_MULTIPLIER != ipcp->seq)
  77. return 1;
  78. return 0;
  79. }
  80. void kernel_to_ipc64_perm(struct kern_ipc_perm *in, struct ipc64_perm *out);
  81. void ipc64_perm_to_ipc_perm(struct ipc64_perm *in, struct ipc_perm *out);
  82. #if defined(__ia64__) || defined(__hppa__)
  83.   /* On IA-64 and PA-RISC, we always use the "64-bit version" of the IPC structures.  */ 
  84. # define ipc_parse_version(cmd) IPC_64
  85. #else
  86. int ipc_parse_version (int *cmd);
  87. #endif