head 1.11; access; symbols release_4_2:1.11 aix_ok:1.10 Version_2_1:1.1; locks; strict; comment @ * @; 1.11 date 94.02.07.11.45.22; author aoki; state Exp; branches; next 1.10; 1.10 date 92.01.21.16.40.47; author hong; state Exp; branches; next 1.9; 1.9 date 91.11.11.23.08.35; author hong; state Exp; branches; next 1.8; 1.8 date 91.11.11.21.24.42; author glass; state Exp; branches; next 1.7; 1.7 date 91.11.09.09.52.59; author hong; state Exp; branches; next 1.6; 1.6 date 91.10.09.14.51.32; author hong; state Exp; branches; next 1.5; 1.5 date 91.10.08.01.10.43; author hong; state Exp; branches; next 1.4; 1.4 date 91.08.25.13.32.38; author hong; state Exp; branches; next 1.3; 1.3 date 91.07.24.16.12.08; author hong; state Exp; branches; next 1.2; 1.2 date 91.07.17.23.48.30; author hong; state Exp; branches; next 1.1; 1.1 date 90.09.10.20.42.23; author hong; state Exp; branches; next ; desc @some definitions for slaves @ 1.11 log @proto fixes @ text @/* ---------------------------------------------------------------- * FILE * slaves.h * * DESCRIPTION * macros and definitions for parallel backends * * NOTES * * IDENTIFICATION * $Header: /faerie/aoki/postgres/src/backend/tcop/RCS/slaves.h,v 1.10 1992/01/21 16:40:47 hong Exp aoki $ * ---------------------------------------------------------------- */ #ifndef SlavesIncluded #define SlavesIncluded #include "utils/rel.h" #include "nodes/plannodes.h" #include "executor/execshmem.h" extern int MyPid; #define IsMaster (MyPid == -1) extern int ParallelExecutorEnableState; #define ParallelExecutorEnabled() ParallelExecutorEnableState extern int NumberSlaveBackends; #define GetNumberSlaveBackends() NumberSlaveBackends /* slave info will stay in shared memory */ struct slaveinfo { int unixPid; /* the unix process id -- for sending signals */ int groupId; /* Id of the process group this slave belongs to */ int groupPid; /* virtual pid within the process group */ bool isAddOnSlave; /* true if is add-on slave */ bool isDone; /* true if slave has finished task and is waiting for others to finish */ Relation resultTmpRelDesc; /* the reldesc of the tmp relation that holds the result of this slave backend */ int curpage; /* current page being scanned: for communication with master */ #ifdef HAS_TEST_AND_SET slock_t lock; /* mutex lock for comm. with master */ #endif }; typedef struct slaveinfo SlaveInfoData; typedef SlaveInfoData *SlaveInfo; extern SlaveInfo SlaveInfoP; struct slavelocalinfo { int nparallel; /* degree of parallelism */ int startpage; /* heap scan starting page number */ bool paradjpending; /* parallelism adjustment pending */ int paradjpage; /* page on which to adjust parallelism */ int newparallel; /* new page skip */ bool isworking; /* true if the slave is working */ HeapScanDesc heapscandesc; /* heap scan descriptor */ IndexScanDesc indexscandesc; /* index scan descriptor */ }; typedef struct slavelocalinfo SlaveLocalInfoData; extern SlaveLocalInfoData SlaveLocalInfoD; typedef enum { IDLE, FINISHED, WORKING, PARADJPENDING } ProcGroupStatus; /* pgroupinfo will stay in shared memory */ struct pgroupinfo { ProcGroupStatus status; /* status of the process group */ List queryDesc; /* querydesc for the process group */ int countdown; /* countdown of # of proc in progress */ int nprocess; /* # of processes in group */ SharedCounter scounter; /* a shared counter for sync purpose */ SharedCounter dropoutcounter; /* a counter for drop out slaves */ M1Lock m1lock; /* one producer multiple consumer lock for comm. */ int paradjpage; /* page on which to adjust parallelism */ int newparallel; /* new page skip */ }; typedef struct pgroupinfo ProcGroupInfoData; typedef ProcGroupInfoData *ProcGroupInfo; extern ProcGroupInfo ProcGroupInfoP; /* the following structs will be kept in master's memory only */ struct procnode { int pid; struct procnode *next; }; typedef struct procnode ProcessNode; extern int NumberOfFreeSlaves; struct lpgroupinfo { int id; Fragment fragment; ProcessNode *memberProc; MemoryHeader groupSMQueue; struct lpgroupinfo *nextfree; List resultTmpRelDescList; }; typedef struct lpgroupinfo ProcGroupLocalInfoData; typedef ProcGroupLocalInfoData *ProcGroupLocalInfo; extern ProcGroupLocalInfo ProcGroupLocalInfoP; struct schedulinginfo { int ioBoundGroupId; Fragment ioBoundFrag; int cpuBoundGroupId; Fragment cpuBoundFrag; }; typedef struct schedulinginfo MasterSchedulingInfoData; #define SIGPARADJ SIGUSR1 #define NULLPAGE -1 #define NOPARADJ -2 typedef enum {INTRA_ONLY, INTER_W_ADJ, INTER_WO_ADJ} ParallelismModes; /* slaves.c */ extern void SendAbortSignals ARGS((void)); extern void SlaveRestart ARGS((void)); extern void SlaveBackendsAbort ARGS((void)); extern void SlaveMain ARGS((void)); extern void MoveTransactionState ARGS((void)); extern void SlaveBackendsInit ARGS((void)); extern int getFreeSlave ARGS((void)); extern void freeSlave ARGS((int i)); extern int getFreeProcGroup ARGS((int nproc)); extern void addSlaveToProcGroup ARGS((int slave, int group, int groupid)); extern void freeProcGroup ARGS((int gid)); extern int getFinishedProcGroup ARGS((void)); extern void wakeupProcGroup ARGS((int groupid)); extern void signalProcGroup ARGS((int groupid, int sig)); extern void ProcGroupSMBeginAlloc ARGS((int groupid)); extern void ProcGroupSMEndAlloc ARGS((void)); extern char *ProcGroupSMAlloc ARGS((int size)); extern void ProcGroupSMClean ARGS((int groupid)); extern void SlaveTmpRelDescInit ARGS((void)); extern char *SlaveTmpRelDescAlloc ARGS((int size)); extern int getProcGroupMaxPage ARGS((int groupid)); extern int paradj_handler ARGS((void)); extern int paradj_nextpage ARGS((int page, int dir)); #endif /* slavesIncluded */ @ 1.10 log @added some definitions @ text @d11 1 a11 1 * $Header: RCS/slaves.h,v 1.9 91/11/11 23:08:35 hong Exp Locker: hong $ d17 1 a111 25 /* slaves.c */ void SendAbortSignals ARGS((void )); void SlaveRestart ARGS((void )); void SlaveBackendsAbort ARGS((void )); void SlaveMain ARGS((void )); void MoveTransactionState ARGS((void )); void SlaveBackendsInit ARGS((void )); int getFreeSlave ARGS((void )); void freeSlave ARGS((int i )); int getFreeProcGroup ARGS((int nproc )); void addSlaveToProcGroup ARGS((int slave , int group , int groupid )); void freeProcGroup ARGS((int gid )); int getFinishedProcGroup ARGS((void )); void wakeupProcGroup ARGS((int groupid )); void signalProcGroup ARGS((int groupid , int sig )); void ProcGroupSMBeginAlloc ARGS((int groupid )); void ProcGroupSMEndAlloc ARGS((void )); char *ProcGroupSMAlloc ARGS((int size )); void ProcGroupSMClean ARGS((int groupid )); void SlaveTmpRelDescInit ARGS((void )); char *SlaveTmpRelDescAlloc ARGS((int size )); int getProcGroupMaxPage ARGS((int groupid )); int paradj_handler ARGS((void )); int paradj_nextpage ARGS((int page , int dir )); d119 26 a144 1 #endif TcopIncluded @ 1.9 log @clean up for prototyping to work @ text @d11 1 a11 1 * $Header: RCS/slaves.h,v 1.8 91/11/11 21:24:42 glass Exp Locker: hong $ d103 8 d140 2 @ 1.8 log @now uses execshmem.h @ text @d11 1 a11 1 * $Header: RCS/slaves.h,v 1.7 91/11/09 09:52:59 hong Exp Locker: glass $ d102 25 a126 15 extern int getFreeProcGroup(); extern void addSlaveToProcGroup(); extern int getFinishedProcGroup(); extern void freeProcGroup(); extern void freeSlave(); extern void wakeupProcGroup(); extern void signalProcGroup(); extern void ProcGroupSMBeginAlloc(); extern void ProcGroupSMEndAlloc(); extern char *ProcGroupSMAlloc(); extern void ProcGroupSMClean(); extern void SlaveTmpRelDescInit(); extern char *SlaveTmpRelDescAlloc(); extern int getProcGroupMaxPage(); extern int paradj_nextpage(); @ 1.7 log @changes in data structure for adjustment of parallelism @ text @d11 1 a11 1 * $Header: RCS/slaves.h,v 1.6 91/10/09 14:51:32 hong Exp $ d19 1 a19 1 #include "executor/x_shmem.h" @ 1.6 log @added field to SlaveInfoData @ text @d11 1 a11 1 * $Header: RCS/slaves.h,v 1.5 91/10/08 01:10:43 hong Exp Locker: hong $ a28 14 struct mastercommunicationdata { long data[2]; /* long for now, may be replaced by some union */ M1Lock m1lock; /* one producer multiple consumer lock */ }; typedef struct mastercommunicationdata MasterCommunicationData; struct slavecommunicationdata { long data; /* long for now, may be replaced by some union */ #ifdef HAS_TEST_AND_SET slock_t lock; /* mutex lock */ #endif }; typedef struct slavecommunicationdata SlaveCommunicationData; d43 5 a47 1 SlaveCommunicationData comdata; /* communication data area */ d66 1 d69 1 a69 2 enum { IDLE, FINISHED, WORKING } status; /* status of the process group */ d73 5 a77 3 #ifdef sequent slock_t lock; /* for synchronization when dec. countdown */ #endif d97 1 d106 1 d116 1 @ 1.5 log @added a new field isworking to SlaveLocalInfoData @ text @d11 1 a11 1 * $Header: RCS/slaves.h,v 1.4 91/08/25 13:32:38 hong Exp $ d52 2 d124 3 @ 1.4 log @changed data structures to support dynamce parallelism adjustment @ text @d11 1 a11 1 * $Header: RCS/slaves.h,v 1.3 91/07/24 16:12:08 hong Exp Locker: hong $ d67 1 @ 1.3 log @added declarations for new routines for a specialized shared memory allocator for the proces groups @ text @d11 1 a11 1 * $Header: RCS/slaves.h,v 1.2 91/07/17 23:48:30 hong Exp $ d29 14 d51 1 d55 1 d61 12 d79 1 a99 1 int nmembers; d107 1 d111 1 d118 3 @ 1.2 log @changes, new data structures and functions to support inter-fragment and inter-query parallelism @ text @d11 1 a11 1 * $Header: RCS/slaves.h,v 1.1 90/09/10 20:42:23 hong Exp Locker: hong $ d19 1 d26 2 d72 1 d82 6 @ 1.1 log @Initial revision @ text @d11 1 a11 1 * $Header: $ d17 2 d21 57 a77 1 #define IsMaster (MyPid == 0) @