commit 617eeabe0bbfb5357c10b22ebd72b24a4a872e52 Author: Anthony Date: Mon Jan 6 15:09:42 2020 -0500 Updated the variables that are used in the debug messages in accordance to a previous commit that made these variables thread safe. diff --git a/src/papi_internal.c b/src/papi_internal.c index f0e457bf7..69b2914d0 100644 --- a/src/papi_internal.c +++ b/src/papi_internal.c @@ -114,7 +114,7 @@ _papi_hwi_free_papi_event_string() { void _papi_hwi_set_papi_event_code (unsigned int event_code, int update_flag) { - INTDBG("new event_code: %#x, update_flag: %d, previous event_code: %#x\n", event_code, update_flag, papi_event_code); + INTDBG("new event_code: %#x, update_flag: %d, previous event_code: %#x\n", event_code, update_flag, _papi_hwi_my_thread->tls_papi_event_code); // if call is just to reset and start over, set both flags to show nothing saved yet if (update_flag < 0) { @@ -131,7 +131,7 @@ _papi_hwi_set_papi_event_code (unsigned int event_code, int update_flag) { } unsigned int _papi_hwi_get_papi_event_code () { - INTDBG("papi_event_code: %#x\n", papi_event_code); + INTDBG("papi_event_code: %#x\n", _papi_hwi_my_thread->tls_papi_event_code); return _papi_hwi_my_thread->tls_papi_event_code; } /* Get the index into the ESI->NativeInfoArray for the current PAPI event code */ From 3cc3b6679e1ace7516c3037105ad16410ce7d3db Mon Sep 17 00:00:00 2001 From: William Cohen Date: Wed, 12 Aug 2020 10:12:59 -0400 Subject: [PATCH] Initialize component globals before threads globals An earlier commit (979e80136) swapped the order of initializing globals and threads. This caused issues with the perf_event, appio, and stealtime components which could be observed with the all_native_events, appio_test_pthreads, and stealtime_basic tests respectively. The component initialization needs to be performed before the thread initialization. The order of initialization has been changed back to initializing the component then the threads. One complication is that papi_internal.c had functions (_papi_hwi_set_papi_event_code and _papi_hwi_get_papi_event_code) that required thread local storage that was being setup in commit 979e80136 by the thread initialization. This was the original reason for swapping the order of initialization of component and thread. Using __thread on the file scope declarations of the variables allow the original order of initialization. --- src/papi.c | 10 +++++----- src/papi_internal.c | 21 +++++++++++++-------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/papi.c b/src/papi.c index 33cc29935..107a15044 100644 --- a/src/papi.c +++ b/src/papi.c @@ -1151,19 +1151,19 @@ PAPI_library_init( int version ) papi_return( init_retval ); } - /* Initialize thread globals, including the main threads */ + /* Initialize component globals */ - tmp = _papi_hwi_init_global_threads( ); + tmp = _papi_hwi_init_global( ); if ( tmp ) { init_retval = tmp; _papi_hwi_shutdown_global_internal( ); - _in_papi_library_init_cnt--; + _in_papi_library_init_cnt--; papi_return( init_retval ); } - /* Initialize component globals */ + /* Initialize thread globals, including the main threads */ - tmp = _papi_hwi_init_global( ); + tmp = _papi_hwi_init_global_threads( ); if ( tmp ) { init_retval = tmp; _papi_hwi_shutdown_global_internal( ); diff --git a/src/papi_internal.c b/src/papi_internal.c index 5a1ccd433..bdf30f875 100644 --- a/src/papi_internal.c +++ b/src/papi_internal.c @@ -115,27 +115,32 @@ _papi_hwi_free_papi_event_string() { return; } +// A place to keep the current papi event code so some component functions can fetch its value +// The current event code can be stored here prior to component calls and cleared after the component returns +static THREAD_LOCAL_STORAGE_KEYWORD unsigned int papi_event_code = -1; +static THREAD_LOCAL_STORAGE_KEYWORD int papi_event_code_changed = -1; + void _papi_hwi_set_papi_event_code (unsigned int event_code, int update_flag) { - INTDBG("new event_code: %#x, update_flag: %d, previous event_code: %#x\n", event_code, update_flag, _papi_hwi_my_thread->tls_papi_event_code); + INTDBG("new event_code: %#x, update_flag: %d, previous event_code: %#x\n", event_code, update_flag, papi_event_code); // if call is just to reset and start over, set both flags to show nothing saved yet if (update_flag < 0) { - _papi_hwi_my_thread->tls_papi_event_code_changed = -1; - _papi_hwi_my_thread->tls_papi_event_code = -1; + papi_event_code_changed = -1; + papi_event_code = -1; return; } // if 0, it is being set prior to calling a component, if >0 it is being changed by the component - _papi_hwi_my_thread->tls_papi_event_code_changed = update_flag; + papi_event_code_changed = update_flag; // save the event code passed in - _papi_hwi_my_thread->tls_papi_event_code = event_code; + papi_event_code = event_code; return; } unsigned int _papi_hwi_get_papi_event_code () { - INTDBG("papi_event_code: %#x\n", _papi_hwi_my_thread->tls_papi_event_code); - return _papi_hwi_my_thread->tls_papi_event_code; + INTDBG("papi_event_code: %#x\n", papi_event_code); + return papi_event_code; } /* Get the index into the ESI->NativeInfoArray for the current PAPI event code */ int @@ -560,7 +565,7 @@ _papi_hwi_native_to_eventcode(int cidx, int event_code, int ntv_idx, const char int result; - if (_papi_hwi_my_thread->tls_papi_event_code_changed > 0) { + if (papi_event_code_changed > 0) { result = _papi_hwi_get_papi_event_code(); INTDBG("EXIT: papi_event_code: %#x set by the component\n", result); return result; -- 2.26.2