PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
ipc.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * ipc.h
4  * POSTGRES inter-process communication definitions.
5  *
6  * This file is misnamed, as it no longer has much of anything directly
7  * to do with IPC. The functionality here is concerned with managing
8  * exit-time cleanup for either a postmaster or a backend.
9  *
10  *
11  * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
12  * Portions Copyright (c) 1994, Regents of the University of California
13  *
14  * src/include/storage/ipc.h
15  *
16  *-------------------------------------------------------------------------
17  */
18 #ifndef IPC_H
19 #define IPC_H
20 
21 typedef void (*pg_on_exit_callback) (int code, Datum arg);
22 typedef 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 are
27  * 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 function
37  * needs.
38  *
39  * This construct ensures that cleanup_function() will be called during
40  * either ERROR or FATAL exits. It will not be called on successful
41  * 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 */
66 
67 extern void proc_exit(int code) pg_attribute_noreturn();
68 extern void shmem_exit(int code);
69 extern void on_proc_exit(pg_on_exit_callback function, Datum arg);
70 extern void on_shmem_exit(pg_on_exit_callback function, Datum arg);
71 extern void before_shmem_exit(pg_on_exit_callback function, Datum arg);
73 extern void on_exit_reset(void);
74 
75 /* ipci.c */
77 
78 extern void CreateSharedMemoryAndSemaphores(bool makePrivate, int port);
79 
80 #endif /* IPC_H */
void(* pg_on_exit_callback)(int code, Datum arg)
Definition: ipc.h:21
void before_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition: ipc.c:320
void on_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition: ipc.c:348
PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook
Definition: ipci.c:51
void(* shmem_startup_hook_type)(void)
Definition: ipc.h:22
PGDLLIMPORT bool proc_exit_inprogress
Definition: ipc.c:40
#define PGDLLIMPORT
Definition: c.h:1069
void proc_exit(int code) pg_attribute_noreturn()
Definition: ipc.c:99
void shmem_exit(int code)
Definition: ipc.c:215
static int port
Definition: pg_regress.c:90
uintptr_t Datum
Definition: postgres.h:372
void on_proc_exit(pg_on_exit_callback function, Datum arg)
Definition: ipc.c:292
void on_exit_reset(void)
Definition: ipc.c:396
#define pg_attribute_noreturn()
Definition: c.h:642
void CreateSharedMemoryAndSemaphores(bool makePrivate, int port)
Definition: ipci.c:96
void cancel_before_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition: ipc.c:377
void * arg