dmitry Tue Mar 14 15:16:27 2006 UTC Modified files: /TSRM TSRM.c TSRM.h /php-src/main main.c Log: Fixed bug #35988 (Unknown persistent list entry type in module shutdown) http://cvs.php.net/viewcvs.cgi/TSRM/TSRM.c?r1=1.70&r2=1.71&diff_format=u Index: TSRM/TSRM.c diff -u TSRM/TSRM.c:1.70 TSRM/TSRM.c:1.71 --- TSRM/TSRM.c:1.70 Wed Jan 4 23:54:12 2006 +++ TSRM/TSRM.c Tue Mar 14 15:16:27 2006 @@ -480,6 +480,52 @@ } +/* 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) { http://cvs.php.net/viewcvs.cgi/TSRM/TSRM.h?r1=1.51&r2=1.52&diff_format=u Index: TSRM/TSRM.h diff -u TSRM/TSRM.h:1.51 TSRM/TSRM.h:1.52 --- TSRM/TSRM.h:1.51 Wed Jan 4 23:54:12 2006 +++ TSRM/TSRM.h Tue Mar 14 15:16:27 2006 @@ -106,6 +106,9 @@ /* 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); http://cvs.php.net/viewcvs.cgi/php-src/main/main.c?r1=1.673&r2=1.674&diff_format=u Index: php-src/main/main.c diff -u php-src/main/main.c:1.673 php-src/main/main.c:1.674 --- php-src/main/main.c:1.673 Mon Mar 13 09:36:05 2006 +++ php-src/main/main.c Tue Mar 14 15:16:27 2006 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: main.c,v 1.673 2006/03/13 09:36:05 dmitry Exp $ */ +/* $Id: main.c,v 1.674 2006/03/14 15:16:27 dmitry Exp $ */ /* {{{ includes */ @@ -1699,6 +1699,10 @@ return; } +#ifdef ZTS + ts_free_worker_threads(); +#endif + #if defined(PHP_WIN32) || (defined(NETWARE) && defined(USE_WINSOCK)) /*close winsock */ WSACleanup();
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php