papi/SOURCES/papi-thread_init.patch

140 lines
5.6 KiB
Diff

commit 617eeabe0bbfb5357c10b22ebd72b24a4a872e52
Author: Anthony <adanalis@icl.utk.edu>
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 <wcohen@redhat.com>
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