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-2019, 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 */ |
65 | extern PGDLLIMPORT bool proc_exit_inprogress; |
66 | extern PGDLLIMPORT bool shmem_exit_inprogress; |
67 | |
68 | extern void proc_exit(int code) pg_attribute_noreturn(); |
69 | extern void shmem_exit(int code); |
70 | extern void on_proc_exit(pg_on_exit_callback function, Datum arg); |
71 | extern void on_shmem_exit(pg_on_exit_callback function, Datum arg); |
72 | extern void before_shmem_exit(pg_on_exit_callback function, Datum arg); |
73 | extern void cancel_before_shmem_exit(pg_on_exit_callback function, Datum arg); |
74 | extern void on_exit_reset(void); |
75 | |
76 | /* ipci.c */ |
77 | extern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook; |
78 | |
79 | extern void CreateSharedMemoryAndSemaphores(int port); |
80 | |
81 | #endif /* IPC_H */ |
82 | |