diff options
author | Marc G. Fournier <scrappy@hub.org> | 1996-07-09 06:22:35 +0000 |
---|---|---|
committer | Marc G. Fournier <scrappy@hub.org> | 1996-07-09 06:22:35 +0000 |
commit | d31084e9d1118b25fd16580d9d8c2924b5740dff (patch) | |
tree | 3179e66307d54df9c7b966543550e601eb55e668 /src/backend/storage/ipc/ipci.c | |
download | postgresql-PG95-1_01.tar.gz postgresql-PG95-1_01.zip |
Postgres95 1.01 Distribution - Virgin SourcesPG95-1_01
Diffstat (limited to 'src/backend/storage/ipc/ipci.c')
-rw-r--r-- | src/backend/storage/ipc/ipci.c | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c new file mode 100644 index 00000000000..18d3cccd0ee --- /dev/null +++ b/src/backend/storage/ipc/ipci.c @@ -0,0 +1,149 @@ +/*------------------------------------------------------------------------- + * + * ipci.c-- + * POSTGRES inter-process communication initialization code. + * + * Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/src/backend/storage/ipc/ipci.c,v 1.1.1.1 1996/07/09 06:21:54 scrappy Exp $ + * + *------------------------------------------------------------------------- + */ +#include "c.h" + +#include "storage/ipc.h" +#include "storage/multilev.h" +#include "utils/elog.h" +#include "storage/sinval.h" +#include "storage/bufmgr.h" +#include "storage/proc.h" +#include "storage/smgr.h" +#include "storage/lock.h" +#include "miscadmin.h" /* for DebugLvl */ + +/* + * SystemPortAddressCreateMemoryKey -- + * Returns a memory key given a port address. + */ +IPCKey +SystemPortAddressCreateIPCKey(SystemPortAddress address) +{ + Assert(address < 32768); /* XXX */ + + return (SystemPortAddressGetIPCKey(address)); +} + +/* + * CreateSharedMemoryAndSemaphores -- + * Creates and initializes shared memory and semaphores. + */ +/************************************************** + + CreateSharedMemoryAndSemaphores + is called exactly *ONCE* by the postmaster. + It is *NEVER* called by the postgres backend + + 0) destroy any existing semaphores for both buffer + and lock managers. + 1) create the appropriate *SHARED* memory segments + for the two resource managers. + + **************************************************/ + +void +CreateSharedMemoryAndSemaphores(IPCKey key) +{ + int size; + +#ifdef HAS_TEST_AND_SET + /* --------------- + * create shared memory for slocks + * -------------- + */ + CreateAndInitSLockMemory(IPCKeyGetSLockSharedMemoryKey(key)); +#endif + /* ---------------- + * kill and create the buffer manager buffer pool (and semaphore) + * ---------------- + */ + CreateSpinlocks(IPCKeyGetSpinLockSemaphoreKey(key)); + size = BufferShmemSize() + LockShmemSize(); + +#ifdef MAIN_MEMORY + size += MMShmemSize(); +#endif /* MAIN_MEMORY */ + + if (DebugLvl > 1) { + fprintf(stderr, "binding ShmemCreate(key=%x, size=%d)\n", + IPCKeyGetBufferMemoryKey(key), size); + } + ShmemCreate(IPCKeyGetBufferMemoryKey(key), size); + ShmemBindingTabReset(); + InitShmem(key, size); + InitBufferPool(key); + + /* ---------------- + * do the lock table stuff + * ---------------- + */ + InitLocks(); + InitMultiLevelLockm(); + if (InitMultiLevelLockm() == INVALID_TABLEID) + elog(FATAL, "Couldn't create the lock table"); + + /* ---------------- + * do process table stuff + * ---------------- + */ + InitProcGlobal(key); + on_exitpg(ProcFreeAllSemaphores, 0); + + CreateSharedInvalidationState(key); +} + + +/* + * AttachSharedMemoryAndSemaphores -- + * Attachs existant shared memory and semaphores. + */ +void +AttachSharedMemoryAndSemaphores(IPCKey key) +{ + int size; + + /* ---------------- + * create rather than attach if using private key + * ---------------- + */ + if (key == PrivateIPCKey) { + CreateSharedMemoryAndSemaphores(key); + return; + } + +#ifdef HAS_TEST_AND_SET + /* ---------------- + * attach the slock shared memory + * ---------------- + */ + AttachSLockMemory(IPCKeyGetSLockSharedMemoryKey(key)); +#endif + /* ---------------- + * attach the buffer manager buffer pool (and semaphore) + * ---------------- + */ + size = BufferShmemSize() + LockShmemSize(); + InitShmem(key, size); + InitBufferPool(key); + + /* ---------------- + * initialize lock table stuff + * ---------------- + */ + InitLocks(); + if (InitMultiLevelLockm() == INVALID_TABLEID) + elog(FATAL, "Couldn't attach to the lock table"); + + AttachSharedInvalidationState(key); +} |