From: Dmitry Stogov Date: Thu, 10 Apr 2014 22:21:06 +0000 (+0400) Subject: Introduced API to close all resources at once X-Git-Tag: POST_PHPNG_MERGE~412^2~128^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=98350cdceaca6eb16c32903e07486568f54b380d;p=php Introduced API to close all resources at once --- diff --git a/Zend/zend_list.c b/Zend/zend_list.c index 2566eb6d2e..30d07aed37 100644 --- a/Zend/zend_list.c +++ b/Zend/zend_list.c @@ -50,33 +50,40 @@ ZEND_API int _zend_list_delete(zend_resource *res TSRMLS_DC) } } + +static void zend_resource_dtor(zend_resource *res TSRMLS_DC) +{ + zend_rsrc_list_dtors_entry *ld; + + ld = zend_hash_index_find_ptr(&list_destructors, res->type); + if (ld) { + switch (ld->type) { + case ZEND_RESOURCE_LIST_TYPE_STD: + if (ld->list_dtor) { + (ld->list_dtor)(res->ptr); + } + break; + case ZEND_RESOURCE_LIST_TYPE_EX: + if (ld->list_dtor_ex) { + ld->list_dtor_ex(res TSRMLS_CC); + } + break; + EMPTY_SWITCH_DEFAULT_CASE() + } + } else { + zend_error(E_WARNING,"Unknown list entry type (%d)", res->type); + } + res->ptr = NULL; + res->type = -1; +} + + ZEND_API int _zend_list_close(zend_resource *res TSRMLS_DC) { if (GC_REFCOUNT(res) <= 0) { return zend_list_delete(res); } else if (res->type >= 0) { - zend_rsrc_list_dtors_entry *ld; - - ld = zend_hash_index_find_ptr(&list_destructors, res->type); - if (ld) { - switch (ld->type) { - case ZEND_RESOURCE_LIST_TYPE_STD: - if (ld->list_dtor) { - (ld->list_dtor)(res->ptr); - } - break; - case ZEND_RESOURCE_LIST_TYPE_EX: - if (ld->list_dtor_ex) { - ld->list_dtor_ex(res TSRMLS_CC); - } - break; - EMPTY_SWITCH_DEFAULT_CASE() - } - } else { - zend_error(E_WARNING,"Unknown list entry type in request shutdown (%d)", res->type); - } - res->ptr = NULL; - res->type = -1; + zend_resource_dtor(res TSRMLS_CC); } return SUCCESS; } @@ -157,27 +164,9 @@ void list_entry_destructor(zval *zv) zend_resource *res = Z_RES_P(zv); if (res->type >= 0) { - zend_rsrc_list_dtors_entry *ld; TSRMLS_FETCH(); - ld = zend_hash_index_find_ptr(&list_destructors, res->type); - if (ld) { - switch (ld->type) { - case ZEND_RESOURCE_LIST_TYPE_STD: - if (ld->list_dtor) { - (ld->list_dtor)(res->ptr); - } - break; - case ZEND_RESOURCE_LIST_TYPE_EX: - if (ld->list_dtor_ex) { - ld->list_dtor_ex(res TSRMLS_CC); - } - break; - EMPTY_SWITCH_DEFAULT_CASE() - } - } else { - zend_error(E_WARNING,"Unknown list entry type in request shutdown (%d)", res->type); - } + zend_resource_dtor(res TSRMLS_CC); } efree(res); } @@ -188,23 +177,8 @@ void plist_entry_destructor(zval *zv) zend_rsrc_list_dtors_entry *ld; TSRMLS_FETCH(); - ld = zend_hash_index_find_ptr(&list_destructors, res->type); - if (ld) { - switch (ld->type) { - case ZEND_RESOURCE_LIST_TYPE_STD: - if (ld->plist_dtor) { - (ld->plist_dtor)(res->ptr); - } - break; - case ZEND_RESOURCE_LIST_TYPE_EX: - if (ld->plist_dtor_ex) { - ld->plist_dtor_ex(res TSRMLS_CC); - } - break; - EMPTY_SWITCH_DEFAULT_CASE() - } - } else { - zend_error(E_WARNING,"Unknown persistent list entry type in module shutdown (%d)", res->type); + if (res->type >= 0) { + zend_resource_dtor(res TSRMLS_CC); } free(res); } @@ -226,6 +200,23 @@ int zend_init_rsrc_plist(TSRMLS_D) } +static int zend_close_rsrc(zval *zv TSRMLS_DC) +{ + zend_resource *res = Z_PTR_P(zv); + + if (res->type >= 0) { + zend_resource_dtor(res TSRMLS_CC); + } + return ZEND_HASH_APPLY_KEEP; +} + + +void zend_close_rsrc_list(HashTable *ht TSRMLS_DC) +{ + zend_hash_reverse_apply(ht, zend_close_rsrc TSRMLS_CC); +} + + void zend_destroy_rsrc_list(HashTable *ht TSRMLS_DC) { zend_hash_graceful_reverse_destroy(ht); diff --git a/Zend/zend_list.h b/Zend/zend_list.h index c58905aa1f..a9f96addb6 100644 --- a/Zend/zend_list.h +++ b/Zend/zend_list.h @@ -60,6 +60,7 @@ void plist_entry_destructor(zval *ptr); void zend_clean_module_rsrc_dtors(int module_number TSRMLS_DC); int zend_init_rsrc_list(TSRMLS_D); int zend_init_rsrc_plist(TSRMLS_D); +void zend_close_rsrc_list(HashTable *ht TSRMLS_DC); void zend_destroy_rsrc_list(HashTable *ht TSRMLS_DC); int zend_init_rsrc_list_dtors(void); void zend_destroy_rsrc_list_dtors(void);