summaryrefslogtreecommitdiff
path: root/Zend/zend_list.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_list.c')
-rw-r--r--Zend/zend_list.c30
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