diff --git a/TSRM/TSRM.c b/TSRM/TSRM.c index 81136bee4daa9..94cff4d833531 100644 --- a/TSRM/TSRM.c +++ b/TSRM/TSRM.c @@ -65,6 +65,8 @@ static MUTEX_T tsrm_env_mutex; /* tsrm environ mutex */ /* New thread handlers */ static tsrm_thread_begin_func_t tsrm_new_thread_begin_handler = NULL; static tsrm_thread_end_func_t tsrm_new_thread_end_handler = NULL; +static tsrm_thread_free_begin_func_t tsrm_free_thread_begin_handler = NULL; +static tsrm_thread_free_end_func_t tsrm_free_thread_end_handler = NULL; static tsrm_shutdown_func_t tsrm_shutdown_handler = NULL; /* Debug support */ @@ -228,6 +230,8 @@ TSRM_API void tsrm_shutdown(void) } tsrm_new_thread_begin_handler = NULL; tsrm_new_thread_end_handler = NULL; + tsrm_free_thread_begin_handler = NULL; + tsrm_free_thread_end_handler = NULL; tsrm_shutdown_handler = NULL; tsrm_reserved_pos = 0; @@ -516,6 +520,10 @@ void ts_free_thread(void) TSRM_ASSERT(!in_main_thread); + if (tsrm_free_thread_begin_handler) { + tsrm_free_thread_begin_handler(thread_id); + } + tsrm_mutex_lock(tsmm_mutex); hash_value = THREAD_HASH_OF(thread_id, tsrm_tls_table_size); thread_resources = tsrm_tls_table[hash_value]; @@ -538,6 +546,10 @@ void ts_free_thread(void) thread_resources = thread_resources->next; } tsrm_mutex_unlock(tsmm_mutex); + + if (tsrm_free_thread_end_handler) { + tsrm_free_thread_end_handler(thread_id); + } }/*}}}*/ /* deallocates all occurrences of a given id */ @@ -711,6 +723,24 @@ TSRM_API void *tsrm_set_new_thread_end_handler(tsrm_thread_end_func_t new_thread }/*}}}*/ +TSRM_API void *tsrm_set_free_thread_begin_handler(tsrm_thread_free_begin_func_t free_thread_begin_handler) +{/*{{{*/ + void *retval = (void *) tsrm_free_thread_begin_handler; + + tsrm_free_thread_begin_handler = free_thread_begin_handler; + return retval; +}/*}}}*/ + + +TSRM_API void *tsrm_set_free_thread_end_handler(tsrm_thread_free_end_func_t free_thread_end_handler) +{/*{{{*/ + void *retval = (void *) tsrm_free_thread_end_handler; + + tsrm_free_thread_end_handler = free_thread_end_handler; + return retval; +}/*}}}*/ + + TSRM_API void *tsrm_set_shutdown_handler(tsrm_shutdown_func_t shutdown_handler) {/*{{{*/ void *retval = (void *) tsrm_shutdown_handler; diff --git a/TSRM/TSRM.h b/TSRM/TSRM.h index 80d6cbad04435..543e59e8d5ae7 100644 --- a/TSRM/TSRM.h +++ b/TSRM/TSRM.h @@ -115,9 +115,10 @@ TSRM_API void ts_apply_for_id(ts_rsrc_id id, void (*cb)(void *)); typedef void (*tsrm_thread_begin_func_t)(THREAD_T thread_id); typedef void (*tsrm_thread_end_func_t)(THREAD_T thread_id); +typedef void (*tsrm_thread_free_begin_func_t)(THREAD_T thread_id); +typedef void (*tsrm_thread_free_end_func_t)(THREAD_T thread_id); typedef void (*tsrm_shutdown_func_t)(void); - TSRM_API int tsrm_error(int level, const char *format, ...); TSRM_API void tsrm_error_set(int level, const char *debug_filename); @@ -133,6 +134,8 @@ TSRM_API int tsrm_sigmask(int how, const sigset_t *set, sigset_t *oldset); TSRM_API void *tsrm_set_new_thread_begin_handler(tsrm_thread_begin_func_t new_thread_begin_handler); TSRM_API void *tsrm_set_new_thread_end_handler(tsrm_thread_end_func_t new_thread_end_handler); +TSRM_API void *tsrm_set_free_thread_begin_handler(tsrm_thread_free_begin_func_t free_thread_begin_handler); +TSRM_API void *tsrm_set_free_thread_end_handler(tsrm_thread_free_end_func_t free_thread_end_handler); TSRM_API void *tsrm_set_shutdown_handler(tsrm_shutdown_func_t shutdown_handler); TSRM_API void *tsrm_get_ls_cache(void);