/*
 * Copyright (c) 2001-2002 The Trustees of Indiana University.  
 *                         All rights reserved.
 * Copyright (c) 1998-2001 University of Notre Dame. 
 *                         All rights reserved.
 * Copyright (c) 1994-1998 The Ohio State University.  
 *                         All rights reserved.
 * 
 * This file is part of the LAM/MPI software package.  For license
 * information, see the LICENSE file in the top level directory of the
 * LAM/MPI source distribution.
 * 
 * $HEADER$
 *
 *	$Id: preq.h,v 6.11 2003/03/10 18:05:27 brbarret Exp $
 *
 *	Function:	- constants and templates for the
 *			  process control server (aka kenya)
 *			- based on Trollius 2.0 Copyright 1990
 *			  The Ohio State University and Cornell
 *			  Research Foundation
 */

#ifndef _PREQ
#define _PREQ

#include "kio.h"
#include "kreq.h"
#include "portable.h"

/*
 * Events recogized by the kenyad
 */
#define PQCREATE	1			/* create a process in place */
#define PQDOOM		2			/* doom a process */
#define PQSTATE		3			/* find state of a process */
#define PQSPAWN		4			/* spawn an existing process */
#define PQDETACH	5			/* detach an existing process */
#define PQATTACH	6			/* attach an existing process */
#define PQDEATHNOTICE   7                       /* The kenyad signal
                                                 *  handler got a
                                                 *  SIGCHLD, and sent
                                                 *  us a report.
                                                 *  SHOULD NOT BE USED
                                                 *  OUTSIDE THE KENYAD
                                                 *  AND ITS SIGNAL
                                                 *  HANDLER FOR
                                                 *  SIGCHLD! 
						 */
#define PREQS		7			/* number of kenya requests */

#ifndef NOTPROCESS
#define NOTPROCESS	0x80000000
#endif
#define NOTSTATUS	0x80000000
#define PSMAXNAME	256
#define PMAX		256

/*
 * process request selection flags
 */
#define SELECT_PID	0x01
#define SELECT_INDEX	0x02
#define SELECT_MPI	0x04
#define SELECT_ALL	0x10
#define SELECT_SYS	0x20
#define SELECT_APPL	0x40

/*
 * exit status handling
 */
#define _LAM_WIFSIGNALED	0x10000
#define _LAM_WIFNODETACH	0x20000
#define LAM_WIFSIGNALED(s)	((s) & _LAM_WIFSIGNALED)
#define LAM_WIFNODETACH(s)	((s) & _LAM_WIFNODETACH)
#define LAM_WTERMSIG(s)		((s) & 0xFFFF)
#define LAM_WEXITSTATUS(s)	LAM_WTERMSIG(s)

/*
 * kenyad request
 */
struct preq {
	int4		pq_src_node;
	int4		pq_src_event;
	int4		pq_req;
	int4		pq_sel_method;		/* process selection method */
	int4		pq_sel_value;		/* process selection value */
	int4		pq_loadpt;		/* load module flat tag */
	int4		pq_rtf;			/* process runtime flags */
	int4		pq_status;		/* exit status */
	int4		pq_signal;		/* deliver these signals */
	int4		pq_maxproc;		/* limit processes affected */
#define pq_rank		pq_maxproc		/* process rank (-1 if none) */
	int4		pq_argv;		/* argument/env structure tag */
	int4		pq_envsize;		/* size of environemnt */
	int4		pq_nodeid;		/* spawn target nodeid */
	int4		pq_pid;			/* detach this process ID */
	struct jobid_t	pq_jobid;		/* job identifier */
	int4		pq_stdin;		/* std input desc. */
	int4		pq_stdout;		/* std output desc. */
	int4		pq_stderr;		/* std error desc. */
	int4		pq_world;		/* world population */
	int4		pq_parent;		/* parent group population */
	char		pq_name[PSMAXNAME];	/* program name */
	char		pq_wrkdir[LAM_PATH_MAX];/* program working dir */
};

/*
 * kenyad reply
 */
struct preply {
	int4		pr_reply;
	int4		pr_pid;			/* kenyad process ID */
	int4		pr_index;		/* created process index */
	int4		pr_nodeid;		/* kenyad node ID */
};

/*
 * kenayd process descriptor
 */
struct pprocess {
	int4		p_pid;
	char		*p_loadpt;
	int4		p_argc;
	char		**p_argv;
	int4		p_rtf;
	struct jobid_t	p_jobid;
	int4		p_nodeid;		/* parent node ID */
	int4		p_event;		/* parent's reply event */
	int4		p_status;
};

/*
 * kenyad reply for the PQSTATE request
 */
struct pstate {
	int4		ps_reply;
	int4		ps_index;
	int4		ps_pid;
	int4		ps_rtf;
	int4		ps_nodeid;
	int4		ps_event;
	struct kstatus	ps_kernel;
	char		ps_name[PSMAXNAME];
	char		ps_loadpt[PSMAXNAME];
};

/*
 * kenyad process environment
 */
struct penv {
	int4		pe_rank;
	char		**pe_envv;
	char		pe_wrkdir[LAM_PATH_MAX];
};

#ifdef __cplusplus
extern "C" {
#endif

extern int		lpattach(const char *name);
extern int		lpdetach(int pid, int status);
extern int		rpcreate(int4 node, const char *file, int4 rtf,
					char **argv, int4 *pid, int4 *idx);
extern int		rpcreatev(int4 node, const char *file, int4 rtf,
					char **argv, struct penv *env,
    					int4 *pid, int4 *idx);
extern int		rpdoom(int4 node, int4 sflags,
					int4 svalue, int4 signal);
extern int		rpgo(int4 node, int4 loadtag, int4 rtf,
					int4 arvtag, int4 *pid, int4 *idx);
extern int		rpgov(int4 node, int4 loadtag, int4 rtf,
					int4 arvtag, int4 envsize, char *wrkdir,
    					int4 rank, int4 *pid, int4 *idx);
extern int		rploadgo(int4 srcnode, int4 destnode,
					const char *file, int4 rtf,
					char **argv, int4 *pid, int4 *idx);
extern int		rploadgov(int4 srcnode, int4 destnode,
					const char *file, int4 rtf,
					char **argv, struct penv *envv,
    					int4 *pid, int4 *idx);
extern int		rpspawn(int4 srcnode, int4 destnode,
					int4 sflags, int4 sval, char **argv,
					int4 *pid, int4 *idx);
extern int		rpwait(int4 *node, int *pid, int *status);
extern int4		rpstate(int4 node, int4 sflags, int4 sval,
					struct pstate *table, int4 maxproc);

#ifdef __cplusplus
}
#endif

#endif


syntax highlighted by Code2HTML, v. 0.9.1