diff options
author | Dmitry Stogov <dmitry@php.net> | 2006-03-14 15:16:27 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2006-03-14 15:16:27 +0000 |
commit | e4aa6e302e99cd88225209e252529e5e8920a235 (patch) | |
tree | bb237b155a5251b91bfa720296a25182ed8ad2e6 /TSRM | |
parent | 49ec971d85fd6e34b9c1ad8ba76fa94a8c980e1e (diff) | |
download | php-git-e4aa6e302e99cd88225209e252529e5e8920a235.tar.gz |
Fixed bug #35988 (Unknown persistent list entry type in module shutdown)
Diffstat (limited to 'TSRM')
-rw-r--r-- | TSRM/TSRM.c | 46 | ||||
-rw-r--r-- | TSRM/TSRM.h | 3 |
2 files changed, 49 insertions, 0 deletions
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; i<thread_resources->count; i++) { + if (resource_types_table[i].dtor) { + resource_types_table[i].dtor(thread_resources->storage[i], &thread_resources->storage); + } + } + for (i=0; i<thread_resources->count; 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); |