diff options
author | Pavlo Yatsukhnenko <yatsukhnenko@gmail.com> | 2019-02-22 10:42:50 +0300 |
---|---|---|
committer | michael-grunder <michael.grunder@gmail.com> | 2019-03-19 23:32:52 +0300 |
commit | c83e5238a7bd5e860e24536ce05140087a6532c8 (patch) | |
tree | 9cd757c1245abc3c969dbdd80411234a3de26bce /library.c | |
parent | 09f3abb6a32596d5a6b7fec1a80d733682bdfce3 (diff) |
Refactor connection pooling code.
Move logic of searching+creating connection pool resource to `redis_sock_get_connection_pool`.
Don't close streams in ZEND_RSRC_DTOR_FUNC because all of them stored in `EG(persistent_list)`
and will be destroyed by PHP engine.
Diffstat (limited to 'library.c')
-rw-r--r-- | library.c | 18 |
1 files changed, 4 insertions, 14 deletions
@@ -46,7 +46,7 @@ extern zend_class_entry *redis_exception_ce; extern int le_redis_pconnect; static zend_llist * -redis_sock_get_connection_pool(RedisSock *redis_sock TSRMLS_DC) +redis_sock_get_connection_pool(RedisSock *redis_sock) { zend_string *persistent_id = strpprintf(0, "phpredis_%s:%d", ZSTR_VAL(redis_sock->host), redis_sock->port); zend_resource *le = zend_hash_find_ptr(&EG(persistent_list), persistent_id); @@ -1718,7 +1718,7 @@ PHP_REDIS_API int redis_sock_connect(RedisSock *redis_sock TSRMLS_DC) if (redis_sock->persistent) { if (INI_INT("redis.pconnect.pooling_enabled")) { - zend_llist *list = redis_sock_get_connection_pool(redis_sock TSRMLS_CC); + zend_llist *list = redis_sock_get_connection_pool(redis_sock); if (zend_llist_count(list) > 0) { redis_sock->stream = *(php_stream **)zend_llist_get_last(list); zend_llist_remove_tail(list); @@ -1822,18 +1822,8 @@ redis_sock_disconnect(RedisSock *redis_sock, int force TSRMLS_DC) if (force) { php_stream_pclose(redis_sock->stream); } else if (INI_INT("redis.pconnect.pooling_enabled")) { - zend_string *persistent_id = strpprintf(0, "phpredis_%s:%d", ZSTR_VAL(redis_sock->host), redis_sock->port); - zend_resource *le = zend_hash_find_ptr(&EG(persistent_list), persistent_id); - if (!le) { - zend_llist *l = pecalloc(1, sizeof(*l) + sizeof(*le), 1); - zend_llist_init(l, sizeof(php_stream *), NULL, 1); - le = (zend_resource *)((char *)l + sizeof(*l)); - le->type = le_redis_pconnect; - le->ptr = l; - zend_hash_str_update_mem(&EG(persistent_list), ZSTR_VAL(persistent_id), ZSTR_LEN(persistent_id), le, sizeof(*le)); - } - zend_llist_prepend_element(le->ptr, &redis_sock->stream); - zend_string_release(persistent_id); + zend_llist *list = redis_sock_get_connection_pool(redis_sock); + zend_llist_prepend_element(list, &redis_sock->stream); } } else { php_stream_close(redis_sock->stream); |