
/* $Id: tevmac.h,v 1.5 1997/06/25 22:11:13 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.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 xamtraced;
#define	TEV_EXCLUSIVE	( (xamtraced = pvmtoplvl) != 0 \
							&& (pvmtoplvl = 0) == 0 )
#define	TEV_AMEXCL		xamtraced
#define	TEV_ENDEXCL		(pvmtoplvl = xamtraced)

/* 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 )

