Blame SOURCES/papi-krentel.patch

c7ea89
commit 71e6e5e52d7205a6a792bf9b754550a8719db6b1
c7ea89
Author: Asim YarKhan <yarkhan@icl.utk.edu>
c7ea89
Date:   Wed Feb 25 12:17:40 2015 -0500
c7ea89
c7ea89
    Sync thread exit in krental_threads.c
c7ea89
    
c7ea89
    Thanks to William Cohen for this patch and to Phil Mucci for approving it.
c7ea89
    
c7ea89
    William Cohnen and Michael Petlan noticed that this test can have
c7ea89
    threads dangling after the main thread is done.  This patch tracks the
c7ea89
    created threads and ensures that they are joined before the code
c7ea89
    exits.
c7ea89
    
c7ea89
    Note: There is still some problem remaining. For example, the following
c7ea89
    test will sometimes (maybe 1 of 10 runs) generate an error message.
c7ea89
    > ./ctests/krentel_pthreads 8 2000 10
c7ea89
    ....
c7ea89
    [10] time = 8, count = 38110, iter = 20, rate = 1905500.0/Kiter
c7ea89
    PAPI Error: thread->running_eventset == NULL in _papi_pe_dispatch_timer for fd 14!.
c7ea89
    [0] time = 8, count = 38161, iter = 20, rate = 1908050.0/Kiter
c7ea89
    krentel_pthreads.c               PASSED
c7ea89
c7ea89
diff --git a/src/ctests/krentel_pthreads.c b/src/ctests/krentel_pthreads.c
c7ea89
index 2417976..9fa3e25 100644
c7ea89
--- a/src/ctests/krentel_pthreads.c
c7ea89
+++ b/src/ctests/krentel_pthreads.c
c7ea89
@@ -143,7 +143,7 @@ my_thread( void *v )
c7ea89
 int
c7ea89
 main( int argc, char **argv )
c7ea89
 {
c7ea89
-	pthread_t td;
c7ea89
+	pthread_t *td = NULL;
c7ea89
 	long n;
c7ea89
 
c7ea89
 	tests_quiet( argc, argv );	/*Set TESTS_QUIET variable */
c7ea89
@@ -155,6 +155,10 @@ main( int argc, char **argv )
c7ea89
 	if ( argc < 4 || sscanf( argv[3], "%d", &num_threads ) < 1 )
c7ea89
 		num_threads = 3;
c7ea89
 
c7ea89
+	td = malloc((num_threads+1) * sizeof(pthread_t));
c7ea89
+	if (!td)
c7ea89
+		test_fail( __FILE__, __LINE__, "td malloc failed", 1 );
c7ea89
+
c7ea89
 	printf( "program_time = %d, threshold = %d, num_threads = %d\n\n",
c7ea89
 			program_time, threshold, num_threads );
c7ea89
 
c7ea89
@@ -171,15 +175,22 @@ main( int argc, char **argv )
c7ea89
 	gettimeofday( &start, NULL );
c7ea89
 
c7ea89
 	for ( n = 1; n <= num_threads; n++ ) {
c7ea89
-		if ( pthread_create( &td, NULL, my_thread, ( void * ) n ) != 0 )
c7ea89
+		if ( pthread_create( &(td[n]), NULL, my_thread, ( void * ) n ) != 0 )
c7ea89
 			test_fail( __FILE__, __LINE__, "pthread create failed", 1 );
c7ea89
 	}
c7ea89
 
c7ea89
 	my_thread( ( void * ) 0 );
c7ea89
 
c7ea89
+	/* wait for all the threads */
c7ea89
+	for ( n = 1; n <= num_threads; n++ ) {
c7ea89
+	  	if ( pthread_join( td[n], NULL))
c7ea89
+			test_fail( __FILE__, __LINE__, "pthread join failed", 1 );
c7ea89
+	}
c7ea89
+
c7ea89
+	free(td);
c7ea89
+
c7ea89
 	printf( "done\n" );
c7ea89
 
c7ea89
 	test_pass( __FILE__, NULL, 0 );
c7ea89
-	pthread_exit( NULL );
c7ea89
 	return ( 0 );
c7ea89
 }