Header And Logo

PostgreSQL
| The world's most advanced open source database.

Defines | Typedefs | Functions | Variables

ipc.h File Reference

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Defines

#define PG_ENSURE_ERROR_CLEANUP(cleanup_function, arg)
#define PG_END_ENSURE_ERROR_CLEANUP(cleanup_function, arg)

Typedefs

typedef void(* pg_on_exit_callback )(int code, Datum arg)
typedef void(* shmem_startup_hook_type )(void)

Functions

void proc_exit (int code) __attribute__((noreturn))
void shmem_exit (int code)
void on_proc_exit (pg_on_exit_callback function, Datum arg)
void on_shmem_exit (pg_on_exit_callback function, Datum arg)
void cancel_shmem_exit (pg_on_exit_callback function, Datum arg)
void on_exit_reset (void)
void CreateSharedMemoryAndSemaphores (bool makePrivate, int port)

Variables

bool proc_exit_inprogress
PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook

Define Documentation

#define PG_END_ENSURE_ERROR_CLEANUP (   cleanup_function,
  arg 
)
Value:
cancel_shmem_exit(cleanup_function, arg); \
        PG_CATCH(); \
        { \
            cancel_shmem_exit(cleanup_function, arg); \
            cleanup_function (0, arg); \
            PG_RE_THROW(); \
        } \
        PG_END_TRY(); \
    } while (0)

Definition at line 52 of file ipc.h.

Referenced by btbulkdelete(), createdb(), do_pg_start_backup(), movedb(), and perform_base_backup().

#define PG_ENSURE_ERROR_CLEANUP (   cleanup_function,
  arg 
)
Value:
do { \
        on_shmem_exit(cleanup_function, arg); \
        PG_TRY()

Definition at line 47 of file ipc.h.

Referenced by btbulkdelete(), createdb(), do_pg_start_backup(), movedb(), and perform_base_backup().


Typedef Documentation

typedef void(* pg_on_exit_callback)(int code, Datum arg)

Definition at line 21 of file ipc.h.

typedef void(* shmem_startup_hook_type)(void)

Definition at line 22 of file ipc.h.


Function Documentation

void cancel_shmem_exit ( pg_on_exit_callback  function,
Datum  arg 
)
void CreateSharedMemoryAndSemaphores ( bool  makePrivate,
int  port 
)

Definition at line 88 of file ipci.c.

References add_size(), addin_request_allowed, Assert, AsyncShmemInit(), AsyncShmemSize(), AutoVacuumShmemInit(), AutoVacuumShmemSize(), BackendStatusShmemSize(), BTreeShmemInit(), BTreeShmemSize(), BufferShmemSize(), CheckpointerShmemInit(), CheckpointerShmemSize(), CLOGShmemInit(), CLOGShmemSize(), CreateLWLocks(), CreateSharedBackendStatus(), CreateSharedInvalidationState(), CreateSharedProcArray(), DEBUG3, elog, hash_estimate_size(), InitBufferPool(), InitLocks(), InitPredicateLocks(), InitProcGlobal(), InitShmemAccess(), InitShmemAllocation(), InitShmemIndex(), IsUnderPostmaster, LockShmemSize(), LWLockShmemSize(), MultiXactShmemInit(), MultiXactShmemSize(), PANIC, PGReserveSemaphores(), PGSharedMemoryCreate(), PMSignalShmemInit(), PMSignalShmemSize(), PredicateLockShmemSize(), ProcArrayShmemSize(), ProcGlobalSemas(), ProcGlobalShmemSize(), ProcSignalShmemInit(), ProcSignalShmemSize(), SHMEM_INDEX_SIZE, shmem_startup_hook, SInvalShmemSize(), SpinlockSemas(), SUBTRANSShmemInit(), SUBTRANSShmemSize(), SyncScanShmemInit(), SyncScanShmemSize(), total_addin_request, TwoPhaseShmemInit(), TwoPhaseShmemSize(), WalRcvShmemInit(), WalRcvShmemSize(), WalSndShmemInit(), WalSndShmemSize(), XLOGShmemInit(), and XLOGShmemSize().

Referenced by InitCommunication(), and reset_shared().

{
    if (!IsUnderPostmaster)
    {
        PGShmemHeader *seghdr;
        Size        size;
        int         numSemas;

        /*
         * Size of the Postgres 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.
         *
         * We take some care during this phase to ensure that the total size
         * request doesn't overflow size_t.  If this gets through, we don't
         * need to be so careful during the actual allocation phase.
         */
        size = 100000;
        size = add_size(size, hash_estimate_size(SHMEM_INDEX_SIZE,
                                                 sizeof(ShmemIndexEnt)));
        size = add_size(size, BufferShmemSize());
        size = add_size(size, LockShmemSize());
        size = add_size(size, PredicateLockShmemSize());
        size = add_size(size, ProcGlobalShmemSize());
        size = add_size(size, XLOGShmemSize());
        size = add_size(size, CLOGShmemSize());
        size = add_size(size, SUBTRANSShmemSize());
        size = add_size(size, TwoPhaseShmemSize());
        size = add_size(size, MultiXactShmemSize());
        size = add_size(size, LWLockShmemSize());
        size = add_size(size, ProcArrayShmemSize());
        size = add_size(size, BackendStatusShmemSize());
        size = add_size(size, SInvalShmemSize());
        size = add_size(size, PMSignalShmemSize());
        size = add_size(size, ProcSignalShmemSize());
        size = add_size(size, CheckpointerShmemSize());
        size = add_size(size, AutoVacuumShmemSize());
        size = add_size(size, WalSndShmemSize());
        size = add_size(size, WalRcvShmemSize());
        size = add_size(size, BTreeShmemSize());
        size = add_size(size, SyncScanShmemSize());
        size = add_size(size, AsyncShmemSize());
#ifdef EXEC_BACKEND
        size = add_size(size, ShmemBackendArraySize());
#endif

        /* freeze the addin request size and include it */
        addin_request_allowed = false;
        size = add_size(size, total_addin_request);

        /* might as well round it off to a multiple of a typical page size */
        size = add_size(size, 8192 - (size % 8192));

        elog(DEBUG3, "invoking IpcMemoryCreate(size=%lu)",
             (unsigned long) size);

        /*
         * Create the shmem segment
         */
        seghdr = PGSharedMemoryCreate(size, makePrivate, port);

        InitShmemAccess(seghdr);

        /*
         * Create semaphores
         */
        numSemas = ProcGlobalSemas();
        numSemas += SpinlockSemas();
        PGReserveSemaphores(numSemas, port);
    }
    else
    {
        /*
         * We are reattaching to an existing shared memory segment. This
         * should only be reached in the EXEC_BACKEND case, and even then only
         * with makePrivate == false.
         */
#ifdef EXEC_BACKEND
        Assert(!makePrivate);
#else
        elog(PANIC, "should be attached to shared memory already");
#endif
    }

    /*
     * Set up shared memory allocation mechanism
     */
    if (!IsUnderPostmaster)
        InitShmemAllocation();

    /*
     * Now initialize LWLocks, which do shared memory allocation and are
     * needed for InitShmemIndex.
     */
    if (!IsUnderPostmaster)
        CreateLWLocks();

    /*
     * Set up shmem.c index hashtable
     */
    InitShmemIndex();

    /*
     * Set up xlog, clog, and buffers
     */
    XLOGShmemInit();
    CLOGShmemInit();
    SUBTRANSShmemInit();
    MultiXactShmemInit();
    InitBufferPool();

    /*
     * Set up lock manager
     */
    InitLocks();

    /*
     * Set up predicate lock manager
     */
    InitPredicateLocks();

    /*
     * Set up process table
     */
    if (!IsUnderPostmaster)
        InitProcGlobal();
    CreateSharedProcArray();
    CreateSharedBackendStatus();
    TwoPhaseShmemInit();

    /*
     * Set up shared-inval messaging
     */
    CreateSharedInvalidationState();

    /*
     * Set up interprocess signaling mechanisms
     */
    PMSignalShmemInit();
    ProcSignalShmemInit();
    CheckpointerShmemInit();
    AutoVacuumShmemInit();
    WalSndShmemInit();
    WalRcvShmemInit();

    /*
     * Set up other modules that need some shared memory space
     */
    BTreeShmemInit();
    SyncScanShmemInit();
    AsyncShmemInit();

#ifdef EXEC_BACKEND

    /*
     * Alloc the win32 shared backend array
     */
    if (!IsUnderPostmaster)
        ShmemBackendArrayAllocation();
#endif

    /*
     * Now give loadable modules a chance to set up their shmem allocations
     */
    if (shmem_startup_hook)
        shmem_startup_hook();
}

void on_exit_reset ( void   ) 
void on_proc_exit ( pg_on_exit_callback  function,
Datum  arg 
)
void on_shmem_exit ( pg_on_exit_callback  function,
Datum  arg 
)
void proc_exit ( int  code  ) 
void shmem_exit ( int  code  ) 

Variable Documentation

Definition at line 43 of file ipci.c.

Referenced by _PG_fini(), _PG_init(), and CreateSharedMemoryAndSemaphores().