diff --git a/src/H5TSint.c b/src/H5TSint.c index a2761bb2ad3..322b7fe98c0 100644 --- a/src/H5TSint.c +++ b/src/H5TSint.c @@ -133,10 +133,12 @@ H5TS__init(void) /*------------------------------------------------------------------------- * Function: H5TS_term_package * - * Purpose: Terminate this interface. + * Purpose: Terminate this interface. Clean up global resources shared by + * all threads. * * Note: This function is currently registered via atexit() and is called - * AFTER H5_term_library(). + * AFTER H5_term_library(). H5TS_top_term_package() is called at library + * termination to clean up per-thread resources. * * Return: void * @@ -151,9 +153,6 @@ H5TS_term_package(void) H5TS_mutex_destroy(&H5TS_api_info_p.api_mutex); H5TS_atomic_destroy_uint(&H5TS_api_info_p.attempt_lock_count); - /* Clean up per-thread library info */ - H5TS__tinfo_term(); - FUNC_LEAVE_NOAPI_VOID } /* end H5TS_term_package() */ @@ -535,6 +534,30 @@ H5TS__tinfo_destroy(void *_tinfo_node) FUNC_LEAVE_NOAPI_VOID_NAMECHECK_ONLY } +/*-------------------------------------------------------------------------- + * Function: H5TS_top_term_package + * + * Purpose: Terminate the threadlocal parts of the H5TS interface during library terminaton. + * + * Note: See H5TS_term_package for termination of the thread-global resources + * + * Return: Non-negative on success / Negative on failure + * + *-------------------------------------------------------------------------- + */ +int +H5TS_top_term_package(void) +{ + int n = 0; + + FUNC_ENTER_NOAPI_NOINIT_NOERR + + /* Clean up per-thread library info */ + H5TS__tinfo_term(); + + FUNC_LEAVE_NOAPI(n) +} + /*-------------------------------------------------------------------------- * Function: H5TS__tinfo_term * @@ -562,14 +585,13 @@ H5TS__tinfo_term(void) if (H5_UNLIKELY(H5TS_mutex_unlock(&H5TS_tinfo_mtx_s) < 0)) HGOTO_DONE(FAIL); - /* Release critical section / mutex for modifying the thread info globals */ - if (H5_UNLIKELY(H5TS_mutex_destroy(&H5TS_tinfo_mtx_s) < 0)) - HGOTO_DONE(FAIL); - /* Release key for thread-specific API contexts */ if (H5_UNLIKELY(H5TS_key_delete(H5TS_thrd_info_key_g) < 0)) HGOTO_DONE(FAIL); + /* Release critical section / mutex for modifying the thread info globals */ + if (H5_UNLIKELY(H5TS_mutex_destroy(&H5TS_tinfo_mtx_s) < 0)) + HGOTO_DONE(FAIL); done: FUNC_LEAVE_NOAPI_NAMECHECK_ONLY(ret_value) } /* end H5TS__tinfo_term() */ diff --git a/src/H5TSprivate.h b/src/H5TSprivate.h index d2be12414d6..64fd567a9bb 100644 --- a/src/H5TSprivate.h +++ b/src/H5TSprivate.h @@ -276,6 +276,7 @@ typedef atomic_flag H5TS_spinlock_t; #ifdef H5_HAVE_THREADSAFE /* Library/thread init/term operations */ H5_DLL void H5TS_term_package(void); +H5_DLL int H5TS_top_term_package(void); /* API locking */ H5_DLL herr_t H5TS_api_lock(void);