codekingpro/portable-devtools
114k
1/*-------------------------------------------------------------------------2 *3 * ipc.h4 * POSTGRES inter-process communication definitions.5 *6 * This file is misnamed, as it no longer has much of anything directly7 * to do with IPC. The functionality here is concerned with managing8 * exit-time cleanup for either a postmaster or a backend.9 *10 *11 * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group12 * Portions Copyright (c) 1994, Regents of the University of California13 *14 * src/include/storage/ipc.h15 *16 *-------------------------------------------------------------------------17 */18#ifndef IPC_H19#define IPC_H20 21typedef void (*pg_on_exit_callback) (int code, Datum arg);22typedef void (*shmem_startup_hook_type) (void);23 24/*----------25 * API for handling cleanup that must occur during either ereport(ERROR)26 * or ereport(FATAL) exits from a block of code. (Typical examples are27 * undoing transient changes to shared-memory state.)28 *29 * PG_ENSURE_ERROR_CLEANUP(cleanup_function, arg);30 * {31 * ... code that might throw ereport(ERROR) or ereport(FATAL) ...32 * }33 * PG_END_ENSURE_ERROR_CLEANUP(cleanup_function, arg);34 *35 * where the cleanup code is in a function declared per pg_on_exit_callback.36 * The Datum value "arg" can carry any information the cleanup function37 * needs.38 *39 * This construct ensures that cleanup_function() will be called during40 * either ERROR or FATAL exits. It will not be called on successful41 * exit from the controlled code. (If you want it to happen then too,42 * call the function yourself from just after the construct.)43 *44 * Note: the macro arguments are multiply evaluated, so avoid side-effects.45 *----------46 */47#define PG_ENSURE_ERROR_CLEANUP(cleanup_function, arg) \48 do { \49 before_shmem_exit(cleanup_function, arg); \50 PG_TRY()51 52#define PG_END_ENSURE_ERROR_CLEANUP(cleanup_function, arg) \53 cancel_before_shmem_exit(cleanup_function, arg); \54 PG_CATCH(); \55 { \56 cancel_before_shmem_exit(cleanup_function, arg); \57 cleanup_function (0, arg); \58 PG_RE_THROW(); \59 } \60 PG_END_TRY(); \61 } while (0)62 63 64/* ipc.c */65extern PGDLLIMPORT bool proc_exit_inprogress;66extern PGDLLIMPORT bool shmem_exit_inprogress;67 68extern void proc_exit(int code) pg_attribute_noreturn();69extern void shmem_exit(int code);70extern void on_proc_exit(pg_on_exit_callback function, Datum arg);71extern void on_shmem_exit(pg_on_exit_callback function, Datum arg);72extern void before_shmem_exit(pg_on_exit_callback function, Datum arg);73extern void cancel_before_shmem_exit(pg_on_exit_callback function, Datum arg);74extern void on_exit_reset(void);75extern void check_on_shmem_exit_lists_are_empty(void);76 77/* ipci.c */78extern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook;79 80extern Size CalculateShmemSize(int *num_semaphores);81extern void CreateSharedMemoryAndSemaphores(void);82extern void InitializeShmemGUCs(void);83 84#endif /* IPC_H */85 