1 /*------------------------------------------------------------------------- 2 * 3 * parallel.h 4 * Infrastructure for launching parallel workers 5 * 6 * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group 7 * Portions Copyright (c) 1994, Regents of the University of California 8 * 9 * src/include/access/parallel.h 10 * 11 *------------------------------------------------------------------------- 12 */ 13 14 #ifndef PARALLEL_H 15 #define PARALLEL_H 16 17 #include "access/xlogdefs.h" 18 #include "lib/ilist.h" 19 #include "postmaster/bgworker.h" 20 #include "storage/shm_mq.h" 21 #include "storage/shm_toc.h" 22 23 typedef void (*parallel_worker_main_type) (dsm_segment *seg, shm_toc *toc); 24 25 typedef struct ParallelWorkerInfo 26 { 27 BackgroundWorkerHandle *bgwhandle; 28 shm_mq_handle *error_mqh; 29 int32 pid; 30 } ParallelWorkerInfo; 31 32 typedef struct ParallelContext 33 { 34 dlist_node node; 35 SubTransactionId subid; 36 int nworkers; /* Maximum number of workers to launch */ 37 int nworkers_to_launch; /* Actual number of workers to launch */ 38 int nworkers_launched; 39 char *library_name; 40 char *function_name; 41 ErrorContextCallback *error_context_stack; 42 shm_toc_estimator estimator; 43 dsm_segment *seg; 44 void *private_memory; 45 shm_toc *toc; 46 ParallelWorkerInfo *worker; 47 int nknown_attached_workers; 48 bool *known_attached_workers; 49 } ParallelContext; 50 51 typedef struct ParallelWorkerContext 52 { 53 dsm_segment *seg; 54 shm_toc *toc; 55 } ParallelWorkerContext; 56 57 extern volatile bool ParallelMessagePending; 58 extern PGDLLIMPORT int ParallelWorkerNumber; 59 extern PGDLLIMPORT bool InitializingParallelWorker; 60 61 #define IsParallelWorker() (ParallelWorkerNumber >= 0) 62 63 extern ParallelContext *CreateParallelContext(const char *library_name, 64 const char *function_name, int nworkers); 65 extern void InitializeParallelDSM(ParallelContext *pcxt); 66 extern void ReinitializeParallelDSM(ParallelContext *pcxt); 67 extern void ReinitializeParallelWorkers(ParallelContext *pcxt, int nworkers_to_launch); 68 extern void LaunchParallelWorkers(ParallelContext *pcxt); 69 extern void WaitForParallelWorkersToAttach(ParallelContext *pcxt); 70 extern void WaitForParallelWorkersToFinish(ParallelContext *pcxt); 71 extern void DestroyParallelContext(ParallelContext *pcxt); 72 extern bool ParallelContextActive(void); 73 74 extern void HandleParallelMessageInterrupt(void); 75 extern void HandleParallelMessages(void); 76 extern void AtEOXact_Parallel(bool isCommit); 77 extern void AtEOSubXact_Parallel(bool isCommit, SubTransactionId mySubId); 78 extern void ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end); 79 80 extern void ParallelWorkerMain(Datum main_arg); 81 82 #endif /* PARALLEL_H */ 83