[OpenMP] libomp: change shm name to include UID, call unregister_lib on SIGTERM

With the change to using shared memory, there were a few problems that need to be fixed.
- The previous filename that was used for SHM only used process id. Given that process is
  usually based on 16bit number, this was causing some conflicts on machines. Thus we add
  UID to the name to prevent this.
- It appears under some conditions (SIGTERM, etc) the shared memory files were not getting
  cleaned up. Added a call to clean up the shm files under those conditions. For this user
  needs to set envirable KMP_HANDLE_SIGNALS to true.

Patch by Erdner, Todd <todd.erdner@intel.com>

Differential Revision: https://reviews.llvm.org/D91869
This commit is contained in:
Todd Erdner 2020-12-01 00:39:52 +03:00 committed by AndreyChurbanov
parent f6f28b44ad
commit 9615890db5
3 changed files with 7 additions and 1 deletions

View File

@ -3132,6 +3132,7 @@ extern void __kmp_internal_end_dest(void *);
extern int __kmp_register_root(int initial_thread); extern int __kmp_register_root(int initial_thread);
extern void __kmp_unregister_root(int gtid); extern void __kmp_unregister_root(int gtid);
extern void __kmp_unregister_library(void); // called by __kmp_internal_end()
extern int __kmp_ignore_mppbeg(void); extern int __kmp_ignore_mppbeg(void);
extern int __kmp_ignore_mppend(void); extern int __kmp_ignore_mppend(void);

View File

@ -98,7 +98,6 @@ static int __kmp_expand_threads(int nNeed);
#if KMP_OS_WINDOWS #if KMP_OS_WINDOWS
static int __kmp_unregister_root_other_thread(int gtid); static int __kmp_unregister_root_other_thread(int gtid);
#endif #endif
static void __kmp_unregister_library(void); // called by __kmp_internal_end()
static void __kmp_reap_thread(kmp_info_t *thread, int is_root); static void __kmp_reap_thread(kmp_info_t *thread, int is_root);
kmp_info_t *__kmp_thread_pool_insert_pt = NULL; kmp_info_t *__kmp_thread_pool_insert_pt = NULL;
@ -6360,7 +6359,12 @@ static inline char *__kmp_reg_status_name() {
each thread. If registration and unregistration go in different threads each thread. If registration and unregistration go in different threads
(omp_misc_other_root_exit.cpp test case), the name of registered_lib_env (omp_misc_other_root_exit.cpp test case), the name of registered_lib_env
env var can not be found, because the name will contain different pid. */ env var can not be found, because the name will contain different pid. */
#if KMP_OS_UNIX && KMP_DYNAMIC_LIB // shared memory is with dynamic library
return __kmp_str_format("__KMP_REGISTERED_LIB_%d_%d", (int)getpid(),
(int)getuid());
#else
return __kmp_str_format("__KMP_REGISTERED_LIB_%d", (int)getpid()); return __kmp_str_format("__KMP_REGISTERED_LIB_%d", (int)getpid());
#endif
} // __kmp_reg_status_get } // __kmp_reg_status_get
void __kmp_register_library_startup(void) { void __kmp_register_library_startup(void) {

View File

@ -1149,6 +1149,7 @@ static void __kmp_team_handler(int signo) {
if (__kmp_debug_buf) { if (__kmp_debug_buf) {
__kmp_dump_debug_buffer(); __kmp_dump_debug_buffer();
} }
__kmp_unregister_library(); // cleanup shared memory
KMP_MB(); // Flush all pending memory write invalidates. KMP_MB(); // Flush all pending memory write invalidates.
TCW_4(__kmp_global.g.g_abort, signo); TCW_4(__kmp_global.g.g_abort, signo);
KMP_MB(); // Flush all pending memory write invalidates. KMP_MB(); // Flush all pending memory write invalidates.