From e4aa6e302e99cd88225209e252529e5e8920a235 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 14 Mar 2006 15:16:27 +0000 Subject: [PATCH] Fixed bug #35988 (Unknown persistent list entry type in module shutdown) --- TSRM/TSRM.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ TSRM/TSRM.h | 3 +++ main/main.c | 4 ++++ 3 files changed, 53 insertions(+) diff --git a/TSRM/TSRM.c b/TSRM/TSRM.c index c07d606684..8acf0698a9 100644 --- a/TSRM/TSRM.c +++ b/TSRM/TSRM.c @@ -480,6 +480,52 @@ void ts_free_thread(void) } +/* frees all resources allocated for all threads except current */ +void ts_free_worker_threads(void) +{ + tsrm_tls_entry *thread_resources; + int i; + THREAD_T thread_id = tsrm_thread_id(); + int hash_value; + tsrm_tls_entry *last=NULL; + + tsrm_mutex_lock(tsmm_mutex); + hash_value = THREAD_HASH_OF(thread_id, tsrm_tls_table_size); + thread_resources = tsrm_tls_table[hash_value]; + + while (thread_resources) { + if (thread_resources->thread_id != thread_id) { + for (i=0; icount; i++) { + if (resource_types_table[i].dtor) { + resource_types_table[i].dtor(thread_resources->storage[i], &thread_resources->storage); + } + } + for (i=0; icount; i++) { + free(thread_resources->storage[i]); + } + free(thread_resources->storage); + if (last) { + last->next = thread_resources->next; + } else { + tsrm_tls_table[hash_value] = thread_resources->next; + } + free(thread_resources); + if (last) { + thread_resources = last->next; + } else { + thread_resources = tsrm_tls_table[hash_value]; + } + } else { + if (thread_resources->next) { + last = thread_resources; + } + thread_resources = thread_resources->next; + } + } + tsrm_mutex_unlock(tsmm_mutex); +} + + /* deallocates all occurrences of a given id */ void ts_free_id(ts_rsrc_id id) { diff --git a/TSRM/TSRM.h b/TSRM/TSRM.h index 056089aa94..2eecd52b6e 100644 --- a/TSRM/TSRM.h +++ b/TSRM/TSRM.h @@ -106,6 +106,9 @@ TSRM_API void *ts_resource_ex(ts_rsrc_id id, THREAD_T *th_id); /* frees all resources allocated for the current thread */ TSRM_API void ts_free_thread(void); +/* frees all resources allocated for all threads except current */ +void ts_free_worker_threads(void); + /* deallocates all occurrences of a given id */ TSRM_API void ts_free_id(ts_rsrc_id id); diff --git a/main/main.c b/main/main.c index 55f018efa9..e91ec291b5 100644 --- a/main/main.c +++ b/main/main.c @@ -1699,6 +1699,10 @@ void php_module_shutdown(TSRMLS_D) return; } +#ifdef ZTS + ts_free_worker_threads(); +#endif + #if defined(PHP_WIN32) || (defined(NETWARE) && defined(USE_WINSOCK)) /*close winsock */ WSACleanup(); -- 2.40.0