1 /*------------------------------------------------------------------------- 2 * 3 * parallel.h 4 * Infrastructure for launching parallel workers 5 * 6 * Portions Copyright (c) 1996-2017, 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; 37 int nworkers_launched; 38 char *library_name; 39 char *function_name; 40 ErrorContextCallback *error_context_stack; 41 shm_toc_estimator estimator; 42 dsm_segment *seg; 43 void *private_memory; 44 shm_toc *toc; 45 ParallelWorkerInfo *worker; 46 } ParallelContext; 47 48 extern volatile bool ParallelMessagePending; 49 extern int ParallelWorkerNumber; 50 extern bool InitializingParallelWorker; 51 52 #define IsParallelWorker() (ParallelWorkerNumber >= 0) 53 54 extern ParallelContext *CreateParallelContext(const char *library_name, const char *function_name, int nworkers); 55 extern void InitializeParallelDSM(ParallelContext *pcxt); 56 extern void ReinitializeParallelDSM(ParallelContext *pcxt); 57 extern void LaunchParallelWorkers(ParallelContext *pcxt); 58 extern void WaitForParallelWorkersToFinish(ParallelContext *pcxt); 59 extern void DestroyParallelContext(ParallelContext *pcxt); 60 extern bool ParallelContextActive(void); 61 62 extern void HandleParallelMessageInterrupt(void); 63 extern void HandleParallelMessages(void); 64 extern void AtEOXact_Parallel(bool isCommit); 65 extern void AtEOSubXact_Parallel(bool isCommit, SubTransactionId mySubId); 66 extern void ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end); 67 68 extern void ParallelWorkerMain(Datum main_arg); 69 70 #endif /* PARALLEL_H */ 71