Blame src/ctests/overflow3_pthreads.c

Packit Service a1973e
/*
Packit Service a1973e
* File:    overflow3_pthreads.c
Packit Service a1973e
* Author:  Philip Mucci
Packit Service a1973e
*          mucci@cs.utk.edu
Packit Service a1973e
*/
Packit Service a1973e
Packit Service a1973e
/* This file tests the overflow functionality when there are
Packit Service a1973e
 * threads in which the application isn't calling PAPI (and only
Packit Service a1973e
 * one thread that is calling PAPI.)
Packit Service a1973e
 */
Packit Service a1973e
Packit Service a1973e
#include <stdio.h>
Packit Service a1973e
#include <stdlib.h>
Packit Service a1973e
#include <pthread.h>
Packit Service a1973e
Packit Service a1973e
#include "papi.h"
Packit Service a1973e
#include "papi_test.h"
Packit Service a1973e
Packit Service a1973e
#include "do_loops.h"
Packit Service a1973e
Packit Service a1973e
int total = 0;
Packit Service a1973e
Packit Service a1973e
void *
Packit Service a1973e
thread_fn( void *dummy )
Packit Service a1973e
{
Packit Service a1973e
	( void ) dummy;
Packit Service a1973e
	while ( 1 ) {
Packit Service a1973e
		do_stuff(  );
Packit Service a1973e
	}
Packit Service a1973e
	return ( NULL );
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
void
Packit Service a1973e
handler( int EventSet, void *address, long long overflow_vector, void *context )
Packit Service a1973e
{
Packit Service a1973e
	( void ) overflow_vector;
Packit Service a1973e
	( void ) context;
Packit Service a1973e
	if ( !TESTS_QUIET ) {
Packit Service a1973e
		fprintf( stderr, "handler(%d ) Overflow at %p, thread %#lx!\n",
Packit Service a1973e
				 EventSet, address, PAPI_thread_id(  ) );
Packit Service a1973e
	}
Packit Service a1973e
	total++;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
void
Packit Service a1973e
mainloop( int arg )
Packit Service a1973e
{
Packit Service a1973e
	int retval, num_tests = 1;
Packit Service a1973e
	int EventSet1 = PAPI_NULL;
Packit Service a1973e
	int mask1 = 0x0;
Packit Service a1973e
	int num_events1;
Packit Service a1973e
	long long **values;
Packit Service a1973e
	int PAPI_event;
Packit Service a1973e
	char event_name[PAPI_MAX_STR_LEN];
Packit Service a1973e
Packit Service a1973e
	( void ) arg;
Packit Service a1973e
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", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* add PAPI_TOT_CYC and one of the events in PAPI_FP_INS, PAPI_FP_OPS or
Packit Service a1973e
	   PAPI_TOT_INS, depending on the availability of the event on the
Packit Service a1973e
	   platform */
Packit Service a1973e
	EventSet1 = add_two_nonderived_events( &num_events1,
Packit Service a1973e
			&PAPI_event, &mask1 );
Packit Service a1973e
Packit Service a1973e
	if (num_events1==0) {
Packit Service a1973e
		if (!TESTS_QUIET) printf("Trouble creating events\n");
Packit Service a1973e
		test_skip(__FILE__,__LINE__,"Creating events",0);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	values = allocate_test_space( num_tests, num_events1 );
Packit Service a1973e
Packit Service a1973e
	if ( ( retval =
Packit Service a1973e
		   PAPI_overflow( EventSet1, PAPI_event, THRESHOLD, 0,
Packit Service a1973e
						  handler ) ) != PAPI_OK )
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_overflow", retval );
Packit Service a1973e
Packit Service a1973e
	do_stuff(  );
Packit Service a1973e
Packit Service a1973e
	if ( ( retval = PAPI_start( EventSet1 ) ) != PAPI_OK )
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_start", retval );
Packit Service a1973e
Packit Service a1973e
	do_stuff(  );
Packit Service a1973e
Packit Service a1973e
	if ( ( retval = PAPI_stop( EventSet1, values[0] ) ) != PAPI_OK )
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
Packit Service a1973e
Packit Service a1973e
	/* clear the papi_overflow event */
Packit Service a1973e
	if ( ( retval =
Packit Service a1973e
		   PAPI_overflow( EventSet1, PAPI_event, 0, 0, NULL ) ) != PAPI_OK )
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_overflow", retval );
Packit Service a1973e
Packit Service a1973e
	if ( ( retval =
Packit Service a1973e
		   PAPI_event_code_to_name( PAPI_event, event_name ) ) != PAPI_OK )
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_event_code_to_name", retval );
Packit Service a1973e
Packit Service a1973e
	if ( !TESTS_QUIET ) {
Packit Service a1973e
		printf( "Thread %#x %s : \t%lld\n", ( int ) pthread_self(  ),
Packit Service a1973e
				event_name, ( values[0] )[0] );
Packit Service a1973e
		printf( "Thread %#x PAPI_TOT_CYC: \t%lld\n", ( int ) pthread_self(  ),
Packit Service a1973e
				( values[0] )[1] );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_cleanup_eventset( EventSet1 );
Packit Service a1973e
	if ( retval != PAPI_OK )
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_cleanup_eventset", retval );
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_destroy_eventset( &EventSet1 );
Packit Service a1973e
	if ( retval != PAPI_OK )
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_destroy_eventset", retval );
Packit Service a1973e
Packit Service a1973e
	free_test_space( values, num_tests );
Packit Service a1973e
	PAPI_shutdown(  );
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 i, rc, retval;
Packit Service a1973e
	pthread_t id[NUM_THREADS];
Packit Service a1973e
	pthread_attr_t attr;
Packit Service a1973e
	int quiet;
Packit Service a1973e
Packit Service a1973e
	/* Set TESTS_QUIET variable */
Packit Service a1973e
	quiet=tests_quiet( argc, argv );
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "%s: Using %d threads\n\n", argv[0], NUM_THREADS );
Packit Service a1973e
		printf( "Does non-threaded overflow work "
Packit Service a1973e
			"with extraneous threads present?\n" );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	pthread_attr_init( &attr );
Packit Service a1973e
#ifdef PTHREAD_CREATE_UNDETACHED
Packit Service a1973e
	pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_UNDETACHED );
Packit Service a1973e
#endif
Packit Service a1973e
#ifdef PTHREAD_SCOPE_SYSTEM
Packit Service a1973e
	retval = pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM );
Packit Service a1973e
	if ( retval != 0 )
Packit Service a1973e
		test_skip( __FILE__, __LINE__, "pthread_attr_setscope", retval );
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
	for ( i = 0; i < NUM_THREADS; i++ ) {
Packit Service a1973e
		rc = pthread_create( &id[i], &attr, thread_fn, NULL );
Packit Service a1973e
		if ( rc )
Packit Service a1973e
			test_fail( __FILE__, __LINE__, "pthread_create", rc );
Packit Service a1973e
	}
Packit Service a1973e
	pthread_attr_destroy( &attr );
Packit Service a1973e
Packit Service a1973e
	mainloop( NUM_ITERS );
Packit Service a1973e
Packit Service a1973e
	test_pass( __FILE__ );
Packit Service a1973e
Packit Service a1973e
	return 0;
Packit Service a1973e
}