Blame src/papi_fwrappers.c

Packit 577717
/****************************/
Packit 577717
/* THIS IS OPEN SOURCE CODE */
Packit 577717
/****************************/
Packit 577717
Packit 577717
/* 
Packit 577717
* File:    papi_fwrappers.c
Packit 577717
* Author:  Philip Mucci
Packit 577717
*          mucci@cs.utk.edu
Packit 577717
* Mods:    Nils Smeds
Packit 577717
*          smeds@pdc.kth.se
Packit 577717
*          Anders Nilsson
Packit 577717
*          anni@pdc.kth.se
Packit 577717
*	   Kevin London
Packit 577717
*	   london@cs.utk.edu
Packit 577717
*	   dan terpstra
Packit 577717
*	   terpstra@cs.utk.edu
Packit 577717
*          Min Zhou
Packit 577717
*	   min@cs.utk.edu
Packit 577717
*/
Packit 577717
Packit 577717
#pragma GCC visibility push(default)
Packit 577717
Packit 577717
#include <stdio.h>
Packit 577717
#include <assert.h>
Packit 577717
#include <string.h>
Packit 577717
#include "papi.h"
Packit 577717
Packit 577717
/* Lets use defines to rename all the files */
Packit 577717
Packit 577717
#ifdef FORTRANUNDERSCORE
Packit 577717
#define PAPI_FCALL(function,caps,args) void function##_ args
Packit 577717
#elif FORTRANDOUBLEUNDERSCORE
Packit 577717
#define PAPI_FCALL(function,caps,args) void function##__ args
Packit 577717
#elif FORTRANCAPS
Packit 577717
#define PAPI_FCALL(function,caps,args) void caps args
Packit 577717
#else
Packit 577717
#define PAPI_FCALL(function,caps,args) void function args
Packit 577717
#endif
Packit 577717
Packit 577717
/* Many Unix systems passes Fortran string lengths as extra arguments */
Packit 577717
#if defined(_AIX) || defined(sun) || defined(linux)
Packit 577717
#define _FORTRAN_STRLEN_AT_END
Packit 577717
#endif
Packit 577717
/* The Low Level Wrappers */
Packit 577717
Packit 577717
/** \internal @defgroup PAPIF PAPI Fortran API */
Packit 577717
Packit 577717
/* helper routine to convert Fortran strings to C strings */
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
static void Fortran2cstring( char *cstring, char *Fstring, int clen , int Flen )
Packit 577717
{
Packit 577717
	int slen, i;
Packit 577717
Packit 577717
	/* What is the maximum number of chars to copy ? */
Packit 577717
	slen = Flen < clen ? Flen : clen;
Packit 577717
	strncpy( cstring, Fstring, ( size_t ) slen );
Packit 577717
Packit 577717
	/* Remove trailing blanks from initial Fortran string */
Packit 577717
	for ( i = slen - 1; i > -1 && cstring[i] == ' '; cstring[i--] = '\0' );
Packit 577717
Packit 577717
	/* Make sure string is NULL terminated */
Packit 577717
	cstring[clen - 1] = '\0';
Packit 577717
	if ( slen < clen )
Packit 577717
		cstring[slen] = '\0';
Packit 577717
}
Packit 577717
#endif
Packit 577717
Packit 577717
/**	@class PAPIF_accum
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief accumulate and reset counters in an event set 
Packit 577717
 *	
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_accum( C_INT EventSet, C_LONG_LONG(*) values, C_INT  check )
Packit 577717
 *
Packit 577717
 *	@see PAPI_accum
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_accum, PAPIF_ACCUM,
Packit 577717
			( int *EventSet, long long *values, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_accum( *EventSet, values );
Packit 577717
}
Packit 577717
Packit 577717
/**	@class PAPIF_add_event
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief add PAPI preset or native hardware event to an event set
Packit 577717
 *	
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_add_event( C_INT EventSet, C_INT EventCode, C_INT check )
Packit 577717
 *
Packit 577717
 *	@see PAPI_add_event
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_add_event, PAPIF_ADD_EVENT,
Packit 577717
			( int *EventSet, int *Event, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_add_event( *EventSet, *Event );
Packit 577717
}
Packit 577717
Packit 577717
/**	@class PAPIF_add_named_event
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief add PAPI preset or native hardware event to an event set by name
Packit 577717
 *	
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_add_named_event( C_INT EventSet, C_STRING EventName, C_INT check )
Packit 577717
 *
Packit 577717
 *	@see PAPI_add_named_event
Packit 577717
 */
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
PAPI_FCALL( papif_add_named_event, PAPIF_ADD_NAMED_EVENT,
Packit 577717
			( int *EventSet, char *EventName, int *check, int Event_len ) )
Packit 577717
{
Packit 577717
	char tmp[PAPI_MAX_STR_LEN];
Packit 577717
	Fortran2cstring( tmp, EventName, PAPI_MAX_STR_LEN, Event_len );
Packit 577717
	*check = PAPI_add_named_event( *EventSet, tmp );	
Packit 577717
}
Packit 577717
#else
Packit 577717
PAPI_FCALL( papif_add_named_event, PAPIF_ADD_NAMED_EVENT,
Packit 577717
			( int *EventSet, char *EventName, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_add_named_event( *EventSet, EventName );
Packit 577717
}
Packit 577717
#endif
Packit 577717
Packit 577717
/**	@class PAPIF_add_events
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief add multiple PAPI presets or native hardware events to an event set
Packit 577717
 *	
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_add_events( C_INT EventSet, C_INT(*) EventCodes, C_INT number, C_INT  check )
Packit 577717
 *
Packit 577717
 *	@see PAPI_add_events
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_add_events, PAPIF_ADD_EVENTS,
Packit 577717
			( int *EventSet, int *Events, int *number, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_add_events( *EventSet, Events, *number );
Packit 577717
}
Packit 577717
Packit 577717
/**	@class PAPIF_cleanup_eventset
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief empty and destroy an EventSet 
Packit 577717
 *	
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_cleanup_eventset( C_INT EventSet, C_INT check )
Packit 577717
 *
Packit 577717
 *	@see PAPI_cleanup_eventset
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_cleanup_eventset, PAPIF_CLEANUP_EVENTSET,
Packit 577717
			( int *EventSet, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_cleanup_eventset( *EventSet );
Packit 577717
}
Packit 577717
Packit 577717
/**	@class PAPIF_create_eventset
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief create a new empty PAPI EventSet 
Packit 577717
 *	
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_create_eventset( C_INT EventSet, C_INT check )
Packit 577717
 *
Packit 577717
 *	@see PAPI_create_eventset
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_create_eventset, PAPIF_CREATE_EVENTSET,
Packit 577717
			( int *EventSet, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_create_eventset( EventSet );
Packit 577717
}
Packit 577717
Packit 577717
/**	@class PAPIF_assign_eventset_component
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief assign a component index to an existing but empty EventSet 
Packit 577717
 *	
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_assign_eventset_component( C_INT EventSet, C_INT EventSet, C_INT check )
Packit 577717
 *
Packit 577717
 *	@see PAPI_assign_eventset_component
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_assign_eventset_component, PAPIF_ASSIGN_EVENTSET_COMPONENT,
Packit 577717
			( int *EventSet, int *cidx, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_assign_eventset_component( *EventSet, *cidx );
Packit 577717
}
Packit 577717
Packit 577717
/**	@class PAPIF_destroy_eventset
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief empty and destroy an EventSet 
Packit 577717
 *	
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_destroy_eventset( C_INT EventSet, C_INT check )
Packit 577717
 *
Packit 577717
 *	@see PAPI_destroy_eventset
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_destroy_eventset, PAPIF_DESTROY_EVENTSET,
Packit 577717
			( int *EventSet, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_destroy_eventset( EventSet );
Packit 577717
}
Packit 577717
Packit 577717
/**	@class PAPIF_get_dmem_info
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief get information about the dynamic memory usage of the current program 
Packit 577717
 *	
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_get_dmem_info( C_INT EventSet, C_INT check )
Packit 577717
 *
Packit 577717
 *	@see PAPI_get_dmem_info
Packit 577717
 */
Packit 577717
 /* XXX This looks totally broken. Should be passed all the members of the dmem_info struct. */
Packit 577717
PAPI_FCALL( papif_get_dmem_info, PAPIF_GET_DMEM_INFO,
Packit 577717
			( long long *dest, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_get_dmem_info( ( PAPI_dmem_info_t * ) dest );
Packit 577717
}
Packit 577717
Packit 577717
/**	@class PAPIF_get_exe_info
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief get information about the dynamic memory usage of the current program 
Packit 577717
 *	
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_get_exe_info( C_STRING fullname, C_STRING name, @n
Packit 577717
 *						C_LONG_LONG text_start,  C_LONG_LONG text_end, @n
Packit 577717
 *						C_LONG_LONG data_start,  C_LONG_LONG data_end, @n
Packit 577717
 *						C_LONG_LONG bss_start,   C_LONG_LONG bss_end, C_INT check )
Packit 577717
 *
Packit 577717
 *	@see PAPI_get_executable_info
Packit 577717
 */
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
PAPI_FCALL( papif_get_exe_info, PAPIF_GET_EXE_INFO,
Packit 577717
			( char *fullname, char *name, long long *text_start,
Packit 577717
			  long long *text_end, long long *data_start, long long *data_end,
Packit 577717
			  long long *bss_start, long long *bss_end,
Packit 577717
			  int *check, int fullname_len, int name_len ) )
Packit 577717
#else
Packit 577717
PAPI_FCALL( papif_get_exe_info, PAPIF_GET_EXE_INFO,
Packit 577717
			( char *fullname, char *name, long long *text_start,
Packit 577717
			  long long *text_end, long long *data_start, long long *data_end,
Packit 577717
			  long long *bss_start, long long *bss_end, int *check ) )
Packit 577717
#endif
Packit 577717
{
Packit 577717
	PAPI_option_t e;
Packit 577717
/* WARNING: The casts from caddr_t to long below WILL BREAK on systems with
Packit 577717
    64-bit addresses. I did it here because I was lazy. And because I wanted
Packit 577717
    to get rid of those pesky gcc warnings. If you find a 64-bit system,
Packit 577717
    conditionalize the cast with (yet another) #ifdef...
Packit 577717
*/
Packit 577717
	if ( ( *check = PAPI_get_opt( PAPI_EXEINFO, &e ) ) == PAPI_OK ) {
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
		int i;
Packit 577717
		strncpy( fullname, e.exe_info->fullname, ( size_t ) fullname_len );
Packit 577717
		for ( i = ( int ) strlen( e.exe_info->fullname ); i < fullname_len;
Packit 577717
			  fullname[i++] = ' ' );
Packit 577717
		strncpy( name, e.exe_info->address_info.name, ( size_t ) name_len );
Packit 577717
		for ( i = ( int ) strlen( e.exe_info->address_info.name ); i < name_len;
Packit 577717
			  name[i++] = ' ' );
Packit 577717
#else
Packit 577717
		strncpy( fullname, e.exe_info->fullname, PAPI_MAX_STR_LEN );
Packit 577717
		strncpy( name, e.exe_info->address_info.name, PAPI_MAX_STR_LEN );
Packit 577717
#endif
Packit 577717
		*text_start = ( long ) e.exe_info->address_info.text_start;
Packit 577717
		*text_end = ( long ) e.exe_info->address_info.text_end;
Packit 577717
		*data_start = ( long ) e.exe_info->address_info.data_start;
Packit 577717
		*data_end = ( long ) e.exe_info->address_info.data_end;
Packit 577717
		*bss_start = ( long ) e.exe_info->address_info.bss_start;
Packit 577717
		*bss_end = ( long ) e.exe_info->address_info.bss_end;
Packit 577717
	}
Packit 577717
}
Packit 577717
Packit 577717
/**	@class PAPIF_get_hardware_info 
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief get information about the system hardware
Packit 577717
 *	
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_get_hardware_info( C_INT ncpu, C_INT nnodes,  C_INT totalcpus,@n
Packit 577717
 *						C_INT vendor, C_STRING vendor_str, C_INT model, C_STRING model_str, @n
Packit 577717
 *						C_FLOAT revision, C_FLOAT mhz )
Packit 577717
 *
Packit 577717
 *	@see PAPI_get_hardware_info
Packit 577717
 */
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
PAPI_FCALL( papif_get_hardware_info, PAPIF_GET_HARDWARE_INFO, ( int *ncpu,
Packit 577717
																int *nnodes,
Packit 577717
																int *totalcpus,
Packit 577717
																int *vendor,
Packit 577717
																char
Packit 577717
																*vendor_str,
Packit 577717
																int *model,
Packit 577717
																char *model_str,
Packit 577717
																float *revision,
Packit 577717
																float *mhz,
Packit 577717
																int vendor_len,
Packit 577717
																int
Packit 577717
																model_len ) )
Packit 577717
#else
Packit 577717
PAPI_FCALL( papif_get_hardware_info, PAPIF_GET_HARDWARE_INFO, ( int *ncpu,
Packit 577717
																int *nnodes,
Packit 577717
																int *totalcpus,
Packit 577717
																int *vendor,
Packit 577717
																char
Packit 577717
																*vendor_string,
Packit 577717
																int *model,
Packit 577717
																char
Packit 577717
																*model_string,
Packit 577717
																float *revision,
Packit 577717
																float *mhz ) )
Packit 577717
#endif
Packit 577717
{
Packit 577717
	const PAPI_hw_info_t *hwinfo;
Packit 577717
	int i;
Packit 577717
	hwinfo = PAPI_get_hardware_info(  );
Packit 577717
	if ( hwinfo == NULL ) {
Packit 577717
		*ncpu = 0;
Packit 577717
		*nnodes = 0;
Packit 577717
		*totalcpus = 0;
Packit 577717
		*vendor = 0;
Packit 577717
		*model = 0;
Packit 577717
		*revision = 0;
Packit 577717
		*mhz = 0;
Packit 577717
	} else {
Packit 577717
		*ncpu = hwinfo->ncpu;
Packit 577717
		*nnodes = hwinfo->nnodes;
Packit 577717
		*totalcpus = hwinfo->totalcpus;
Packit 577717
		*vendor = hwinfo->vendor;
Packit 577717
		*model = hwinfo->model;
Packit 577717
		*revision = hwinfo->revision;
Packit 577717
		*mhz = hwinfo->cpu_max_mhz;
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
		strncpy( vendor_str, hwinfo->vendor_string, ( size_t ) vendor_len );
Packit 577717
		for ( i = ( int ) strlen( hwinfo->vendor_string ); i < vendor_len;
Packit 577717
			  vendor_str[i++] = ' ' );
Packit 577717
		strncpy( model_str, hwinfo->model_string, ( size_t ) model_len );
Packit 577717
		for ( i = ( int ) strlen( hwinfo->model_string ); i < model_len;
Packit 577717
			  model_str[i++] = ' ' );
Packit 577717
#else
Packit 577717
		(void)i; /* unused...  */
Packit 577717
		/* This case needs the passed strings to be of sufficient size *
Packit 577717
		 * and will include the NULL character in the target string    */
Packit 577717
		strcpy( vendor_string, hwinfo->vendor_string );
Packit 577717
		strcpy( model_string, hwinfo->model_string );
Packit 577717
#endif
Packit 577717
	}
Packit 577717
	return;
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_num_hwctrs
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *  @brief Return the number of hardware counters on the cpu.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_num_hwctrs( C_INT num )
Packit 577717
 *
Packit 577717
 * @see PAPI_num_hwctrs
Packit 577717
 * @see PAPI_num_cmp_hwctrs
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_num_hwctrs, PAPIF_num_hwctrs, ( int *num ) )
Packit 577717
{
Packit 577717
	*num = PAPI_num_hwctrs(  );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_num_cmp_hwctrs
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *  @brief Return the number of hardware counters on the specified component.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_num_cmp_hwctrs( C_INT cidx, C_INT num )
Packit 577717
 *
Packit 577717
 * @see PAPI_num_hwctrs
Packit 577717
 * @see PAPI_num_cmp_hwctrs
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_num_cmp_hwctrs, PAPIF_num_cmp_hwctrs,
Packit 577717
			( int *cidx, int *num ) )
Packit 577717
{
Packit 577717
	*num = PAPI_num_cmp_hwctrs( *cidx );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_get_real_cyc
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Get real time counter value in clock cycles.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_get_real_cyc( C_LONG_LONG real_cyc )
Packit 577717
 *
Packit 577717
 * @see PAPI_get_real_cyc
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_get_real_cyc, PAPIF_GET_REAL_CYC, ( long long *real_cyc ) )
Packit 577717
{
Packit 577717
	*real_cyc = PAPI_get_real_cyc(  );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_get_real_usec
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Get real time counter value in microseconds.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_get_real_usec( C_LONG_LONG time )
Packit 577717
 *
Packit 577717
 * @see PAPI_get_real_usec
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_get_real_usec, PAPIF_GET_REAL_USEC, ( long long *time ) )
Packit 577717
{
Packit 577717
	*time = PAPI_get_real_usec(  );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_get_real_nsec
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Get real time counter value in nanoseconds.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_get_real_nsec( C_LONG_LONG time )
Packit 577717
 *
Packit 577717
 * @see PAPI_get_real_nsec
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_get_real_nsec, PAPIF_GET_REAL_NSEC, ( long long *time ) )
Packit 577717
{
Packit 577717
	*time = PAPI_get_real_nsec(  );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_get_virt_cyc
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Get virtual time counter value in clock cycles.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_get_virt_cyc( C_LONG_LONG virt_cyc )
Packit 577717
 *
Packit 577717
 * @see PAPI_get_virt_cyc
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_get_virt_cyc, PAPIF_GET_VIRT_CYC, ( long long *virt_cyc ) )
Packit 577717
{
Packit 577717
	*virt_cyc = PAPI_get_virt_cyc(  );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_get_virt_usec
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Get virtual time counter value in microseconds.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_get_virt_usec( C_LONG_LONG time )
Packit 577717
 *
Packit 577717
 * @see PAPI_get_virt_usec
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_get_virt_usec, PAPIF_GET_VIRT_USEC, ( long long *time ) )
Packit 577717
{
Packit 577717
	*time = PAPI_get_virt_usec(  );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_is_initialized
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Check for initialization.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_is_initialized( C_INT level )
Packit 577717
 *
Packit 577717
 * @see PAPI_is_initialized
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_is_initialized, PAPIF_IS_INITIALIZED, ( int *level ) )
Packit 577717
{
Packit 577717
	*level = PAPI_is_initialized(  );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_library_init
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Initialize the PAPI library. 
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_library_init( C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_library_init
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_library_init, PAPIF_LIBRARY_INIT, ( int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_library_init( *check );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_thread_id
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *  @brief Get the thread identifier of the current thread.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_thread_id( C_INT id )
Packit 577717
 *
Packit 577717
 * @see PAPI_thread_id
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_thread_id, PAPIF_THREAD_ID, ( unsigned long *id ) )
Packit 577717
{
Packit 577717
	*id = PAPI_thread_id(  );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_register_thread
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *  @brief Notify PAPI that a thread has 'appeared'.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_register_thread( C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_register_thread
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_register_thread, PAPIF_REGISTER_THREAD, ( int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_register_thread(  );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_unregister_thread
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *  @brief Notify PAPI that a thread has 'disappeared'.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_unregister_thread( C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_unregister_thread
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_unregister_thread, PAPIF_UNREGISTER_THREAD, ( int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_unregister_thread(  );
Packit 577717
}
Packit 577717
Packit 577717
/* There was a long (10+ years!) typo that was not noticed here */
Packit 577717
/* Leaving it here as not to break any existing code out there */
Packit 577717
Packit 577717
PAPI_FCALL( papif_unregster_thread, PAPIF_UNREGSTER_THREAD, ( int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_unregister_thread(  );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_thread_init
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *  @brief Initialize thread support in the PAPI library.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_thread_init( C_INT FUNCTION  handle,  C_INT  check )
Packit 577717
 *
Packit 577717
 * @see PAPI_thread_init
Packit 577717
 */
Packit 577717
/* This must be passed an EXTERNAL or INTRINISIC FUNCTION not a SUBROUTINE */
Packit 577717
PAPI_FCALL( papif_thread_init, PAPIF_THREAD_INIT,
Packit 577717
			( unsigned long int ( *handle ) ( void ), int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_thread_init( handle );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPI_list_events
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief List the events in an event set.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPI_list_events( C_INT EventSet, C_INT(*) Events, C_INT number, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_list_events
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_list_events, PAPIF_LIST_EVENTS,
Packit 577717
			( int *EventSet, int *Events, int *number, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_list_events( *EventSet, Events, number );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_multiplex_init
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Initialize multiplex support in the PAPI library.
Packit 577717
 *
Packit 577717
 * @par Fortran Interface:
Packit 577717
 * \#include "fpapi.h" @n
Packit 577717
 * PAPIF_multiplex_init( C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_multiplex_init
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_multiplex_init, PAPIF_MULTIPLEX_INIT, ( int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_multiplex_init(  );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_get_multiplex
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Get the multiplexing status of specified event set.
Packit 577717
 *
Packit 577717
 * @par Fortran Interface:
Packit 577717
 * \#include "fpapi.h" @n
Packit 577717
 * PAPIF_get_multiplex( C_INT  EventSet,  C_INT  check )
Packit 577717
 *
Packit 577717
 * @see PAPI_get_multiplex
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_get_multiplex, PAPIF_GET_MULTIPLEX,
Packit 577717
			( int *EventSet, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_get_multiplex( *EventSet );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_set_multiplex
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Convert a standard event set to a multiplexed event set. 
Packit 577717
 *
Packit 577717
 * @par Fortran Interface:
Packit 577717
 * \#include "fpapi.h" @n
Packit 577717
 * PAPIF_set_multiplex( C_INT  EventSet,  C_INT  check )
Packit 577717
 *
Packit 577717
 * @see PAPI_set_multiplex
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_set_multiplex, PAPIF_SET_MULTIPLEX,
Packit 577717
			( int *EventSet, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_set_multiplex( *EventSet );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_perror
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *  @brief Convert PAPI error codes to strings, and print error message to stderr. 
Packit 577717
 *
Packit 577717
 * @par Fortran Interface:
Packit 577717
 * \#include "fpapi.h" @n
Packit 577717
 *     PAPIF_perror( C_STRING message )
Packit 577717
 *
Packit 577717
 * @see PAPI_perror
Packit 577717
 */
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
PAPI_FCALL( papif_perror, PAPIF_PERROR,
Packit 577717
			( char *message,
Packit 577717
			  int message_len ) )
Packit 577717
#else
Packit 577717
PAPI_FCALL( papif_perror, PAPIF_PERROR,
Packit 577717
			( char *message ) )
Packit 577717
#endif
Packit 577717
{
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
		char tmp[PAPI_MAX_STR_LEN];
Packit 577717
		Fortran2cstring( tmp, message, PAPI_MAX_STR_LEN, message_len );
Packit 577717
Packit 577717
	PAPI_perror( tmp );
Packit 577717
#else
Packit 577717
	PAPI_perror( message );
Packit 577717
#endif
Packit 577717
}
Packit 577717
Packit 577717
/* This will not work until Fortran2000 :)
Packit 577717
 * PAPI_FCALL(papif_profil, PAPIF_PROFIL, (unsigned short *buf, unsigned *bufsiz, unsigned long *offset, unsigned *scale, unsigned *eventset, 
Packit 577717
 *            unsigned *eventcode, unsigned *threshold, unsigned *flags, unsigned *check))
Packit 577717
 * {
Packit 577717
 * *check = PAPI_profil(buf, *bufsiz, *offset, *scale, *eventset, *eventcode, *threshold, *flags);
Packit 577717
 * }
Packit 577717
 */
Packit 577717
Packit 577717
/** @class PAPIF_query_event
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *  @brief Query if PAPI event exists.
Packit 577717
 *
Packit 577717
 * @par Fortran Interface:
Packit 577717
 * \#include "fpapi.h" @n
Packit 577717
 * PAPIF_query_event(C_INT EventCode, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_query_event
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_query_event, PAPIF_QUERY_EVENT,
Packit 577717
			( int *EventCode, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_query_event( *EventCode );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_query_named_event
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *  @brief Query if named PAPI event exists.
Packit 577717
 *
Packit 577717
 * @par Fortran Interface:
Packit 577717
 * \#include "fpapi.h" @n
Packit 577717
 * PAPIF_query_named_event(C_STRING EventName, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_query_named_event
Packit 577717
 */
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
PAPI_FCALL( papif_query_named_event, PAPIF_QUERY_NAMED_EVENT,
Packit 577717
			( char *EventName, int *check, int Event_len ) )
Packit 577717
{
Packit 577717
	char tmp[PAPI_MAX_STR_LEN];
Packit 577717
	Fortran2cstring( tmp, EventName, PAPI_MAX_STR_LEN, Event_len );
Packit 577717
	*check = PAPI_query_named_event( tmp );	
Packit 577717
}
Packit 577717
#else
Packit 577717
PAPI_FCALL( papif_query_named_event, PAPIF_QUERY_NAMED_EVENT,
Packit 577717
			( char *EventName, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_query_named_event( EventName );
Packit 577717
}
Packit 577717
#endif
Packit 577717
Packit 577717
/** @class PAPIF_get_event_info
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Get the event's name and description info.
Packit 577717
 *
Packit 577717
 * @par Fortran Interface:
Packit 577717
 * \#include "fpapi.h" @n
Packit 577717
 * PAPIF_get_event_info(C_INT EventCode, C_STRING symbol, C_STRING long_descr,
Packit 577717
 						C_STRING short_descr, C_INT count, C_STRING event_note,
Packit 577717
 						C_INT flags, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_get_event_info
Packit 577717
 */
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
PAPI_FCALL( papif_get_event_info, PAPIF_GET_EVENT_INFO,
Packit 577717
			( int *EventCode, char *symbol, char *long_descr, char *short_descr,
Packit 577717
			  int *count, char *event_note, int *flags, int *check,
Packit 577717
			  int symbol_len, int long_descr_len, int short_descr_len,
Packit 577717
			  int event_note_len ) )
Packit 577717
#else
Packit 577717
PAPI_FCALL( papif_get_event_info, PAPIF_GET_EVENT_INFO,
Packit 577717
			( int *EventCode, char *symbol, char *long_descr, char *short_descr,
Packit 577717
			  int *count, char *event_note, int *flags, int *check ) )
Packit 577717
#endif
Packit 577717
{
Packit 577717
	PAPI_event_info_t info;
Packit 577717
	( void ) flags;			 /*Unused */
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
	int i;
Packit 577717
	if ( ( *check = PAPI_get_event_info( *EventCode, &info ) ) == PAPI_OK ) {
Packit 577717
		strncpy( symbol, info.symbol, ( size_t ) symbol_len );
Packit 577717
		for ( i = ( int ) strlen( info.symbol ); i < symbol_len;
Packit 577717
			  symbol[i++] = ' ' );
Packit 577717
		strncpy( long_descr, info.long_descr, ( size_t ) long_descr_len );
Packit 577717
		for ( i = ( int ) strlen( info.long_descr ); i < long_descr_len;
Packit 577717
			  long_descr[i++] = ' ' );
Packit 577717
		strncpy( short_descr, info.short_descr, ( size_t ) short_descr_len );
Packit 577717
		for ( i = ( int ) strlen( info.short_descr ); i < short_descr_len;
Packit 577717
			  short_descr[i++] = ' ' );
Packit 577717
Packit 577717
		*count = ( int ) info.count;
Packit 577717
Packit 577717
		int note_len=0;
Packit 577717
Packit 577717
		strncpy( event_note, info.note,  ( size_t ) event_note_len );
Packit 577717
		note_len=strlen(info.note);
Packit 577717
Packit 577717
		for ( i =  note_len; i < event_note_len;
Packit 577717
			  event_note[i++] = ' ' );
Packit 577717
	}
Packit 577717
#else
Packit 577717
/* printf("EventCode: %d\n", *EventCode ); -KSL */
Packit 577717
	if ( ( *check = PAPI_get_event_info( *EventCode, &info ) ) == PAPI_OK ) {
Packit 577717
		strncpy( symbol, info.symbol, PAPI_MAX_STR_LEN );
Packit 577717
		strncpy( long_descr, info.long_descr, PAPI_MAX_STR_LEN );
Packit 577717
		strncpy( short_descr, info.short_descr, PAPI_MAX_STR_LEN );
Packit 577717
		*count = info.count;
Packit 577717
		if (info.note) 
Packit 577717
                   strncpy( event_note, info.note, 
Packit 577717
			    PAPI_MAX_STR_LEN );
Packit 577717
	}
Packit 577717
/*  printf("Check: %d\n", *check); -KSL */
Packit 577717
#endif
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_event_code_to_name
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Convert a numeric hardware event code to a name.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_event_code_to_name( C_INT EventCode, C_STRING EventName, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_event_code_to_name
Packit 577717
 */
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
PAPI_FCALL( papif_event_code_to_name, PAPIF_EVENT_CODE_TO_NAME,
Packit 577717
			( int *EventCode, char *out_str, int *check, int out_len ) )
Packit 577717
#else
Packit 577717
PAPI_FCALL( papif_event_code_to_name, PAPIF_EVENT_CODE_TO_NAME,
Packit 577717
			( int *EventCode, char *out, int *check ) )
Packit 577717
#endif
Packit 577717
{
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
	char tmp[PAPI_MAX_STR_LEN];
Packit 577717
	int i;
Packit 577717
	*check = PAPI_event_code_to_name( *EventCode, tmp );
Packit 577717
	/* tmp has \0 within PAPI_MAX_STR_LEN chars so strncpy is safe */
Packit 577717
	strncpy( out_str, tmp, ( size_t ) out_len );
Packit 577717
	/* overwrite any NULLs and trailing garbage in out_str */
Packit 577717
	for ( i = ( int ) strlen( tmp ); i < out_len; out_str[i++] = ' ' );
Packit 577717
#else
Packit 577717
	/* The array "out" passed by the user must be sufficiently long */
Packit 577717
	*check = PAPI_event_code_to_name( *EventCode, out );
Packit 577717
#endif
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_event_name_to_code
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Convert a name to a numeric hardware event code. 
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_event_name_to_code( C_STRING EventName, C_INT EventCode, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_event_name_to_code
Packit 577717
 */
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
PAPI_FCALL( papif_event_name_to_code, PAPIF_EVENT_NAME_TO_CODE,
Packit 577717
			( char *in_str, int *out, int *check, int in_len ) )
Packit 577717
#else
Packit 577717
PAPI_FCALL( papif_event_name_to_code, PAPIF_EVENT_NAME_TO_CODE,
Packit 577717
			( char *in, int *out, int *check ) )
Packit 577717
#endif
Packit 577717
{
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
	int slen, i;
Packit 577717
	char tmpin[PAPI_MAX_STR_LEN];
Packit 577717
Packit 577717
	/* What is the maximum number of chars to copy ? */
Packit 577717
	slen = in_len < PAPI_MAX_STR_LEN ? in_len : PAPI_MAX_STR_LEN;
Packit 577717
	strncpy( tmpin, in_str, ( size_t ) slen );
Packit 577717
Packit 577717
	/* Remove trailing blanks from initial Fortran string */
Packit 577717
	for ( i = slen - 1; i > -1 && tmpin[i] == ' '; tmpin[i--] = '\0' );
Packit 577717
Packit 577717
	/* Make sure string is NULL terminated before call */
Packit 577717
	tmpin[PAPI_MAX_STR_LEN - 1] = '\0';
Packit 577717
	if ( slen < PAPI_MAX_STR_LEN )
Packit 577717
		tmpin[slen] = '\0';
Packit 577717
Packit 577717
	*check = PAPI_event_name_to_code( tmpin, out );
Packit 577717
#else
Packit 577717
	/* This will have trouble if argument in is not null terminated */
Packit 577717
	*check = PAPI_event_name_to_code( in, out );
Packit 577717
#endif
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_num_events
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Enumerate PAPI preset or native events. 
Packit 577717
 *
Packit 577717
 * @par Fortran Interface:
Packit 577717
 * \#include "fpapi.h" @n
Packit 577717
 * PAPIF_num_events(C_INT  EventSet,  C_INT  count)
Packit 577717
 *
Packit 577717
 * @see PAPI_num_events
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_num_events, PAPIF_NUM_EVENTS, ( int *EventCode, int *count ) )
Packit 577717
{
Packit 577717
	*count = PAPI_num_events( *EventCode );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_enum_event
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *  @brief Return the number of events in an event set.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_enum_event( C_INT  EventCode,  C_INT  modifier,  C_INT  check )
Packit 577717
 *
Packit 577717
 * @see PAPI_enum_event
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_enum_event, PAPIF_ENUM_EVENT,
Packit 577717
			( int *EventCode, int *modifier, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_enum_event( EventCode, *modifier );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_read
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *  @brief Read hardware counters from an event set.
Packit 577717
 *
Packit 577717
 *  @par Fortran Interface:
Packit 577717
 * \#include "fpapi.h" @n
Packit 577717
 *  PAPIF_read(C_INT EventSet, C_LONG_LONG(*) values, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_read
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_read, PAPIF_READ,
Packit 577717
			( int *EventSet, long long *values, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_read( *EventSet, values );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_read_ts
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *  @brief Read hardware counters with a timestamp.
Packit 577717
 *
Packit 577717
 *  @par Fortran Interface:
Packit 577717
 *  \#include "fpapi.h" @n
Packit 577717
 *  PAPIF_read_ts(C_INT EventSet, C_LONG_LONG(*) values, C_LONG_LONG(*) cycles, C_INT check)
Packit 577717
 *
Packit 577717
 * @see PAPI_read_ts
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_read_ts, PAPIF_READ_TS,
Packit 577717
			( int *EventSet, long long *values, long long *cycles, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_read_ts( *EventSet, values, cycles );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_remove_event
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *  @brief Remove a hardware event from a PAPI event set. 
Packit 577717
 *
Packit 577717
 *   @par Fortran interface:
Packit 577717
 *   \#include "fpapi.h" @n
Packit 577717
 *   PAPIF_remove_event( C_INT EventSet, C_INT EventCode, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_remove_event
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_remove_event, PAPIF_REMOVE_EVENT,
Packit 577717
			( int *EventSet, int *Event, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_remove_event( *EventSet, *Event );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_remove_named_event
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *  @brief Remove a named hardware event from a PAPI event set. 
Packit 577717
 *
Packit 577717
 *   @par Fortran interface:
Packit 577717
 *   \#include "fpapi.h" @n
Packit 577717
 *   PAPIF_remove_named_event( C_INT EventSet, C_STRING EventName, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_remove_named_event
Packit 577717
 */
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
PAPI_FCALL( papif_remove_named_event, PAPIF_REMOVE_NAMED_EVENT,
Packit 577717
			( int *EventSet, char *EventName, int *check, int Event_len ) )
Packit 577717
{
Packit 577717
	char tmp[PAPI_MAX_STR_LEN];
Packit 577717
	Fortran2cstring( tmp, EventName, PAPI_MAX_STR_LEN, Event_len );
Packit 577717
	*check = PAPI_remove_named_event( *EventSet, tmp );	
Packit 577717
}
Packit 577717
#else
Packit 577717
PAPI_FCALL( papif_remove_named_event, PAPIF_REMOVE_NAMED_EVENT,
Packit 577717
			( int *EventSet, char *EventName, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_remove_named_event( *EventSet, EventName );
Packit 577717
}
Packit 577717
#endif
Packit 577717
Packit 577717
/** @class PAPIF_remove_events
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 * @brief Remove an array of hardware event codes from a PAPI event set.
Packit 577717
 *
Packit 577717
 *	@par Fortran Prototype:
Packit 577717
 *		\#include "fpapi.h" @n
Packit 577717
 *		PAPIF_remove_events( C_INT EventSet, C_INT(*) EventCode, C_INT number, C_INT check )
Packit 577717
 * 
Packit 577717
 * @see PAPI_remove_events
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_remove_events, PAPIF_REMOVE_EVENTS,
Packit 577717
			( int *EventSet, int *Events, int *number, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_remove_events( *EventSet, Events, *number );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_reset
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *  @brief Reset the hardware event counts in an event set.
Packit 577717
 *
Packit 577717
 *	@par Fortran Prototype:
Packit 577717
 *		\#include "fpapi.h" @n
Packit 577717
 *		PAPIF_reset( C_INT EventSet, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_reset
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_reset, PAPIF_RESET, ( int *EventSet, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_reset( *EventSet );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_set_debug
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 * @brief Set the current debug level for error output from PAPI.
Packit 577717
 *
Packit 577717
 * @par Fortran Prototype:
Packit 577717
 *		\#include "fpapi.h" @n
Packit 577717
 *		PAPIF_set_debug( C_INT level, C_INT check )
Packit 577717
 * 
Packit 577717
 * @see PAPI_set_debug
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_set_debug, PAPIF_SET_DEBUG, ( int *debug, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_set_debug( *debug );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_set_domain
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Set the default counting domain for new event sets bound to the cpu component.
Packit 577717
 *
Packit 577717
 *	@par Fortran Prototype:
Packit 577717
 *		\#include "fpapi.h" @n
Packit 577717
 *		PAPIF_set_domain( C_INT domain, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_set_domain
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_set_domain, PAPIF_SET_DOMAIN, ( int *domain, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_set_domain( *domain );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_set_cmp_domain
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Set the default counting domain for new event sets bound to the specified component.
Packit 577717
 *
Packit 577717
 *	@par Fortran Prototype:
Packit 577717
 *		\#include "fpapi.h" @n
Packit 577717
 *		PAPIF_set_cmp_domain( C_INT domain, C_INT cidx, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_set_cmp_domain
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_set_cmp_domain, PAPIF_SET_CMP_DOMAIN,
Packit 577717
			( int *domain, int *cidx, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_set_cmp_domain( *domain, *cidx );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_set_granularity
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Set the default counting granularity for eventsets bound to the cpu component.
Packit 577717
 *
Packit 577717
 *	@par Fortran Prototype:
Packit 577717
 *		\#include "fpapi.h" @n
Packit 577717
 *		PAPIF_set_granularity( C_INT granularity, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_set_granularity
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_set_granularity, PAPIF_SET_GRANULARITY,
Packit 577717
			( int *granularity, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_set_granularity( *granularity );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_set_cmp_granularity
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Set the default counting granularity for eventsets bound to the specified component.
Packit 577717
 *
Packit 577717
 *	@par Fortran Prototype:
Packit 577717
 *		\#include "fpapi.h" @n
Packit 577717
 *		PAPIF_set_cmp_granularity( C_INT granularity, C_INT cidx, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_set_cmp_granularity
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_set_cmp_granularity, PAPIF_SET_CMP_GRANULARITY,
Packit 577717
			( int *granularity, int *cidx, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_set_cmp_granularity( *granularity, *cidx );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_shutdown
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief finish using PAPI and free all related resources. 
Packit 577717
 *
Packit 577717
 *	@par Fortran Prototype:
Packit 577717
 *		\#include "fpapi.h" @n
Packit 577717
 *		PAPIF_shutdown( )
Packit 577717
 *
Packit 577717
 * @see PAPI_shutdown
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_shutdown, PAPIF_SHUTDOWN, ( void ) )
Packit 577717
{
Packit 577717
	PAPI_shutdown(  );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_start
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Start counting hardware events in an event set.
Packit 577717
 *
Packit 577717
 * @par Fortran Interface:
Packit 577717
 *     \#include "fpapi.h" @n
Packit 577717
 *     PAPIF_start( C_INT EventSet, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_start
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_start, PAPIF_START, ( int *EventSet, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_start( *EventSet );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_state
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 * @brief Return the counting state of an EventSet.
Packit 577717
 *
Packit 577717
 * @par Fortran Interface:
Packit 577717
 *     \#include "fpapi.h" @n
Packit 577717
 *     PAPIF_state(C_INT EventSet, C_INT status, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_state
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_state, PAPIF_STATE,
Packit 577717
			( int *EventSet, int *status, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_state( *EventSet, status );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_stop
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Stop counting hardware events in an EventSet.
Packit 577717
 *
Packit 577717
 * @par Fortran Interface:
Packit 577717
 *     \#include "fpapi.h" @n
Packit 577717
 *     PAPIF_stop( C_INT EventSet, C_LONG_LONG(*) values, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_stop
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_stop, PAPIF_STOP,
Packit 577717
			( int *EventSet, long long *values, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_stop( *EventSet, values );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_write
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Write counter values into counters.
Packit 577717
 *
Packit 577717
 * @par Fortran Interface:
Packit 577717
 *     \#include "fpapi.h" @n
Packit 577717
 *     PAPIF_write( C_INT EventSet, C_LONG_LONG(*) values, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_write
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_write, PAPIF_WRITE,
Packit 577717
			( int *EventSet, long long *values, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_write( *EventSet, values );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_lock
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *  @brief Lock one of two mutex variables defined in papi.h.
Packit 577717
 *
Packit 577717
 *  @par Fortran Interface:
Packit 577717
 *  \#include "fpapi.h" @n
Packit 577717
 *  PAPIF_lock( C_INT lock )
Packit 577717
 *
Packit 577717
 * @see PAPI_lock
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_lock, PAPIF_LOCK,
Packit 577717
			( int *lock, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_lock( *lock );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_unlock
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Unlock one of the mutex variables defined in papi.h.
Packit 577717
 *
Packit 577717
 * @par Fortran Interface:
Packit 577717
 *     \#include "fpapi.h" @n
Packit 577717
 *  PAPIF_unlock( C_INT lock )
Packit 577717
 *
Packit 577717
 * @see PAPI_unlock
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_unlock, PAPIF_unlock,
Packit 577717
			( int *lock, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_unlock( *lock );
Packit 577717
}
Packit 577717
Packit 577717
/* The High Level API Wrappers */
Packit 577717
Packit 577717
/** @class PAPIF_start_counters
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Start counting hardware events.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_start_counters( C_INT(*) events, C_INT array_len, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_start_counters
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_start_counters, PAPIF_START_COUNTERS,
Packit 577717
			( int *events, int *array_len, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_start_counters( events, *array_len );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPI_read_counters
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Read and reset counters. 
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_read_counters( C_LONG_LONG(*) values, C_INT array_len, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_read_counters
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_read_counters, PAPIF_READ_COUNTERS,
Packit 577717
			( long long *values, int *array_len, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_read_counters( values, *array_len );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_stop_counters
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Stop counting hardware events and reset values to zero.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_stop_counters( C_LONG_LONG(*) values, C_INT array_len, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_stop_counters
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_stop_counters, PAPIF_STOP_COUNTERS,
Packit 577717
			( long long *values, int *array_len, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_stop_counters( values, *array_len );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_accum_counters
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Accumulate and reset counters.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_accum_counters( C_LONG_LONG(*) values, C_INT array_len, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_accum_counters
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_accum_counters, PAPIF_ACCUM_COUNTERS,
Packit 577717
			( long long *values, int *array_len, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_accum_counters( values, *array_len );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_num_counters
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Get the number of hardware counters available on the system.
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_num_counters( C_INT numevents )
Packit 577717
 *
Packit 577717
 * @see PAPI_num_counters
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_num_counters, PAPIF_NUM_COUNTERS, ( int *numevents ) )
Packit 577717
{
Packit 577717
	*numevents = PAPI_num_counters(  );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_ipc
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Get instructions per cycle, real and processor time.
Packit 577717
 *	
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_ipc( C_FLOAT real_time, C_FLOAT proc_time, C_LONG_LONG ins, C_FLOAT ipc, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_ipc
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_ipc, PAPIF_IPC,
Packit 577717
			( float *rtime, float *ptime, long long *ins, float *ipc,
Packit 577717
			  int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_ipc( rtime, ptime, ins, ipc );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_epc
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Get named events per cycle, real and processor time, reference and core cycles.
Packit 577717
 *	
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_epc( C_STRING EventName, C_FLOAT real_time, C_FLOAT proc_time, C_LONG_LONG ref, C_LONG_LONG core, C_LONG_LONG evt, C_FLOAT epc, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_epc
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_epc, PAPIF_EPC,
Packit 577717
			( int event, float *rtime, float *ptime, 
Packit 577717
			  long long *ref, long long *core, long long *evt, float *epc,
Packit 577717
			  int *check) )
Packit 577717
{
Packit 577717
	*check = PAPI_epc( event, rtime, ptime, ref, core, evt, epc );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_flips
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Simplified call to get Mflips/s (floating point instruction rate), real and processor time. 
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *	PAPIF_flips( C_FLOAT real_time, C_FLOAT proc_time, C_LONG_LONG flpins, C_FLOAT mflips, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_flips
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_flips, PAPIF_FLIPS,
Packit 577717
			( float *real_time, float *proc_time, long long *flpins,
Packit 577717
			  float *mflips, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_flips( real_time, proc_time, flpins, mflips );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_flops
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Simplified call to get Mflops/s (floating point instruction rate), real and processor time. 
Packit 577717
 *
Packit 577717
 *	@par Fortran Interface:
Packit 577717
 *	\#include "fpapi.h" @n
Packit 577717
 *  PAPIF_flops( C_FLOAT real_time, C_FLOAT proc_time, C_LONG_LONG flpops, C_FLOAT mflops, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_flops
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_flops, PAPIF_FLOPS,
Packit 577717
			( float *real_time, float *proc_time, long long *flpops,
Packit 577717
			  float *mflops, int *check ) )
Packit 577717
{
Packit 577717
	*check = PAPI_flops( real_time, proc_time, flpops, mflops );
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
/* Fortran only APIs for get_opt and set_opt functionality */
Packit 577717
Packit 577717
/** @class PAPIF_get_clockrate
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Get the clockrate in MHz for the current cpu.
Packit 577717
 *
Packit 577717
 *	@par Fortran Prototype:
Packit 577717
 *		\#include "fpapi.h" @n
Packit 577717
 *		PAPIF_set_domain( C_INT cr )
Packit 577717
 *
Packit 577717
 * @note This is a Fortran only interface that returns a value from the PAPI_get_opt call.
Packit 577717
 *
Packit 577717
 * @see PAPI_get_opt
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_get_clockrate, PAPIF_GET_CLOCKRATE, ( int *cr ) )
Packit 577717
{
Packit 577717
	*cr = PAPI_get_opt( PAPI_CLOCKRATE, (PAPI_option_t *)  NULL );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_get_preload
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Get the LD_PRELOAD environment variable.
Packit 577717
 *
Packit 577717
 *	@par Fortran Prototype:
Packit 577717
 *		\#include "fpapi.h" @n
Packit 577717
 *		PAPIF_get_preload( C_STRING lib_preload_env, C_INT check )
Packit 577717
 *
Packit 577717
 * @note This is a Fortran only interface that returns a value from the PAPI_get_opt call.
Packit 577717
 *
Packit 577717
 * @see PAPI_get_opt
Packit 577717
 */
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
PAPI_FCALL( papif_get_preload, PAPIF_GET_PRELOAD,
Packit 577717
			( char *lib_preload_env, int *check, int lib_preload_env_len ) )
Packit 577717
#else
Packit 577717
PAPI_FCALL( papif_get_preload, PAPIF_GET_PRELOAD,
Packit 577717
			( char *lib_preload_env, int *check ) )
Packit 577717
#endif
Packit 577717
{
Packit 577717
	PAPI_option_t p;
Packit 577717
#if defined(_FORTRAN_STRLEN_AT_END)
Packit 577717
	int i;
Packit 577717
Packit 577717
	if ( ( *check = PAPI_get_opt( PAPI_PRELOAD, &p ) ) == PAPI_OK ) {
Packit 577717
		strncpy( lib_preload_env, p.preload.lib_preload_env,
Packit 577717
				 ( size_t ) lib_preload_env_len );
Packit 577717
		for ( i = ( int ) strlen( p.preload.lib_preload_env );
Packit 577717
			  i < lib_preload_env_len; lib_preload_env[i++] = ' ' );
Packit 577717
	}
Packit 577717
#else
Packit 577717
	if ( ( *check = PAPI_get_opt( PAPI_PRELOAD, &p ) ) == PAPI_OK ) {
Packit 577717
		strncpy( lib_preload_env, p.preload.lib_preload_env, PAPI_MAX_STR_LEN );
Packit 577717
	}
Packit 577717
#endif
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_get_granularity
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Get the granularity setting for the specified EventSet.
Packit 577717
 *
Packit 577717
 *	@par Fortran Prototype:
Packit 577717
 *		\#include "fpapi.h" @n
Packit 577717
 *		PAPIF_get_granularity( C_INT eventset, C_INT granularity, C_INT mode, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_get_opt
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_get_granularity, PAPIF_GET_GRANULARITY,
Packit 577717
			( int *eventset, int *granularity, int *mode, int *check ) )
Packit 577717
{
Packit 577717
	PAPI_option_t g;
Packit 577717
Packit 577717
	if ( *mode == PAPI_DEFGRN ) {
Packit 577717
		*granularity = PAPI_get_opt( *mode, &g );
Packit 577717
		*check = PAPI_OK;
Packit 577717
	} else if ( *mode == PAPI_GRANUL ) {
Packit 577717
		g.granularity.eventset = *eventset;
Packit 577717
		if ( ( *check = PAPI_get_opt( *mode, &g ) ) == PAPI_OK ) {
Packit 577717
			*granularity = g.granularity.granularity;
Packit 577717
		}
Packit 577717
	} else {
Packit 577717
		*check = PAPI_EINVAL;
Packit 577717
	}
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_get_domain
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Get the domain setting for the specified EventSet.
Packit 577717
 *
Packit 577717
 *	@par Fortran Prototype:
Packit 577717
 *		\#include "fpapi.h" @n
Packit 577717
 *		PAPIF_get_domain( C_INT eventset, C_INT domain, C_INT mode, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_get_opt
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_get_domain, PAPIF_GET_DOMAIN,
Packit 577717
			( int *eventset, int *domain, int *mode, int *check ) )
Packit 577717
{
Packit 577717
	PAPI_option_t d;
Packit 577717
Packit 577717
	if ( *mode == PAPI_DEFDOM ) {
Packit 577717
		*domain = PAPI_get_opt( *mode, (PAPI_option_t *) NULL );
Packit 577717
		*check = PAPI_OK;
Packit 577717
	} else if ( *mode == PAPI_DOMAIN ) {
Packit 577717
		d.domain.eventset = *eventset;
Packit 577717
		if ( ( *check = PAPI_get_opt( *mode, &d ) ) == PAPI_OK ) {
Packit 577717
			*domain = d.domain.domain;
Packit 577717
		}
Packit 577717
	} else {
Packit 577717
		*check = PAPI_EINVAL;
Packit 577717
	}
Packit 577717
}
Packit 577717
Packit 577717
#if 0
Packit 577717
PAPI_FCALL( papif_get_inherit, PAPIF_GET_INHERIT, ( int *inherit, int *check ) )
Packit 577717
{
Packit 577717
	PAPI_option_t i;
Packit 577717
Packit 577717
	if ( ( *check = PAPI_get_opt( PAPI_INHERIT, &i ) ) == PAPI_OK ) {
Packit 577717
		*inherit = i.inherit.inherit;
Packit 577717
	}
Packit 577717
}
Packit 577717
#endif
Packit 577717
Packit 577717
/** @class PAPIF_set_event_domain
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Set the default counting domain for specified EventSet.
Packit 577717
 *
Packit 577717
 *	@par Fortran Prototype:
Packit 577717
 *		\#include "fpapi.h" @n
Packit 577717
 *		PAPIF_set_event_domain( C_INT EventSet, C_INT domain, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_set_domain
Packit 577717
 * @see PAPI_set_opt
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_set_event_domain, PAPIF_SET_EVENT_DOMAIN,
Packit 577717
			( int *es, int *domain, int *check ) )
Packit 577717
{
Packit 577717
	PAPI_option_t d;
Packit 577717
Packit 577717
	d.domain.domain = *domain;
Packit 577717
	d.domain.eventset = *es;
Packit 577717
	*check = PAPI_set_opt( PAPI_DOMAIN, &d );
Packit 577717
}
Packit 577717
Packit 577717
/** @class PAPIF_set_inherit
Packit 577717
 *	@ingroup PAPIF
Packit 577717
 *	@brief Turn on inheriting of counts from daughter to parent process.
Packit 577717
 *
Packit 577717
 *	@par Fortran Prototype:
Packit 577717
 *		\#include "fpapi.h" @n
Packit 577717
 *		PAPIF_set_inherit( C_INT inherit, C_INT check )
Packit 577717
 *
Packit 577717
 * @see PAPI_set_opt
Packit 577717
 */
Packit 577717
PAPI_FCALL( papif_set_inherit, PAPIF_SET_INHERIT, ( int *inherit, int *check ) )
Packit 577717
{
Packit 577717
	PAPI_option_t i;
Packit 577717
Packit 577717
	i.inherit.inherit = *inherit;
Packit 577717
	*check = PAPI_set_opt( PAPI_INHERIT, &i );
Packit 577717
}
Packit 577717
Packit 577717
#pragma GCC visibility pop