
/* $Id: tevmac.h,v 1.7 1998/03/04 18:54:26 pvmsrc Exp $ */

/*
 *         PVM version 3.4:  Parallel Virtual Machine System
 *               University of Tennessee, Knoxville TN.
 *           Oak Ridge National Laboratory, Oak Ridge TN.
 *                   Emory University, Atlanta GA.
 *      Authors:  J. J. Dongarra, G. E. Fagg, M. Fischer
 *          G. A. Geist, J. A. Kohl, R. J. Manchek, P. Mucci,
 *         P. M. Papadopoulos, S. L. Scott, and V. S. Sunderam
 *                   (C) 1997 All Rights Reserved
 *
 *                              NOTICE
 *
 * Permission to use, copy, modify, and distribute this software and
 * its documentation for any purpose and without fee is hereby granted
 * provided that the above copyright notice appear in all copies and
 * that both the copyright notice and this permission notice appear in
 * supporting documentation.
 *
 * Neither the Institutions (Emory University, Oak Ridge National
 * Laboratory, and University of Tennessee) nor the Authors make any
 * representations about the suitability of this software for any
 * purpose.  This software is provided ``as is'' without express or
 * implied warranty.
 *
 * PVM version 3 was funded in part by the U.S. Department of Energy,
 * the National Science Foundation and the State of Tennessee.
 */

/*
 *	tevmac.h
 *
 *	Tracing defs.
 *
$Log: tevmac.h,v $
 * Revision 1.7  1998/03/04  18:54:26  pvmsrc
 * Oops...  better initialize pvmampushed to 0 in TEV_DECL.
 * 	- otherwise, TEV_AMPUSHED might reference it before set...  :-Q
 * (Spanker=kohl)
 *
 * Revision 1.6  1997/12/23  20:24:43  pvmsrc
 * Added new TEV_PUSHTOP, TEV_AMPUSHED and TEV_POPTOP macros.
 * 	- to fake top level tracing, i.e. "push" the current tracing
 * 		depth and turn on full tracing again (until next "pop").
 * 	- for things like message handler functions whose whole existence
 * 		is inside another PVM call.
 * Renamed "xamtraced" local trace var (TEV_DECLS).
 * 	-> "pvmamtraced", no chance of name clashes... (ha ha)
 * (Spanker=kohl)
 *
 * Revision 1.5  1997/06/25  22:11:13  pvmsrc
 * Markus adds his frigging name to the author list of
 * 	every file he ever looked at...
 *
 * Revision 1.4  1997/04/30  21:33:25  pvmsrc
 * SGI Compiler Warning Cleanup.
 * 	- stupid ##@%&@(...  made explicit boolean expressions out of
 * 		assignments inside TEV_EXCLUSIVE conditional.  :-Q
 *
 * Revision 1.3  1997/01/28  19:28:35  pvmsrc
 * New Copyright Notice & Authors.
 *
 * Revision 1.2  1996/10/24  21:49:50  pvmsrc
 * Modified for New Tracing Facility:
 * 	- added new struct pvmtrcencvec for trace event packing.
 * 	- modified tracing macros:
 * 		* TEV_DO_TRACE() requires 2 args now, kind & entry_exit.
 * 		* TEV_FIN(), tev_fin() now requires no args.
 * 		* TEV_DECLS, no need for xtrcbuf, xtrcsbf now.
 * 	- added TEV_PACK_*() macros for trace event contents,
 * 		for performance, uses enc_*() routines directly.
 *
 * Revision 1.1  1996/09/23  23:43:37  pvmsrc
 * Initial revision
 *
 * Revision 1.1  1994/06/03  20:38:32  manchek
 * Initial revision
 *
 */


/*****************************
 **  Internal Trace Structs **
 **                         **
 *****************************/

struct pvmtrcencvec {
	int (*enc_byte)();
	int (*enc_cplx)();
	int (*enc_dcplx)();
	int (*enc_double)();
	int (*enc_float)();
	int (*enc_int)();
	int (*enc_uint)();
	int (*enc_long)();
	int (*enc_ulong)();
	int (*enc_short)();
	int (*enc_ushort)();
	int (*enc_str)();
};


void tev_init();
void tev_flush();


/*****************************
 **  Internal Trace Macros  **
 **                         **
 *****************************/

/* to check that task is connected without a function call */

#define	BEATASK	( pvmmytid == -1 ? pvmbeatask() : 0 )

/* check tracing on event kind */

#define TEV_CHECK_TRACE( _kind ) \
	( !BEATASK && pvmtrc.trctid > 0 && pvmtrc.trctid != pvmmytid \
		&& TEV_MASK_CHECK( pvmtrc.tmask, _kind ) )

/* check tracing and generate start message */

#define	TEV_DO_TRACE( _kind, _entry_exit ) \
	( TEV_CHECK_TRACE( _kind ) && tev_begin( _kind, _entry_exit ) )

#define	TEV_FIN	tev_fin()

#define	TEV_DECLS		int pvmamtraced; \
						int pvmampushed = 0; \
						int pvmtoplvlsave;

#define	TEV_EXCLUSIVE	( (pvmamtraced = pvmtoplvl) != 0 \
							&& (pvmtoplvl = 0) == 0 )
#define	TEV_AMEXCL		pvmamtraced
#define	TEV_ENDEXCL		( pvmtoplvl = pvmamtraced )

#define TEV_PUSHTOP		( pvmtoplvlsave = pvmtoplvl, pvmtoplvl = 1, \
							pvmampushed = 1 )
#define TEV_AMPUSHED	pvmampushed
#define TEV_POPTOP		( pvmtoplvl = pvmtoplvlsave, pvmampushed = 0 )

/* packing macros */

#define TEV_PACK_BYTE( _did, _array, _datap, _cnt, _std ) \
	(pvmtrccodef->enc_byte)( _did, _array, \
		(void *)(_datap), _cnt, _std )

#define TEV_PACK_CPLX( _did, _array, _datap, _cnt, _std ) \
	(pvmtrccodef->enc_cplx)( _did, _array, \
		(void *)(_datap), _cnt, _std )

#define TEV_PACK_DCPLX( _did, _array, _datap, _cnt, _std ) \
	(pvmtrccodef->enc_dcplx)( _did, _array, \
		(void *)(_datap), _cnt, _std )

#define TEV_PACK_DOUBLE( _did, _array, _datap, _cnt, _std ) \
	(pvmtrccodef->enc_double)( _did, _array, \
		(void *)(_datap), _cnt, _std )

#define TEV_PACK_FLOAT( _did, _array, _datap, _cnt, _std ) \
	(pvmtrccodef->enc_float)( _did, _array, \
		(void *)(_datap), _cnt, _std )

#define TEV_PACK_INT( _did, _array, _datap, _cnt, _std ) \
	(pvmtrccodef->enc_int)( _did, _array, \
		(void *)(_datap), _cnt, _std )

#define TEV_PACK_UINT( _did, _array, _datap, _cnt, _std ) \
	(pvmtrccodef->enc_uint)( _did, _array, \
		(void *)(_datap), _cnt, _std )

#define TEV_PACK_LONG( _did, _array, _datap, _cnt, _std ) \
	(pvmtrccodef->enc_long)( _did, _array, \
		(void *)(_datap), _cnt, _std )

#define TEV_PACK_ULONG( _did, _array, _datap, _cnt, _std ) \
	(pvmtrccodef->enc_ulong)( _did, _array, \
		(void *)(_datap), _cnt, _std )

#define TEV_PACK_SHORT( _did, _array, _datap, _cnt, _std ) \
	(pvmtrccodef->enc_short)( _did, _array, \
		(void *)(_datap), _cnt, _std )

#define TEV_PACK_USHORT( _did, _array, _datap, _cnt, _std ) \
	(pvmtrccodef->enc_ushort)( _did, _array, \
		(void *)(_datap), _cnt, _std )

#define TEV_PACK_STRING( _did, _array, _datap, _cnt, _std ) \
	(pvmtrccodef->enc_str)( _did, _array, \
		(void *)(_datap), _cnt, _std )

