ipc.h
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:5k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * ipc.h
  4.  *   POSTGRES inter-process communication definitions.
  5.  *
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  * $Id: ipc.h,v 1.34 1999/02/21 01:41:47 tgl Exp $
  10.  *
  11.  * NOTES
  12.  *   This file is very architecture-specific. This stuff should actually
  13.  *   be factored into the port/ directories.
  14.  *
  15.  * Some files that would normally need to include only sys/ipc.h must
  16.  * instead included this file because on Ultrix, sys/ipc.h is not designed
  17.  * to be included multiple times.  This file (by virtue of the ifndef IPC_H)
  18.  * is.
  19.  *-------------------------------------------------------------------------
  20.  */
  21. #ifndef IPC_H
  22. #define IPC_H
  23. #include <sys/types.h>
  24. #include <sys/ipc.h> /* For IPC_PRIVATE */
  25. #include <config.h>
  26. #ifndef HAVE_UNION_SEMUN
  27. union semun
  28. {
  29. int val;
  30. struct semid_ds *buf;
  31. unsigned short *array;
  32. };
  33. #endif
  34. typedef uint16 SystemPortAddress;
  35. /* semaphore definitions */
  36. #define IPCProtection (0600) /* access/modify by user only */
  37. #define IPC_NMAXSEM 25 /* maximum number of semaphores */
  38. #define IpcSemaphoreDefaultStartValue 255
  39. #define IpcSharedLock (-1)
  40. #define IpcExclusiveLock   (-255)
  41. #define IpcUnknownStatus (-1)
  42. #define IpcInvalidArgument (-2)
  43. #define IpcSemIdExist (-3)
  44. #define IpcSemIdNotExist (-4)
  45. typedef uint32 IpcSemaphoreKey; /* semaphore key */
  46. typedef int IpcSemaphoreId;
  47. /* shared memory definitions */
  48. #define IpcMemCreationFailed (-1)
  49. #define IpcMemIdGetFailed (-2)
  50. #define IpcMemAttachFailed 0
  51. typedef uint32 IPCKey;
  52. #define PrivateIPCKey IPC_PRIVATE
  53. #define DefaultIPCKey 17317
  54. typedef uint32 IpcMemoryKey; /* shared memory key */
  55. typedef int IpcMemoryId;
  56. /* ipc.c */
  57. extern void proc_exit(int code);
  58. extern void shmem_exit(int code);
  59. extern int on_shmem_exit(void (*function) (), caddr_t arg);
  60. extern int on_proc_exit(void (*function) (), caddr_t arg);
  61. extern void on_exit_reset(void);
  62. extern IpcSemaphoreId IpcSemaphoreCreate(IpcSemaphoreKey semKey,
  63.    int semNum, int permission, int semStartValue,
  64.    int removeOnExit, int *status);
  65. extern void IpcSemaphoreKill(IpcSemaphoreKey key);
  66. extern void IpcSemaphoreLock(IpcSemaphoreId semId, int sem, int lock);
  67. extern void IpcSemaphoreUnlock(IpcSemaphoreId semId, int sem, int lock);
  68. extern int IpcSemaphoreGetCount(IpcSemaphoreId semId, int sem);
  69. extern int IpcSemaphoreGetValue(IpcSemaphoreId semId, int sem);
  70. extern IpcMemoryId IpcMemoryCreate(IpcMemoryKey memKey, uint32 size,
  71. int permission);
  72. extern IpcMemoryId IpcMemoryIdGet(IpcMemoryKey memKey, uint32 size);
  73. extern char *IpcMemoryAttach(IpcMemoryId memId);
  74. extern void IpcMemoryKill(IpcMemoryKey memKey);
  75. extern void CreateAndInitSLockMemory(IPCKey key);
  76. extern void AttachSLockMemory(IPCKey key);
  77. #ifdef HAS_TEST_AND_SET
  78. #define NOLOCK 0
  79. #define SHAREDLOCK 1
  80. #define EXCLUSIVELOCK 2
  81. typedef enum _LockId_
  82. {
  83. BUFMGRLOCKID,
  84. LOCKLOCKID,
  85. OIDGENLOCKID,
  86. SHMEMLOCKID,
  87. SHMEMINDEXLOCKID,
  88. LOCKMGRLOCKID,
  89. SINVALLOCKID,
  90. #ifdef STABLE_MEMORY_STORAGE
  91. MMCACHELOCKID,
  92. #endif
  93. PROCSTRUCTLOCKID,
  94. FIRSTFREELOCKID
  95. } _LockId_;
  96. #define MAX_SPINS FIRSTFREELOCKID
  97. typedef struct slock
  98. {
  99. slock_t locklock;
  100. unsigned char flag;
  101. short nshlocks;
  102. slock_t shlock;
  103. slock_t exlock;
  104. slock_t comlock;
  105. struct slock *next;
  106. } SLock;
  107. #else /* HAS_TEST_AND_SET */
  108. typedef enum _LockId_
  109. {
  110. SHMEMLOCKID,
  111. SHMEMINDEXLOCKID,
  112. BUFMGRLOCKID,
  113. LOCKMGRLOCKID,
  114. SINVALLOCKID,
  115. #ifdef STABLE_MEMORY_STORAGE
  116. MMCACHELOCKID,
  117. #endif
  118. PROCSTRUCTLOCKID,
  119. OIDGENLOCKID,
  120. FIRSTFREELOCKID
  121. } _LockId_;
  122. #define MAX_SPINS FIRSTFREELOCKID
  123. #endif  /* HAS_TEST_AND_SET */
  124. /*
  125.  * the following are originally in ipci.h but the prototypes have circular
  126.  * dependencies and most files include both ipci.h and ipc.h anyway, hence
  127.  * combined.
  128.  *
  129.  */
  130. /*
  131.  * Note:
  132.  * These must not hash to DefaultIPCKey or PrivateIPCKey.
  133.  */
  134. #define SystemPortAddressGetIPCKey(address) 
  135. (28597 * (address) + 17491)
  136. /*
  137.  * these keys are originally numbered from 1 to 12 consecutively but not
  138.  * all are used. The unused ones are removed. - ay 4/95.
  139.  */
  140. #define IPCKeyGetBufferMemoryKey(key) 
  141. ((key == PrivateIPCKey) ? key : 1 + (key))
  142. #define IPCKeyGetSIBufferMemoryBlock(key) 
  143. ((key == PrivateIPCKey) ? key : 7 + (key))
  144. #define IPCKeyGetSLockSharedMemoryKey(key) 
  145. ((key == PrivateIPCKey) ? key : 10 + (key))
  146. #define IPCKeyGetSpinLockSemaphoreKey(key) 
  147. ((key == PrivateIPCKey) ? key : 11 + (key))
  148. #define IPCKeyGetWaitIOSemaphoreKey(key) 
  149. ((key == PrivateIPCKey) ? key : 12 + (key))
  150. #define IPCKeyGetWaitCLSemaphoreKey(key) 
  151. ((key == PrivateIPCKey) ? key : 13 + (key))
  152. /* --------------------------
  153.  * NOTE: This macro must always give the highest numbered key as every backend
  154.  * process forked off by the postmaster will be trying to acquire a semaphore
  155.  * with a unique key value starting at key+14 and incrementing up. Each
  156.  * backend uses the current key value then increments it by one.
  157.  * --------------------------
  158.  */
  159. #define IPCGetProcessSemaphoreInitKey(key) 
  160. ((key == PrivateIPCKey) ? key : 14 + (key))
  161. /* ipci.c */
  162. extern IPCKey SystemPortAddressCreateIPCKey(SystemPortAddress address);
  163. extern void CreateSharedMemoryAndSemaphores(IPCKey key, int maxBackends);
  164. extern void AttachSharedMemoryAndSemaphores(IPCKey key);
  165. #endif  /* IPC_H */