/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2003 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. */ #ifndef PROCESS_H_INCLUDED #define PROCESS_H_INCLUDED #include /* Data structures and routines for managing process The data structures for managing processes following the hierarchy implied by MPI-2 design, particularly the ":" syntax of mpiexec and the arguments to MPI_Comm_spawn_multiple. From the top, we have: ProcessUniverse - All processes, consisting of a list of ProcessWorld ProcessWorld - All processes in an MPI_COMM_WORLD, containing an list of apps (corresponding to the MPI_APPNUM attribute) ProcessApp - A group of processes sharing the same executable command line, and other parameters (such as working dir), and an array of process descriptions ProcessState - Information for a specific process, including host, pid, MPI rank, and state ProcessExitStatus - exit status The I/O for processes is handled separately. I/O handlers for each fd include an "extra-data" pointer that can store pointers to the process structures as necessary. */ /* ProcessSoftSpec is the "soft" specification of desired processor counts. Format is in pseudo BNF: soft -> element[,element] element -> number | range range -> number:number[:number] These are stored as 3 element tuples containing first:last:stride. A single number is first:first:1, e.g., 17 is represented as 17:17:1. */ typedef struct { int nelm; /* Number of tuples */ int (*tuples)[3]; /* The tuples (allocated) */ } ProcessSoftSpec; /* Record the return value from each process */ typedef enum { EXIT_NOTYET, /* Not exited */ EXIT_NORMAL, /* Normal exit (possibly with nonzero status)*/ EXIT_SIGNALLED, /* Process died on an uncaught signal (e.g., SIGSEGV) */ EXIT_NOFINALIZE, /* Process exited without calling finalize */ EXIT_ABORTED, /* Process killed by mpiexec after a PMI abort */ EXIT_KILLED /* Process was killed by mpiexec */ } ProcessExitState_t; typedef enum { PROCESS_UNINITIALIZED=-1, /* Before process created */ PROCESS_ALIVE, /* Process is (expected to be) alive */ PROCESS_COMMUNICATING, /* Process is alive and using PMI */ PROCESS_FINALIZED, /* Process is alive but has indicated that it has called PMI_Finalize */ /*PROCESS_EXITING, */ /* Process expected to exit */ PROCESS_GONE /* Process has exited and its status collected */ } ProcessStatus_t; typedef struct { ProcessExitState_t exitReason; /* how/why did the process exit */ int exitSig; /* exit signal, if any */ int exitStatus; /* exit statue */ int exitOrder; /* indicates order in which processes exited */ } ProcessExitStatus; typedef struct ProcessState { const char *hostname; /* Host for process */ int wRank; /* Rank in COMM_WORLD */ int id; /* An integer used to identify process entries */ pid_t pid; /* pid for process */ int initWithEnv; /* true if PMI_FD, PMI_RANK etc. passed to process to initialize PMI connection */ ProcessStatus_t status; /* what state the process is in */ ProcessExitStatus exitStatus; /* Exit status */ struct ProcessApp *app; /* Pointer to "parent" app */ } ProcessState; typedef struct ProcessApp { int myAppNum; /* Appnum of this group */ const char *exename; /* Executable to run */ const char *arch; /* Architecture type */ const char *path; /* Search path for executables */ const char *wdir; /* Working directory */ const char *hostname; /* Default host (can be overridden by each process in an App) */ const char **args; /* Pointer into the array of args */ int nArgs; /* Number of args (list is *not* null terminated) */ struct EnvInfo *env; /* Pointer to structure providing information on the process environment variables for this app */ ProcessSoftSpec soft; /* "soft" spec, if any */ int nProcess; /* Number of processes in this app */ ProcessState *pState; /* Array of process states */ struct ProcessWorld *pWorld; /* World containing this app */ struct ProcessApp *nextApp; /* Next App */ } ProcessApp; typedef struct ProcessWorld { int nApps; /* Number of Apps in this world */ int nProcess; /* Number of processes in this world */ int worldNum; /* Number of this world; initial world is 0 */ struct EnvInfo *genv; /* Pointer to structure providing information on the process environment variables for this world */ ProcessApp *apps; /* Array of Apps */ struct ProcessWorld *nextWorld; } ProcessWorld; typedef struct ProcessUniverse { ProcessWorld *worlds; int nWorlds; /* Number of worlds */ int size; /* Universe size */ int nLive; /* Number of live processes */ int (*OnNone)(void); /* Routine to call when nLive == 0 */ int timeout; /* Timeout in seconds (-1 for none) */ int giveExitInfo; /* True if info on error exit should be printed to stderr */ char *portName; /* Contact name for a port for PMI, if used (null otherwise) (valid port number, as a string) */ char *portRange; /* Character string defining a range of valid ports */ int fromSingleton; /* Set to true if this universe was created from a singleton init */ int singletonPort; /* Port number for singleton */ char *singletonIfname; /* Network interface name of the singleton's port (usually hostname) */ char *portKey; /* Option key for confirming the singleton init port */ pid_t singletonPID; /* PID of singleton inti process */ } ProcessUniverse; /* There is only one universe */ extern ProcessUniverse pUniv; /* Function prototypes */ int MPIE_ForkProcesses( ProcessWorld *, char *[], int (*)(void*,ProcessState*), void *, int (*)(void*,void*,ProcessState*), void *, int (*)(void*,void*,ProcessState*), void * ); int MPIE_ExecProgram( ProcessState *, char *[] ); ProcessState *MPIE_FindProcessByPid( pid_t ); void MPIE_ProcessInit( void ); void MPIE_SetupSigChld( void ); int MPIE_ProcessGetExitStatus( int * ); void MPIE_ProcessSetExitStatus( ProcessState *, int ); int MPIE_InitWorldWithSoft( ProcessWorld *, int ); void MPIE_PrintFailureReasons( FILE * ); int MPIE_WaitForProcesses( ProcessUniverse *, int ); int MPIE_OnAbend( ProcessUniverse * ); int MPIE_SetupSingleton( ProcessUniverse * ); int MPIE_HasAbended(void); int MPIE_SignalWorld( ProcessWorld *, int ); int MPIE_KillWorld( ProcessWorld * ); int MPIE_KillUniverse( ProcessUniverse * ); int MPIE_ForwardSignal( int ); int MPIE_ForwardCommonSignals( void ); void MPIE_IgnoreSigPipe( void ); /* Currently, parse soft spec is in cmnargs */ int MPIE_ParseSoftspec( const char *, ProcessSoftSpec * ); /* This routine may be called to make information available for a debugger */ int MPIE_InitForDebugger( ProcessWorld * ); int MPIE_FreeFromDebugger( void ); int MPIE_PrintDebuggerInfo( FILE * ); /* Set the processor affinity to the processor with the given rank */ int MPIE_SetProcessorAffinity( int, int ); #endif