Blame src/ctests/pthrtough2.c

Packit Service a1973e
#include <stdio.h>
Packit Service a1973e
#include <stdlib.h>
Packit Service a1973e
#include <unistd.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
#define NITER 2000
Packit Service a1973e
Packit Service a1973e
void *
Packit Service a1973e
Thread( void *data )
Packit Service a1973e
{
Packit Service a1973e
	int ret, evtset;
Packit Service a1973e
Packit Service a1973e
	( void ) data;
Packit Service a1973e
Packit Service a1973e
	if ( ( ret = PAPI_register_thread(  ) ) != PAPI_OK )
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_thread_init", ret );
Packit Service a1973e
Packit Service a1973e
	evtset = PAPI_NULL;
Packit Service a1973e
	if ( ( ret = PAPI_create_eventset( &evtset ) ) != PAPI_OK )
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_create_eventset", ret );
Packit Service a1973e
Packit Service a1973e
	if ( ( ret = PAPI_destroy_eventset( &evtset ) ) != PAPI_OK )
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_destroy_eventset", ret );
Packit Service a1973e
Packit Service a1973e
	if ( ( ret = PAPI_unregister_thread(  ) ) != PAPI_OK )
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_unregister_thread", ret );
Packit Service a1973e
Packit Service a1973e
	return ( NULL );
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 j;
Packit Service a1973e
	pthread_t *th = NULL;
Packit Service a1973e
	pthread_attr_t attr;
Packit Service a1973e
	int ret;
Packit Service a1973e
	long nthr;
Packit Service a1973e
Packit Service a1973e
	tests_quiet( argc, argv );	/*Set TESTS_QUIET variable */
Packit Service a1973e
Packit Service a1973e
	ret = PAPI_library_init( PAPI_VER_CURRENT );
Packit Service a1973e
	if ( ret != PAPI_VER_CURRENT )
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_library_init", ret );
Packit Service a1973e
Packit Service a1973e
	if ( ( ret =
Packit Service a1973e
		   PAPI_thread_init( ( unsigned
Packit Service a1973e
							   long ( * )( void ) ) ( pthread_self ) ) ) !=
Packit Service a1973e
		 PAPI_OK )
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_thread_init", ret );
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
	ret = pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM );
Packit Service a1973e
	if ( ret != 0 )
Packit Service a1973e
	   test_skip( __FILE__, __LINE__, "pthread_attr_setscope", ret );
Packit Service a1973e
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
	nthr = NITER;
Packit Service a1973e
Packit Service a1973e
	if ( !TESTS_QUIET ) {
Packit Service a1973e
		printf( "Creating %d threads for %d iterations each of:\n",
Packit Service a1973e
				( int ) nthr, 1 );
Packit Service a1973e
		printf( "\tregister\n" );
Packit Service a1973e
		printf( "\tcreate_eventset\n" );
Packit Service a1973e
		printf( "\tdestroy_eventset\n" );
Packit Service a1973e
		printf( "\tunregister\n" );
Packit Service a1973e
	}
Packit Service a1973e
	th = ( pthread_t * ) malloc( ( size_t ) nthr * sizeof ( pthread_t ) );
Packit Service a1973e
	if ( th == NULL )
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "malloc", PAPI_ESYS );
Packit Service a1973e
Packit Service a1973e
	for ( j = 0; j < nthr; j++ ) {
Packit Service a1973e
		ret = pthread_create( &th[j], &attr, &Thread, NULL );
Packit Service a1973e
		if ( ret ) {
Packit Service a1973e
			printf( "Failed to create thread: %d\n", j );
Packit Service a1973e
			if ( j < 10 )
Packit Service a1973e
				test_fail( __FILE__, __LINE__, "pthread_create", PAPI_ESYS );
Packit Service a1973e
			printf( "Continuing test with %d threads.\n", j - 1 );
Packit Service a1973e
			nthr = j - 1;
Packit Service a1973e
			th = ( pthread_t * ) realloc( th,
Packit Service a1973e
										  ( size_t ) nthr *
Packit Service a1973e
										  sizeof ( pthread_t ) );
Packit Service a1973e
			break;
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	for ( j = 0; j < nthr; j++ ) {
Packit Service a1973e
		pthread_join( th[j], NULL );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	test_pass( __FILE__ );
Packit Service a1973e
Packit Service a1973e
	return 0;
Packit Service a1973e
}