|
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 |
}
|