
This change brings the default size of the main shmem block back under 1MB, which is a fairly popular value for the kernel's SHMMAX parameter.
156 lines
3.6 KiB
C
156 lines
3.6 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* 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.23 1999/03/06 21:17:41 tgl Exp $
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#include <string.h>
|
|
#include <sys/types.h>
|
|
|
|
#include "postgres.h"
|
|
|
|
#include "storage/ipc.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,
|
|
except in the case of a standalone backend.
|
|
|
|
0) destroy any existing semaphores for both buffer
|
|
and lock managers.
|
|
1) create the appropriate *SHARED* memory segments
|
|
for the two resource managers.
|
|
2) create shared semaphores as needed.
|
|
|
|
**************************************************/
|
|
|
|
void
|
|
CreateSharedMemoryAndSemaphores(IPCKey key, int maxBackends)
|
|
{
|
|
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 of the primary shared-memory block is estimated via
|
|
* moderately-accurate estimates for the big hogs, plus 100K for
|
|
* the stuff that's too small to bother with estimating.
|
|
*/
|
|
size = BufferShmemSize() + LockShmemSize(maxBackends);
|
|
#ifdef STABLE_MEMORY_STORAGE
|
|
size += MMShmemSize();
|
|
#endif
|
|
size += 100000;
|
|
|
|
if (DebugLvl > 1)
|
|
{
|
|
fprintf(stderr, "binding ShmemCreate(key=%x, size=%d)\n",
|
|
IPCKeyGetBufferMemoryKey(key), size);
|
|
}
|
|
ShmemCreate(IPCKeyGetBufferMemoryKey(key), size);
|
|
ShmemIndexReset();
|
|
InitShmem(key, size);
|
|
InitBufferPool(key);
|
|
|
|
/* ----------------
|
|
* do the lock table stuff
|
|
* ----------------
|
|
*/
|
|
InitLocks();
|
|
if (InitLockTable() == INVALID_TABLEID)
|
|
elog(FATAL, "Couldn't create the lock table");
|
|
|
|
/* ----------------
|
|
* do process table stuff
|
|
* ----------------
|
|
*/
|
|
InitProcGlobal(key, maxBackends);
|
|
|
|
CreateSharedInvalidationState(key);
|
|
}
|
|
|
|
|
|
/*
|
|
* AttachSharedMemoryAndSemaphores
|
|
* Attachs existant shared memory and semaphores.
|
|
*/
|
|
void
|
|
AttachSharedMemoryAndSemaphores(IPCKey key)
|
|
{
|
|
/* ----------------
|
|
* create rather than attach if using private key
|
|
* ----------------
|
|
*/
|
|
if (key == PrivateIPCKey)
|
|
{
|
|
CreateSharedMemoryAndSemaphores(key, 16);
|
|
return;
|
|
}
|
|
|
|
#ifdef HAS_TEST_AND_SET
|
|
/* ----------------
|
|
* attach the slock shared memory
|
|
* ----------------
|
|
*/
|
|
AttachSLockMemory(IPCKeyGetSLockSharedMemoryKey(key));
|
|
#endif
|
|
/* ----------------
|
|
* attach the buffer manager buffer pool (and semaphore)
|
|
* ----------------
|
|
*/
|
|
InitShmem(key, 0);
|
|
InitBufferPool(key);
|
|
|
|
/* ----------------
|
|
* initialize lock table stuff
|
|
* ----------------
|
|
*/
|
|
InitLocks();
|
|
if (InitLockTable() == INVALID_TABLEID)
|
|
elog(FATAL, "Couldn't attach to the lock table");
|
|
|
|
AttachSharedInvalidationState(key);
|
|
}
|