From: Michael Wallner Date: Wed, 8 Jun 2005 10:40:24 +0000 (+0000) Subject: - move request_poolobject_dtor to request_pool_object_detach_all() (public API) X-Git-Tag: RELEASE_0_9_0~41 X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=commitdiff_plain;h=2269e8e11a6837fc165ae85406ea6db84c1995cc;hp=b272c1e03de58ff0c01f78421b824c7f45d43959 - move request_poolobject_dtor to request_pool_object_detach_all() (public API) - add HttpRequestPool::reset() - add debugging code to request_pool API --- diff --git a/http_methods.c b/http_methods.c index 053fce7..e10923b 100644 --- a/http_methods.c +++ b/http_methods.c @@ -2143,7 +2143,7 @@ PHP_METHOD(HttpRequest, send) /* {{{ HttpRequestPool */ -/* {{{ proto void HttpRequestPool::__construct(void) +/* {{{ proto void HttpRequestPool::__construct() * * Instantiate a new HttpRequestPool object. */ @@ -2153,13 +2153,31 @@ PHP_METHOD(HttpRequestPool, __construct) } /* }}} */ +/* {{{ proto void HttpRequestPool::__destruct() + * + * Clean up HttpRequestPool object. + */ PHP_METHOD(HttpRequestPool, __destruct) { getObject(http_requestpool_object, obj); - + + NO_ARGS; + + http_request_pool_detach_all(&obj->pool); +} +/* }}} */ + +/* {{{ proto void HttpRequestPool::reset() + * + * Detach all attached HttpRequest objects. + */ +PHP_METHOD(HttpRequestPool, reset) +{ + getObject(http_requestpool_object, obj); + NO_ARGS; - - http_requestpool_object_ondestruct(&obj->pool); + + http_request_pool_detach_all(&obj->pool); } /* {{{ proto bool HttpRequestPool::attach(HttpRequest request) diff --git a/http_request_api.c b/http_request_api.c index 5a90936..b41e020 100644 --- a/http_request_api.c +++ b/http_request_api.c @@ -40,6 +40,10 @@ # define HTTP_CURL_USE_ZEND_MM 0 #endif +#ifndef HTTP_DEBUG_REQPOOLS +# define HTTP_DEBUG_REQPOOLS 0 +#endif + ZEND_EXTERN_MODULE_GLOBALS(http) #if LIBCURL_VERSION_NUM < 0x070c00 @@ -124,7 +128,7 @@ typedef struct { static http_curl_callback_ctx *_http_curl_callback_data(void *data TSRMLS_DC); static void http_request_pool_freebody(http_request_body **body); -static void http_request_pool_freehandle(zval **request); +static void http_request_pool_freehandle(zval **request, http_request_pool *pool TSRMLS_DC); static void http_request_pool_responsehandler(zval **req TSRMLS_DC); static inline STATUS http_request_pool_select(http_request_pool *pool); static inline void http_request_pool_perform(http_request_pool *pool); @@ -803,7 +807,9 @@ PHP_HTTP_API STATUS _http_request_method_unregister(unsigned long method TSRMLS_ PHP_HTTP_API http_request_pool *_http_request_pool_init(http_request_pool *pool TSRMLS_DC) { zend_bool free_pool; - +#if HTTP_DEBUG_REQPOOLS + fprintf(stderr, "Initializing request pool\n"); +#endif if ((free_pool = (!pool))) { pool = emalloc(sizeof(http_request_pool)); pool->ch = NULL; @@ -822,7 +828,9 @@ PHP_HTTP_API http_request_pool *_http_request_pool_init(http_request_pool *pool pool->unfinished = 0; zend_llist_init(&pool->handles, sizeof(zval *), (llist_dtor_func_t) ZVAL_PTR_DTOR, 0); zend_llist_init(&pool->bodies, sizeof(http_request_body *), (llist_dtor_func_t) http_request_pool_freebody, 0); - +#if HTTP_DEBUG_REQPOOLS + fprintf(stderr, "Initialized request pool %p\n", pool); +#endif return pool; } /* }}} */ @@ -831,7 +839,9 @@ PHP_HTTP_API http_request_pool *_http_request_pool_init(http_request_pool *pool PHP_HTTP_API STATUS _http_request_pool_attach(http_request_pool *pool, zval *request TSRMLS_DC) { getObjectEx(http_request_object, req, request); - +#if HTTP_DEBUG_REQPOOLS + fprintf(stderr, "Attaching request %p to pool %p\n", req, pool); +#endif if (req->pool) { http_error(E_WARNING, HTTP_E_CURL, "HttpRequest object is already member of an HttpRequestPool"); } else { @@ -860,9 +870,11 @@ PHP_HTTP_API STATUS _http_request_pool_attach(http_request_pool *pool, zval *req PHP_HTTP_API STATUS _http_request_pool_detach(http_request_pool *pool, zval *request TSRMLS_DC) { getObjectEx(http_request_object, req, request); - +#if HTTP_DEBUG_REQPOOLS + fprintf(stderr, "Detaching request %p (pool: %p) from pool %p\n", req, req->pool, pool); +#endif if (req->pool != pool) { - http_error(E_WARNING, HTTP_E_CURL, "HttpRequest object is not attached to this HttpRequestPool"); + http_error_ex(E_WARNING, HTTP_E_CURL, "HttpRequest object is not attached to this HttpRequestPool (%p != %p)", req->pool, pool); } else { CURLMcode code; @@ -878,11 +890,27 @@ PHP_HTTP_API STATUS _http_request_pool_detach(http_request_pool *pool, zval *req } /* }}} */ +/* {{{ void http_request_pool_detach_all(http_request_pool *) */ +PHP_HTTP_API void _http_request_pool_detach_all(http_request_pool *pool TSRMLS_DC) +{ +#if HTTP_DEBUG_REQPOOLS + fprintf(stderr, "Detaching all requests from pool %p\n", pool); +#endif + zend_llist_apply_with_argument(&pool->handles, (llist_apply_with_arg_func_t) http_request_pool_freehandle, pool TSRMLS_CC); +} + + /* {{{ STATUS http_request_pool_send(http_request_pool *) */ PHP_HTTP_API STATUS _http_request_pool_send(http_request_pool *pool TSRMLS_DC) { +#if HTTP_DEBUG_REQPOOLS + fprintf(stderr, "Attempt to send requests of pool %p\n", pool); +#endif http_request_pool_perform(pool); while (pool->unfinished) { +#if HTTP_DEBUG_REQPOOLS + fprintf(stderr, "%d unfinished requests of pool %p remaining\n", pool->unfinished, pool); +#endif if (SUCCESS != http_request_pool_select(pool)) { http_error(E_WARNING, HTTP_E_CURL, "Socket error"); return FAILURE; @@ -897,6 +925,9 @@ PHP_HTTP_API STATUS _http_request_pool_send(http_request_pool *pool TSRMLS_DC) /* {{{ void http_request_pool_dtor(http_request_pool *) */ PHP_HTTP_API void _http_request_pool_dtor(http_request_pool *pool TSRMLS_DC) { +#if HTTP_DEBUG_REQPOOLS + fprintf(stderr, "Destructing request pool %p\n", pool); +#endif pool->unfinished = 0; zend_llist_clean(&pool->handles); zend_llist_clean(&pool->bodies); @@ -914,10 +945,26 @@ static void http_request_pool_freebody(http_request_body **body) } /* }}} */ +/* {{{ static void http_request_pool_freehandle(zval **, http_request_pool *) */ +static void http_request_pool_freehandle(zval **request, http_request_pool *pool TSRMLS_DC) +{ + getObjectEx(http_request_object, req, *request); + if (req->pool) { + http_request_pool_detach(pool, *request); + } +#if HTTP_DEBUG_REQPOOLS + else fprintf(stderr, "Request %p (pool: %p) is not (anymore) attached to pool %p\n", req, req->pool, pool); +#endif +} +/* }}} */ + /* {{{ static void http_request_pool_responsehandler(zval **) */ static void http_request_pool_responsehandler(zval **req TSRMLS_DC) { getObjectEx(http_request_object, obj, *req); +#if HTTP_DEBUG_REQPOOLS + fprintf(stderr, "Fetching data from request %p of pool %p\n", obj, obj->pool); +#endif http_request_object_responsehandler(obj, *req, NULL); } /* }}} */ diff --git a/http_requestpool_object.c b/http_requestpool_object.c index a683b05..e559617 100644 --- a/http_requestpool_object.c +++ b/http_requestpool_object.c @@ -46,6 +46,7 @@ zend_function_entry http_requestpool_object_fe[] = { PHP_ME(HttpRequestPool, attach, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpRequestPool, detach, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpRequestPool, send, NULL, ZEND_ACC_PUBLIC) + PHP_ME(HttpRequestPool, reset, NULL, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; @@ -95,17 +96,6 @@ void _http_requestpool_object_free(zend_object *object TSRMLS_DC) efree(o); } -static void http_requestpool_object_ondestructhandler(zval **request, http_request_pool *pool TSRMLS_DC) -{ - http_request_pool_detach(pool, *request); -} - -void _http_requestpool_object_ondestruct(http_request_pool *pool TSRMLS_DC) -{ - zend_llist_apply_with_argument(&pool->handles, (llist_apply_with_arg_func_t) http_requestpool_object_ondestructhandler, pool TSRMLS_CC); -} - - #endif /* HTTP_HAVE_CURL */ #endif /* ZEND_ENGINE_2 */ diff --git a/php_http_request_api.h b/php_http_request_api.h index 52897b6..9d454b5 100644 --- a/php_http_request_api.h +++ b/php_http_request_api.h @@ -128,6 +128,9 @@ PHP_HTTP_API STATUS _http_request_pool_attach(http_request_pool *pool, zval *req #define http_request_pool_detach(p, r) _http_request_pool_detach((p), (r) TSRMLS_CC) PHP_HTTP_API STATUS _http_request_pool_detach(http_request_pool *pool, zval *request TSRMLS_DC); +#define http_request_pool_detach_all(p) _http_request_pool_detach_all((p) TSRMLS_CC) +PHP_HTTP_API void _http_request_pool_detach_all(http_request_pool *pool TSRMLS_DC); + #define http_request_pool_send(p) _http_request_pool_send((p) TSRMLS_CC) PHP_HTTP_API STATUS _http_request_pool_send(http_request_pool *pool TSRMLS_DC); diff --git a/php_http_requestpool_object.h b/php_http_requestpool_object.h index 1ee1a9e..46d2a5e 100644 --- a/php_http_requestpool_object.h +++ b/php_http_requestpool_object.h @@ -42,14 +42,13 @@ extern void _http_requestpool_object_init(INIT_FUNC_ARGS); extern zend_object_value _http_requestpool_object_new(zend_class_entry *ce TSRMLS_DC); #define http_requestpool_object_free _http_requestpool_object_free extern void _http_requestpool_object_free(zend_object *object TSRMLS_DC); -#define http_requestpool_object_ondestruct(p) _http_requestpool_object_ondestruct((p) TSRMLS_CC) -extern void _http_requestpool_object_ondestruct(http_request_pool *pool TSRMLS_DC); PHP_METHOD(HttpRequestPool, __construct); PHP_METHOD(HttpRequestPool, __destruct); PHP_METHOD(HttpRequestPool, attach); PHP_METHOD(HttpRequestPool, detach); PHP_METHOD(HttpRequestPool, send); +PHP_METHOD(HttpRequestPool, reset); #endif #endif