/*-------------------------------------------------------------------------
 *
 * parallel.h
 *	  Infrastructure for launching parallel workers
 *
 * Portions Copyright (c) 2023, HashData Technology Limited.
 * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/access/parallel.h
 *
 *-------------------------------------------------------------------------
 */

#ifndef PARALLEL_H
#define PARALLEL_H

#include "access/xlogdefs.h"
#include "lib/ilist.h"
#include "nodes/execnodes.h"
#include "postmaster/bgworker.h"
#include "storage/barrier.h"
#include "storage/shm_mq.h"
#include "storage/shm_toc.h"

typedef void (*parallel_worker_main_type) (dsm_segment *seg, shm_toc *toc);

typedef struct ParallelWorkerInfo
{
	BackgroundWorkerHandle *bgwhandle;
	shm_mq_handle *error_mqh;
	int32		pid;
} ParallelWorkerInfo;

typedef struct ParallelContext
{
	dlist_node	node;
	SubTransactionId subid;
	int			nworkers;		/* Maximum number of workers to launch */
	int			nworkers_to_launch; /* Actual number of workers to launch */
	int			nworkers_launched;
	char	   *library_name;
	char	   *function_name;
	ErrorContextCallback *error_context_stack;
	shm_toc_estimator estimator;
	dsm_segment *seg;
	void	   *private_memory;
	shm_toc    *toc;
	ParallelWorkerInfo *worker;
	int			nknown_attached_workers;
	bool	   *known_attached_workers;
} ParallelContext;

typedef struct ParallelWorkerContext
{
	dsm_segment *seg;
	shm_toc    *toc;
	int		nworkers;
	int		worker_id;
} ParallelWorkerContext;

extern volatile bool ParallelMessagePending;
extern PGDLLIMPORT int ParallelWorkerNumber;
extern PGDLLIMPORT bool InitializingParallelWorker;

typedef struct ParallelEntryTag
{
	int cid;
	int sliceId;
	int sessionId;
} ParallelEntryTag;

#define INIT_PARALLELENTRYTAG(a,xx_cid,xx_sliceId,xx_sessionId) \
do {															\
	(a).cid = (xx_cid);											\
	(a).sliceId = (xx_sliceId);									\
	(a).sessionId = (xx_sessionId);								\
} while(0)

typedef struct GpParallelDSMEntry
{
	ParallelEntryTag	tag;
	int             	pid;
	dsm_handle      	handle;
	shm_toc         	*toc;
	int             	reference;
	int             	tolaunch;
	int			parallel_workers;
	int			temp_worker_id;  /* temproary usage */
	Barrier		build_barrier;	/* synchronization for the build dsm phases */
} GpParallelDSMEntry;

#define		IsParallelWorker()		(ParallelWorkerNumber >= 0)

extern ParallelContext *CreateParallelContext(const char *library_name,
											  const char *function_name, int nworkers);
extern void InitializeParallelDSM(ParallelContext *pcxt);
extern void ReinitializeParallelDSM(ParallelContext *pcxt);
extern void ReinitializeParallelWorkers(ParallelContext *pcxt, int nworkers_to_launch);
extern void LaunchParallelWorkers(ParallelContext *pcxt);
extern void WaitForParallelWorkersToAttach(ParallelContext *pcxt);
extern void WaitForParallelWorkersToFinish(ParallelContext *pcxt);
extern void DestroyParallelContext(ParallelContext *pcxt);
extern bool ParallelContextActive(void);

extern void HandleParallelMessageInterrupt(void);
extern void HandleParallelMessages(void);
extern void AtEOXact_Parallel(bool isCommit);
extern void AtEOSubXact_Parallel(bool isCommit, SubTransactionId mySubId);
extern void ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end);

extern void ParallelWorkerMain(Datum main_arg);

extern void InitGpParallelDSMHash(void);

extern GpParallelDSMEntry* GpInsertParallelDSMHash(PlanState *planstate);

extern Size GpParallelDSMHashSize(void);

extern bool EstimateGpParallelDSMEntrySize(PlanState *planstate, ParallelContext *pctx);

extern bool InitializeGpParallelDSMEntry(PlanState *node, ParallelContext *pctx);
extern bool InitializeGpParallelWorkers(PlanState *planstate, ParallelWorkerContext *pwcxt);
extern void* GpFetchParallelDSMEntry(ParallelEntryTag tag, int plan_node_id);

extern void GpDestroyParallelDSMEntry(void);

extern void AtEOXact_CBDB_Parallel(void);

extern void AtProcExit_CBDB_Parallel(int code, Datum arg);

#endif							/* PARALLEL_H */
