From: Antony Dovgal Date: Thu, 5 Oct 2006 15:06:11 +0000 (+0000) Subject: decrement ch->uses (or destroy handle) when destroying multi handle X-Git-Tag: RELEASE_1_0_0RC1~1407 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9adc8c3931b435ef0703a5bd44744934c3347248;p=php decrement ch->uses (or destroy handle) when destroying multi handle --- diff --git a/ext/curl/multi.c b/ext/curl/multi.c index 78387cd4af..d74711be47 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -62,7 +62,7 @@ PHP_FUNCTION(curl_multi_init) mh = ecalloc(1, sizeof(php_curlm)); mh->multi = curl_multi_init(); - zend_llist_init(&mh->easyh, sizeof(zval), (llist_dtor_func_t) NULL, 0); + zend_llist_init(&mh->easyh, sizeof(zval), _php_curl_multi_cleanup_list, 0); ZEND_REGISTER_RESOURCE(return_value, mh, le_curl_multi_handle); } @@ -98,6 +98,27 @@ PHP_FUNCTION(curl_multi_add_handle) } /* }}} */ +void _php_curl_multi_cleanup_list(void *data) /* {{{ */ +{ + zval *z_ch = (zval *)data; + php_curl *ch; + + if (!z_ch) { + return; + } + + ch = (php_curl *) zend_fetch_resource(&z_ch TSRMLS_CC, -1, le_curl_name, NULL, 1, le_curl); + if (!ch) { + return; + } + + if (ch->uses) { + ch->uses--; + } else { + zend_list_delete(Z_LVAL_P(z_ch)); + } +} +/* }}} */ /* Used internally as comparison routine passed to zend_list_del_element */ static int curl_compare_resources( zval *z1, zval **z2 ) diff --git a/ext/curl/php_curl.h b/ext/curl/php_curl.h index d0d80584f2..d6184c2465 100644 --- a/ext/curl/php_curl.h +++ b/ext/curl/php_curl.h @@ -138,6 +138,7 @@ typedef struct { } php_curlm; void _php_curl_cleanup_handle(php_curl *); +void _php_curl_multi_cleanup_list(void *data); /* streams support */