summaryrefslogtreecommitdiff
path: root/Zend/zend_list.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2017-11-01 15:19:31 +0300
committerDmitry Stogov <dmitry@zend.com>2017-11-01 15:19:31 +0300
commit67d5f39a47b15e28293d9d6558b80ded049179fe (patch)
treee8f11a2a68bb06f259e8e3eeed5b102884df9fa6 /Zend/zend_list.c
parentf5664a149260ed4a83aa5cfb13ad11ed18c56af6 (diff)
downloadphp-git-67d5f39a47b15e28293d9d6558b80ded049179fe.tar.gz
Persistent resources are "thread-local".
Register persistent resources through new functions zend_register_persistent_resource()/zend_register_persistent_resource_ex().
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