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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * ipci.c
  4.  *   POSTGRES inter-process communication initialization code.
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/storage/ipc/ipci.c,v 1.26 1999/05/31 18:28:52 tgl Exp $
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. #include <string.h>
  15. #include <sys/types.h>
  16. #include "postgres.h"
  17. #include "storage/ipc.h"
  18. #include "storage/sinval.h"
  19. #include "storage/bufmgr.h"
  20. #include "storage/proc.h"
  21. #include "storage/smgr.h"
  22. #include "storage/lock.h"
  23. #include "miscadmin.h" /* for DebugLvl */
  24. /*
  25.  * SystemPortAddressCreateMemoryKey
  26.  * Returns a memory key given a port address.
  27.  */
  28. IPCKey
  29. SystemPortAddressCreateIPCKey(SystemPortAddress address)
  30. {
  31. Assert(address < 32768); /* XXX */
  32. return SystemPortAddressGetIPCKey(address);
  33. }
  34. /*
  35.  * CreateSharedMemoryAndSemaphores
  36.  * Creates and initializes shared memory and semaphores.
  37.  */
  38. /**************************************************
  39.   CreateSharedMemoryAndSemaphores
  40.   is called exactly *ONCE* by the postmaster.
  41.   It is *NEVER* called by the postgres backend,
  42.   except in the case of a standalone backend.
  43.   0) destroy any existing semaphores for both buffer
  44.   and lock managers.
  45.   1) create the appropriate *SHARED* memory segments
  46.   for the two resource managers.
  47.   2) create shared semaphores as needed.
  48.   **************************************************/
  49. void
  50. CreateSharedMemoryAndSemaphores(IPCKey key, int maxBackends)
  51. {
  52. int size;
  53. #ifdef HAS_TEST_AND_SET
  54. /* ---------------
  55.  * create shared memory for slocks
  56.  * --------------
  57.  */
  58. CreateAndInitSLockMemory(IPCKeyGetSLockSharedMemoryKey(key));
  59. #endif
  60. /* ----------------
  61.  * kill and create the buffer manager buffer pool (and semaphore)
  62.  * ----------------
  63.  */
  64. CreateSpinlocks(IPCKeyGetSpinLockSemaphoreKey(key));
  65. /*
  66.  * Size of the primary shared-memory block is estimated via
  67.  * moderately-accurate estimates for the big hogs, plus 100K for the
  68.  * stuff that's too small to bother with estimating.
  69.  */
  70. size = BufferShmemSize() + LockShmemSize(maxBackends);
  71. #ifdef STABLE_MEMORY_STORAGE
  72. size += MMShmemSize();
  73. #endif
  74. size += 100000;
  75. /* might as well round it off to a multiple of a K or so... */
  76. size += 1024 - (size % 1024);
  77. if (DebugLvl > 1)
  78. {
  79. fprintf(stderr, "binding ShmemCreate(key=%x, size=%d)n",
  80. IPCKeyGetBufferMemoryKey(key), size);
  81. }
  82. ShmemCreate(IPCKeyGetBufferMemoryKey(key), size);
  83. ShmemIndexReset();
  84. InitShmem(key, size);
  85. InitBufferPool(key);
  86. /* ----------------
  87.  * do the lock table stuff
  88.  * ----------------
  89.  */
  90. InitLocks();
  91. if (InitLockTable() == INVALID_TABLEID)
  92. elog(FATAL, "Couldn't create the lock table");
  93. /* ----------------
  94.  * do process table stuff
  95.  * ----------------
  96.  */
  97. InitProcGlobal(key, maxBackends);
  98. CreateSharedInvalidationState(key, maxBackends);
  99. }
  100. /*
  101.  * AttachSharedMemoryAndSemaphores
  102.  * Attachs existant shared memory and semaphores.
  103.  */
  104. void
  105. AttachSharedMemoryAndSemaphores(IPCKey key)
  106. {
  107. /* ----------------
  108.  * create rather than attach if using private key
  109.  * ----------------
  110.  */
  111. if (key == PrivateIPCKey)
  112. {
  113. CreateSharedMemoryAndSemaphores(key, 16);
  114. return;
  115. }
  116. #ifdef HAS_TEST_AND_SET
  117. /* ----------------
  118.  * attach the slock shared memory
  119.  * ----------------
  120.  */
  121. AttachSLockMemory(IPCKeyGetSLockSharedMemoryKey(key));
  122. #endif
  123. /* ----------------
  124.  * attach the buffer manager buffer pool (and semaphore)
  125.  * ----------------
  126.  */
  127. InitShmem(key, 0);
  128. InitBufferPool(key);
  129. /* ----------------
  130.  * initialize lock table stuff
  131.  * ----------------
  132.  */
  133. InitLocks();
  134. if (InitLockTable() == INVALID_TABLEID)
  135. elog(FATAL, "Couldn't attach to the lock table");
  136. AttachSharedInvalidationState(key);
  137. }