Blame src/ctests/exec_overflow.c

Packit Service a1973e
/*
Packit Service a1973e
 *  Test PAPI with fork() and exec().
Packit Service a1973e
 */
Packit Service a1973e
Packit Service a1973e
#include <sys/time.h>
Packit Service a1973e
#include <sys/types.h>
Packit Service a1973e
#include <sys/wait.h>
Packit Service a1973e
#include <errno.h>
Packit Service a1973e
#include <stdio.h>
Packit Service a1973e
#include <stdlib.h>
Packit Service a1973e
#include <unistd.h>
Packit Service a1973e
Packit Service a1973e
#include "papi.h"
Packit Service a1973e
#include "papi_test.h"
Packit Service a1973e
#include "testcode.h"
Packit Service a1973e
Packit Service a1973e
#define MAX_EVENTS  3
Packit Service a1973e
Packit Service a1973e
static int Event[MAX_EVENTS] = {
Packit Service a1973e
	PAPI_TOT_CYC,
Packit Service a1973e
	PAPI_FP_INS,
Packit Service a1973e
	PAPI_FAD_INS,
Packit Service a1973e
};
Packit Service a1973e
Packit Service a1973e
static int Threshold[MAX_EVENTS] = {
Packit Service a1973e
	8000000,
Packit Service a1973e
	4000000,
Packit Service a1973e
	4000000,
Packit Service a1973e
};
Packit Service a1973e
Packit Service a1973e
static struct timeval start, last;
Packit Service a1973e
static long count, total;
Packit Service a1973e
Packit Service a1973e
static void
Packit Service a1973e
my_handler( int EventSet, void *pc, long long ovec, void *context )
Packit Service a1973e
{
Packit Service a1973e
	( void ) EventSet;
Packit Service a1973e
	( void ) pc;
Packit Service a1973e
	( void ) ovec;
Packit Service a1973e
	( void ) context;
Packit Service a1973e
Packit Service a1973e
	count++;
Packit Service a1973e
	total++;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
static void
Packit Service a1973e
print_rate( const char *str )
Packit Service a1973e
{
Packit Service a1973e
	static int last_count = -1;
Packit Service a1973e
	struct timeval now;
Packit Service a1973e
	double st_secs, last_secs;
Packit Service a1973e
Packit Service a1973e
	gettimeofday( &now, NULL );
Packit Service a1973e
	st_secs = ( double ) ( now.tv_sec - start.tv_sec )
Packit Service a1973e
		+ ( ( double ) ( now.tv_usec - start.tv_usec ) ) / 1000000.0;
Packit Service a1973e
	last_secs = ( double ) ( now.tv_sec - last.tv_sec )
Packit Service a1973e
		+ ( ( double ) ( now.tv_usec - last.tv_usec ) ) / 1000000.0;
Packit Service a1973e
	if ( last_secs <= 0.001 )
Packit Service a1973e
		last_secs = 0.001;
Packit Service a1973e
Packit Service a1973e
	if (!TESTS_QUIET) {
Packit Service a1973e
		printf( "[%d] %s, time = %.3f, total = %ld, last = %ld, rate = %.1f/sec\n",
Packit Service a1973e
			getpid(  ), str, st_secs, total, count,
Packit Service a1973e
			( ( double ) count ) / last_secs );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( last_count != -1 ) {
Packit Service a1973e
		if ( count < .1 * last_count ) {
Packit Service a1973e
			test_fail( __FILE__, __LINE__, "Interrupt rate changed!", 1 );
Packit Service a1973e
			exit( 1 );
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
	last_count = ( int ) count;
Packit Service a1973e
	count = 0;
Packit Service a1973e
	last = now;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
static void
Packit Service a1973e
run( const char *str, int len )
Packit Service a1973e
{
Packit Service a1973e
	int n;
Packit Service a1973e
Packit Service a1973e
	for ( n = 1; n <= len; n++ ) {
Packit Service a1973e
		do_cycles( 1 );
Packit Service a1973e
		print_rate( str );
Packit Service a1973e
	}
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
int
Packit Service a1973e
main( int argc, char **argv )
Packit Service a1973e
{
Packit Service a1973e
	int num_events = 1;
Packit Service a1973e
	const char *name = "unknown";
Packit Service a1973e
	int ev,EventSet = PAPI_NULL;
Packit Service a1973e
	int quiet,retval;
Packit Service a1973e
Packit Service a1973e
	/* Used to be able to set this via command line */
Packit Service a1973e
	num_events=1;
Packit Service a1973e
Packit Service a1973e
	/* Set TESTS_QUIET variable */
Packit Service a1973e
	quiet=tests_quiet( argc, argv );
Packit Service a1973e
Packit Service a1973e
	do_cycles( 1 );
Packit Service a1973e
Packit Service a1973e
	/* Zero out the Counters */
Packit Service a1973e
	gettimeofday( &start, NULL );
Packit Service a1973e
	last = start;
Packit Service a1973e
	count = 0;
Packit Service a1973e
	total = 0;
Packit Service a1973e
Packit Service a1973e
	/* Initialize PAPI */
Packit Service a1973e
	retval=PAPI_library_init( PAPI_VER_CURRENT );
Packit Service a1973e
	if (retval!=PAPI_VER_CURRENT) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_library_init failed", 1 );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	name = argv[0];
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "[%d] %s, num_events = %d\n", getpid(),
Packit Service a1973e
			name, num_events );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* Create eventset */
Packit Service a1973e
	if ( PAPI_create_eventset( &EventSet ) != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_create_eventset failed", 1 );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* Add events */
Packit Service a1973e
	for ( ev = 0; ev < num_events; ev++ ) {
Packit Service a1973e
		if ( PAPI_add_event( EventSet, Event[ev] ) != PAPI_OK ) {
Packit Service a1973e
			if (!quiet) printf("Trouble adding event\n");
Packit Service a1973e
			test_skip( __FILE__, __LINE__, "PAPI_add_event failed", 1 );
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* Set overflow */
Packit Service a1973e
	for ( ev = 0; ev < num_events; ev++ ) {
Packit Service a1973e
		if ( PAPI_overflow( EventSet, Event[ev],
Packit Service a1973e
					Threshold[ev], 0, my_handler )
Packit Service a1973e
			 != PAPI_OK ) {
Packit Service a1973e
			test_fail( __FILE__, __LINE__, "PAPI_overflow failed", 1 );
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* Start measuring */
Packit Service a1973e
	if ( PAPI_start( EventSet ) != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_start failed", 1 );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
	/* Tun a bit */
Packit Service a1973e
	run( name, 3 );
Packit Service a1973e
Packit Service a1973e
	/* Stop measuring */
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf("[%d] %s, %s\n", getpid(), name, "stop");
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( PAPI_stop( EventSet, NULL ) != PAPI_OK ) {
Packit Service a1973e
		test_fail( name, __LINE__, "PAPI_stop failed", 1 );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf("[%d] %s, %s\n", getpid(),
Packit Service a1973e
			name, "exec(./child_overflow)");
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* exec the child_overflow helper program */
Packit Service a1973e
	/* we should never return from this */
Packit Service a1973e
	if ( access( "./child_overflow", X_OK ) == 0 )
Packit Service a1973e
		execl( "./child_overflow", "./child_overflow",
Packit Service a1973e
			   ( quiet ? "TESTS_QUIET" : NULL ), NULL );
Packit Service a1973e
	else if ( access( "./ctests/child_overflow", X_OK ) == 0 )
Packit Service a1973e
		execl( "./ctests/child_overflow", "./ctests/child_overflow",
Packit Service a1973e
			   ( quiet ? "TESTS_QUIET" : NULL ), NULL );
Packit Service a1973e
Packit Service a1973e
	test_fail( name, __LINE__, "exec failed", 1 );
Packit Service a1973e
Packit Service a1973e
	return 0;
Packit Service a1973e
}