Skip to content

Commit

Permalink
core/logging: Fix data race on log_prefix
Browse files Browse the repository at this point in the history
In ofi_get_core_info, which is supposed to be thread safe ("Multiple
threads may call fi_getinfo simultaneously, without any requirement for
serialization."), a global variable 'log_prefix' is modified, which may
lead to a data race. Changing the variable to a thread local one, fixes
that problem.

Signed-off-by: Dariusz Sciebura <[email protected]>
  • Loading branch information
dsciebu committed Jan 13, 2025
1 parent 2a320f1 commit 116a868
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 2 deletions.
2 changes: 1 addition & 1 deletion include/ofi.h
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ struct ofi_filter {

extern struct ofi_filter prov_log_filter;
extern struct fi_provider core_prov;
extern const char *log_prefix;
extern OFI_THREAD_LOCAL const char *log_prefix;

void ofi_create_filter(struct ofi_filter *filter, const char *env_name);
void ofi_free_filter(struct ofi_filter *filter);
Expand Down
16 changes: 16 additions & 0 deletions include/unix/osd.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,22 @@

#define OFI_MAX_SOCKET_BUF_SIZE SIZE_MAX

#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L)
// C23 and above: use thread_local directly
#define OFI_THREAD_LOCAL thread_local
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201102L) && defined(_Thread_local)
// C11: use _Thread_local
#define OFI_THREAD_LOCAL _Thread_local
#elif defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__SUNPRO_CC) || defined(__IBMCPP__) || defined(__clang__)
// GCC/Clang/Intel/SunPro/IBM compilers
#define OFI_THREAD_LOCAL __thread
#else
// Unsupported compiler
#warning "Thread-local storage is not supported on this platform"
#define OFI_THREAD_LOCAL
#endif


struct util_shm
{
int shared_fd;
Expand Down
17 changes: 17 additions & 0 deletions include/windows/osd.h
Original file line number Diff line number Diff line change
Expand Up @@ -1141,6 +1141,23 @@ ofi_cpuid(unsigned func, unsigned subfunc, unsigned cpuinfo[4])

#endif /* defined(_M_X64) || defined(_M_AMD64) */

#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L)
// C23 and above: use thread_local directly
#define OFI_THREAD_LOCAL thread_local
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201102L) && defined(_Thread_local)
// C11: use _Thread_local
#define OFI_THREAD_LOCAL _Thread_local
#elif defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__SUNPRO_CC) || defined(__IBMCPP__) || defined(__clang__)
// GCC/Clang/Intel/SunPro/IBM compilers
#define OFI_THREAD_LOCAL __thread
#elif defined(_MSC_VER)
// Microsoft Visual C++ compiler
#define OFI_THREAD_LOCAL __declspec(thread)
#else
// Unsupported compiler
#warning "Thread-local storage is not supported on this platform"
#define OFI_THREAD_LOCAL
#endif

#ifdef __cplusplus
}
Expand Down
2 changes: 1 addition & 1 deletion src/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -2429,4 +2429,4 @@ size_t ofi_vrb_speed(uint8_t speed, uint8_t width)
}

/* log_prefix is used by fi_log and by prov/util */
const char *log_prefix = "";
OFI_THREAD_LOCAL const char *log_prefix = "";

0 comments on commit 116a868

Please sign in to comment.