diff options
Diffstat (limited to 'Zend/zend_list.c')
-rw-r--r-- | Zend/zend_list.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/Zend/zend_list.c b/Zend/zend_list.c index 25e185946e..c3401d85c0 100644 --- a/Zend/zend_list.c +++ b/Zend/zend_list.c @@ -337,6 +337,36 @@ const char *zend_rsrc_list_get_rsrc_type(zend_resource *res) } } +ZEND_API zend_resource* zend_register_persistent_resource_ex(zend_string *key, void *rsrc_pointer, int rsrc_type) +{ + zval *zv; + zval tmp; + + ZVAL_NEW_PERSISTENT_RES(&tmp, -1, rsrc_pointer, rsrc_type); + GC_MAKE_PERSISTENT_LOCAL(Z_COUNTED(tmp)); + GC_MAKE_PERSISTENT_LOCAL(key); + + zv = zend_hash_update(&EG(persistent_list), key, &tmp); + if (UNEXPECTED(zv == NULL)) { + free(Z_RES(tmp)); + return NULL; + } + + return Z_RES_P(zv); +} + +ZEND_API zend_resource* zend_register_persistent_resource(const char *key, size_t key_len, void *rsrc_pointer, int rsrc_type) +{ + zend_string *str = zend_string_init(key, key_len, 1); + zend_resource *ret = zend_register_persistent_resource_ex(str, rsrc_pointer, rsrc_type); + + if (UNEXPECTED(ret == NULL)) { + free(str); + } + + return ret; +} + /* * Local variables: * tab-width: 4 |