Introduced API to close all resources at once

This commit is contained in:
Dmitry Stogov 2014-04-11 02:21:06 +04:00
parent a9599c9512
commit 98350cdcea
2 changed files with 50 additions and 58 deletions

View file

@ -50,11 +50,9 @@ ZEND_API int _zend_list_delete(zend_resource *res TSRMLS_DC)
} }
} }
ZEND_API int _zend_list_close(zend_resource *res TSRMLS_DC)
static void zend_resource_dtor(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; zend_rsrc_list_dtors_entry *ld;
ld = zend_hash_index_find_ptr(&list_destructors, res->type); ld = zend_hash_index_find_ptr(&list_destructors, res->type);
@ -73,10 +71,19 @@ ZEND_API int _zend_list_close(zend_resource *res TSRMLS_DC)
EMPTY_SWITCH_DEFAULT_CASE() EMPTY_SWITCH_DEFAULT_CASE()
} }
} else { } else {
zend_error(E_WARNING,"Unknown list entry type in request shutdown (%d)", res->type); zend_error(E_WARNING,"Unknown list entry type (%d)", res->type);
} }
res->ptr = NULL; res->ptr = NULL;
res->type = -1; 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_resource_dtor(res TSRMLS_CC);
} }
return SUCCESS; return SUCCESS;
} }
@ -157,27 +164,9 @@ void list_entry_destructor(zval *zv)
zend_resource *res = Z_RES_P(zv); zend_resource *res = Z_RES_P(zv);
if (res->type >= 0) { if (res->type >= 0) {
zend_rsrc_list_dtors_entry *ld;
TSRMLS_FETCH(); TSRMLS_FETCH();
ld = zend_hash_index_find_ptr(&list_destructors, res->type); zend_resource_dtor(res TSRMLS_CC);
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);
}
} }
efree(res); efree(res);
} }
@ -188,23 +177,8 @@ void plist_entry_destructor(zval *zv)
zend_rsrc_list_dtors_entry *ld; zend_rsrc_list_dtors_entry *ld;
TSRMLS_FETCH(); TSRMLS_FETCH();
ld = zend_hash_index_find_ptr(&list_destructors, res->type); if (res->type >= 0) {
if (ld) { zend_resource_dtor(res TSRMLS_CC);
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);
} }
free(res); 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) void zend_destroy_rsrc_list(HashTable *ht TSRMLS_DC)
{ {
zend_hash_graceful_reverse_destroy(ht); zend_hash_graceful_reverse_destroy(ht);

View file

@ -60,6 +60,7 @@ void plist_entry_destructor(zval *ptr);
void zend_clean_module_rsrc_dtors(int module_number TSRMLS_DC); void zend_clean_module_rsrc_dtors(int module_number TSRMLS_DC);
int zend_init_rsrc_list(TSRMLS_D); int zend_init_rsrc_list(TSRMLS_D);
int zend_init_rsrc_plist(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); void zend_destroy_rsrc_list(HashTable *ht TSRMLS_DC);
int zend_init_rsrc_list_dtors(void); int zend_init_rsrc_list_dtors(void);
void zend_destroy_rsrc_list_dtors(void); void zend_destroy_rsrc_list_dtors(void);