From 559c156f3d0aeffe2c920d9275f47cfcdfc40bdf Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 14 Jun 2005 14:21:23 +0000 Subject: [PATCH] - fix request pool issues # hopefully -- need to test on linux yet --- config.m4 | 2 +- config.w32 | 2 +- http_methods.c | 3 +- http_request_api.c | 200 --------------------------- http_request_object.c | 1 + http_request_pool_api.c | 253 ++++++++++++++++++++++++++++++++++ http_requestpool_object.c | 4 +- php_http_request_api.h | 34 ----- php_http_request_object.h | 1 + php_http_request_pool_api.h | 74 ++++++++++ php_http_requestpool_object.h | 2 +- 11 files changed, 336 insertions(+), 240 deletions(-) create mode 100644 http_request_pool_api.c create mode 100644 php_http_request_pool_api.h diff --git a/config.m4 b/config.m4 index 4f791d7..0b59836 100644 --- a/config.m4 +++ b/config.m4 @@ -72,7 +72,7 @@ dnl ---- dnl DONE dnl ---- PHP_HTTP_SOURCES="missing.c http.c http_functions.c http_methods.c phpstr/phpstr.c \ - http_util_object.c http_message_object.c http_request_object.c \ + http_util_object.c http_message_object.c http_request_object.c http_request_pool_api.c \ http_response_object.c http_exception_object.c http_requestpool_object.c \ http_api.c http_auth_api.c http_cache_api.c http_request_api.c http_date_api.c \ http_headers_api.c http_message_api.c http_send_api.c http_url_api.c" diff --git a/config.w32 b/config.w32 index 035773e..a808776 100644 --- a/config.w32 +++ b/config.w32 @@ -9,7 +9,7 @@ if (PHP_HTTP != "no") { "missing.c http.c http_functions.c http_methods.c http_exception_object.c "+ "http_util_object.c http_message_object.c http_requestpool_object.c "+ "http_request_object.c http_response_object.c "+ - "http_api.c http_auth_api.c http_cache_api.c "+ + "http_api.c http_auth_api.c http_cache_api.c http_request_pool_api.c "+ "http_request_api.c http_date_api.c http_headers_api.c "+ "http_message_api.c http_send_api.c http_url_api.c ", null, diff --git a/http_methods.c b/http_methods.c index cf1fb9e..f844c05 100644 --- a/http_methods.c +++ b/http_methods.c @@ -27,6 +27,7 @@ #include "php_http_api.h" #include "php_http_cache_api.h" #include "php_http_request_api.h" +#include "php_http_request_pool_api.h" #include "php_http_date_api.h" #include "php_http_headers_api.h" #include "php_http_message_api.h" @@ -2161,7 +2162,7 @@ PHP_METHOD(HttpRequestPool, __destruct) NO_ARGS; - http_request_pool_detach_all(&obj->pool); + //http_request_pool_detach_all(&obj->pool); } /* }}} */ diff --git a/http_request_api.c b/http_request_api.c index 722e0b5..f82b0a7 100644 --- a/http_request_api.c +++ b/http_request_api.c @@ -32,18 +32,12 @@ #include "php_http_std_defs.h" #include "php_http_api.h" #include "php_http_request_api.h" -#include "php_http_request_object.h" -#include "php_http_requestpool_object.h" #include "php_http_url_api.h" #ifndef HTTP_CURL_USE_ZEND_MM # 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 @@ -122,8 +116,6 @@ static int http_curl_debug_callback(CURL *, curl_infotype, char *, size_t, void #define http_curl_callback_data(data) _http_curl_callback_data((data) TSRMLS_CC) 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, http_request_pool *pool TSRMLS_DC); #if HTTP_CURL_USE_ZEND_MM static void http_curl_free(void *p) { efree(p); } @@ -819,198 +811,6 @@ PHP_HTTP_API STATUS _http_request_method_unregister(unsigned long method TSRMLS_ } /* }}} */ -#ifdef ZEND_ENGINE_2 -/* {{{ http_request_pool *http_request_pool_init(http_request_pool *) */ -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; - } - - if (!pool->ch) { - if (!(pool->ch = curl_multi_init())) { - http_error(E_WARNING, HTTP_E_CURL, "Could not initialize curl"); - if (free_pool) { - efree(pool); - } - return NULL; - } - } - - 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; -} -/* }}} */ - -/* {{{ STATUS http_request_pool_attach(http_request_pool *, zval *) */ -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 { - CURLMcode code; - http_request_body *body = http_request_body_new(); - zval *info = GET_PROP_EX(req, request, responseInfo); - - if (SUCCESS != http_request_object_requesthandler(req, request, body)) { - http_error_ex(E_WARNING, HTTP_E_CURL, "Could not initialize HttpRequest object for attaching to the HttpRequestPool"); - } else { - code = curl_multi_add_handle(pool->ch, req->ch); - if ((CURLM_OK != code) && (CURLM_CALL_MULTI_PERFORM != code)) { - http_error_ex(E_WARNING, HTTP_E_CURL, "Could not attach HttpRequest object to the HttpRequestPool: %s", curl_multi_strerror(code)); - } else { - req->pool = pool; - zval_add_ref(&request); - zend_llist_add_element(&pool->handles, &request); - zend_llist_add_element(&pool->bodies, &body); - return SUCCESS; - } - } - efree(body); - } - return FAILURE; -} -/* }}} */ - -/* {{{ STATUS http_request_pool_detach(http_request_pool *, zval *) */ -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"); - } else { - CURLMcode code; - - if (CURLM_OK != (code = curl_multi_remove_handle(pool->ch, req->ch))) { - http_error_ex(E_WARNING, HTTP_E_CURL, "Could not detach HttpRequest object from the HttpRequestPool: %s", curl_multi_strerror(code)); - } else { - req->pool = NULL; - zval_ptr_dtor(&request); - return SUCCESS; - } - } - return FAILURE; -} -/* }}} */ - -/* {{{ 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 - while (http_request_pool_perform(pool)) { -#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; - } - } - zend_llist_apply(&pool->handles, (llist_apply_func_t) http_request_pool_responsehandler TSRMLS_CC); - return SUCCESS; -} -/* }}} */ - -/* {{{ 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); - curl_multi_cleanup(pool->ch); -} -/* }}} */ - -/* {{{ STATUS http_request_pool_select(http_request_pool *) */ -PHP_HTTP_API STATUS _http_request_pool_select(http_request_pool *pool) -{ - int MAX; - fd_set R, W, E; - struct timeval timeout = {1, 0}; - - FD_ZERO(&R); - FD_ZERO(&W); - FD_ZERO(&E); - - curl_multi_fdset(pool->ch, &R, &W, &E, &MAX); - return (-1 != select(MAX + 1, &R, &W, &E, &timeout)) ? SUCCESS : FAILURE; -} -/* }}} */ - -/* {{{ int http_request_pool_perform(http_request_pool *) */ -PHP_HTTP_API int _http_request_pool_perform(http_request_pool *pool) -{ - while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(pool->ch, &pool->unfinished)); - return pool->unfinished; -} -/* }}} */ - -/* {{{ void http_request_pool_responsehandler(zval **) */ -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); -} -/* }}} */ - -/*#*/ - -/* {{{ static void http_request_pool_freebody(http_request_body **) */ -static void http_request_pool_freebody(http_request_body **body) -{ - TSRMLS_FETCH(); - http_request_body_free(*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 -} -/* }}} */ -#endif /* ZEND_ENGINE_2 */ /* {{{ char *http_request_methods[] */ static const char *const http_request_methods[] = { diff --git a/http_request_object.c b/http_request_object.c index 8343507..7e25446 100644 --- a/http_request_object.c +++ b/http_request_object.c @@ -32,6 +32,7 @@ #include "php_http_std_defs.h" #include "php_http_request_object.h" #include "php_http_request_api.h" +#include "php_http_request_pool_api.h" #include "php_http_api.h" #include "php_http_url_api.h" #include "php_http_message_api.h" diff --git a/http_request_pool_api.c b/http_request_pool_api.c new file mode 100644 index 0000000..a38e73f --- /dev/null +++ b/http_request_pool_api.c @@ -0,0 +1,253 @@ +/* + +----------------------------------------------------------------------+ + | PECL :: http | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.0 of the PHP license, that | + | is bundled with this package in the file LICENSE, and is available | + | through the world-wide-web at http://www.php.net/license/3_0.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Copyright (c) 2004-2005 Michael Wallner | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "php.h" +#include "php_http.h" +#include "php_http_std_defs.h" +#include "php_http_api.h" +#include "php_http_request_api.h" +#include "php_http_request_pool_api.h" +#include "php_http_request_object.h" +#include "php_http_requestpool_object.h" + +#ifdef ZEND_ENGINE_2 + +#ifndef HTTP_DEBUG_REQPOOLS +# define HTTP_DEBUG_REQPOOLS 0 +#endif + +static void http_request_pool_freebody(http_request_body **body); +static int http_request_pool_compare_handles(void *h1, void *h2); + +/* {{{ http_request_pool *http_request_pool_init(http_request_pool *) */ +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; + } + + if (!pool->ch) { + if (!(pool->ch = curl_multi_init())) { + http_error(E_WARNING, HTTP_E_CURL, "Could not initialize curl"); + if (free_pool) { + efree(pool); + } + return NULL; + } + } + + 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; +} +/* }}} */ + +/* {{{ STATUS http_request_pool_attach(http_request_pool *, zval *) */ +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 { + CURLMcode code; + http_request_body *body = http_request_body_new(); + zval *info = GET_PROP_EX(req, request, responseInfo); + + if (SUCCESS != http_request_object_requesthandler(req, request, body)) { + http_error_ex(E_WARNING, HTTP_E_CURL, "Could not initialize HttpRequest object for attaching to the HttpRequestPool"); + } else { + code = curl_multi_add_handle(pool->ch, req->ch); + if ((CURLM_OK != code) && (CURLM_CALL_MULTI_PERFORM != code)) { + http_error_ex(E_WARNING, HTTP_E_CURL, "Could not attach HttpRequest object to the HttpRequestPool: %s", curl_multi_strerror(code)); + } else { + req->pool = pool; + zend_llist_add_element(&pool->handles, &request); + zend_llist_add_element(&pool->bodies, &body); + zval_add_ref(&request); + return SUCCESS; + } + } + efree(body); + } + return FAILURE; +} +/* }}} */ + +/* {{{ STATUS http_request_pool_detach(http_request_pool *, zval *) */ +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"); + } else { + CURLMcode code; + + if (CURLM_OK != (code = curl_multi_remove_handle(pool->ch, req->ch))) { + http_error_ex(E_WARNING, HTTP_E_CURL, "Could not detach HttpRequest object from the HttpRequestPool: %s", curl_multi_strerror(code)); + } else { + req->pool = NULL; + zend_llist_del_element(&pool->handles, request, http_request_pool_compare_handles); + return SUCCESS; + } + } + return FAILURE; +} +/* }}} */ + +/* {{{ void http_request_pool_detach_all(http_request_pool *) */ +PHP_HTTP_API void _http_request_pool_detach_all(http_request_pool *pool TSRMLS_DC) +{ + int count = zend_llist_count(&pool->handles); +#if HTTP_DEBUG_REQPOOLS + fprintf(stderr, "Detaching %d requests from pool %p\n", count, pool); +#endif + /* + * we cannot apply a function to the llist which actually detaches + * the curl handle *and* removes the llist element -- + * so let's get our hands dirty + */ + if (count) { + int i = 0; + zend_llist_position pos; + zval **handle, **handles = emalloc(count * sizeof(zval *)); + + for (handle = zend_llist_get_first_ex(&pool->handles, &pos); handle; handle = zend_llist_get_next_ex(&pool->handles, &pos)) { + handles[i++] = *handle; + } + for (i = 0; i < count; ++i) { + http_request_pool_detach(pool, handles[i]); + } + } +} + + +/* {{{ 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 + while (http_request_pool_perform(pool)) { +#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; + } + } + zend_llist_apply(&pool->handles, (llist_apply_func_t) http_request_pool_responsehandler TSRMLS_CC); + return SUCCESS; +} +/* }}} */ + +/* {{{ 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); + curl_multi_cleanup(pool->ch); +} +/* }}} */ + +/* {{{ STATUS http_request_pool_select(http_request_pool *) */ +PHP_HTTP_API STATUS _http_request_pool_select(http_request_pool *pool) +{ + int MAX; + fd_set R, W, E; + struct timeval timeout = {1, 0}; + + FD_ZERO(&R); + FD_ZERO(&W); + FD_ZERO(&E); + + curl_multi_fdset(pool->ch, &R, &W, &E, &MAX); + return (-1 != select(MAX + 1, &R, &W, &E, &timeout)) ? SUCCESS : FAILURE; +} +/* }}} */ + +/* {{{ int http_request_pool_perform(http_request_pool *) */ +PHP_HTTP_API int _http_request_pool_perform(http_request_pool *pool) +{ + while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(pool->ch, &pool->unfinished)); + return pool->unfinished; +} +/* }}} */ + +/* {{{ void http_request_pool_responsehandler(zval **) */ +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); +} +/* }}} */ + +/*#*/ + +/* {{{ static void http_request_pool_freebody(http_request_body **) */ +static void http_request_pool_freebody(http_request_body **body) +{ + TSRMLS_FETCH(); + http_request_body_free(*body); +} +/* }}} */ + +/* {{{ static int http_request_pool_compare_handles(void *, void *) */ +static int http_request_pool_compare_handles(void *h1, void *h2) +{ + return ((*((zval **) h1)) == ((zval *) h2)); +} +/* }}} */ + +#endif /* ZEND_ENGINE_2 */ + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ + diff --git a/http_requestpool_object.c b/http_requestpool_object.c index 000a044..904fb96 100644 --- a/http_requestpool_object.c +++ b/http_requestpool_object.c @@ -31,7 +31,7 @@ #include "php_http_std_defs.h" #include "php_http_requestpool_object.h" -#include "php_http_request_api.h" +#include "php_http_request_pool_api.h" #ifdef ZEND_ENGINE_2 #ifdef HTTP_HAVE_CURL @@ -47,7 +47,7 @@ zend_function_entry http_requestpool_object_fe[] = { PHP_ME(HttpRequestPool, detach, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpRequestPool, send, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpRequestPool, reset, NULL, ZEND_ACC_PUBLIC) - + PHP_ME(HttpRequestPool, socketSend, NULL, ZEND_ACC_PROTECTED) PHP_ME(HttpRequestPool, socketSelect, NULL, ZEND_ACC_PROTECTED) PHP_ME(HttpRequestPool, socketRead, NULL, ZEND_ACC_PROTECTED) diff --git a/php_http_request_api.h b/php_http_request_api.h index 3a44678..2aee64d 100644 --- a/php_http_request_api.h +++ b/php_http_request_api.h @@ -75,13 +75,6 @@ typedef struct { size_t size; } http_request_body; -typedef struct { - CURLM *ch; - zend_llist handles; - zend_llist bodies; - int unfinished; -} http_request_pool; - typedef struct { void ***tsrm_ctx; void *data; @@ -99,9 +92,6 @@ extern void _http_request_data_free_slist(void *list); #define http_request_data_free_context _http_request_data_free_context extern void _http_request_data_free_context(void *context); -#define http_request_pool_responsehandler _http_request_pool_responsehandler -extern void _http_request_pool_responsehandler(zval **req TSRMLS_DC); - #define http_request_global_init _http_request_global_init extern STATUS _http_request_global_init(void); @@ -129,30 +119,6 @@ PHP_HTTP_API void _http_request_body_dtor(http_request_body *body TSRMLS_DC); #define http_request_body_free(b) _http_request_body_free((b) TSRMLS_CC) PHP_HTTP_API void _http_request_body_free(http_request_body *body TSRMLS_DC); -#define http_request_pool_init(p) _http_request_pool_init((p) TSRMLS_CC) -PHP_HTTP_API http_request_pool *_http_request_pool_init(http_request_pool *pool TSRMLS_DC); - -#define http_request_pool_attach(p, r) _http_request_pool_attach((p), (r) TSRMLS_CC) -PHP_HTTP_API STATUS _http_request_pool_attach(http_request_pool *pool, zval *request TSRMLS_DC); - -#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); - -#define http_request_pool_select _http_request_pool_select -PHP_HTTP_API STATUS _http_request_pool_select(http_request_pool *pool); - -#define http_request_pool_perform _http_request_pool_perform -PHP_HTTP_API int _http_request_pool_perform(http_request_pool *pool); - -#define http_request_pool_dtor(p) _http_request_pool_dtor((p) TSRMLS_CC) -PHP_HTTP_API void _http_request_pool_dtor(http_request_pool *pool TSRMLS_DC); - #define http_request_init(ch, meth, url, body, options, response) _http_request_init((ch), (meth), (url), (body), (options), (response) TSRMLS_CC) PHP_HTTP_API STATUS _http_request_init(CURL *ch, http_request_method meth, const char *url, http_request_body *body, HashTable *options, phpstr *response TSRMLS_DC); diff --git a/php_http_request_object.h b/php_http_request_object.h index be9fac0..011da9a 100644 --- a/php_http_request_object.h +++ b/php_http_request_object.h @@ -27,6 +27,7 @@ #include #include "php_http_request_api.h" +#include "php_http_request_pool_api.h" #include "phpstr/phpstr.h" typedef struct { diff --git a/php_http_request_pool_api.h b/php_http_request_pool_api.h new file mode 100644 index 0000000..3243de9 --- /dev/null +++ b/php_http_request_pool_api.h @@ -0,0 +1,74 @@ +/* + +----------------------------------------------------------------------+ + | PECL :: http | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.0 of the PHP license, that | + | is bundled with this package in the file LICENSE, and is available | + | through the world-wide-web at http://www.php.net/license/3_0.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Copyright (c) 2004-2005 Michael Wallner | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#ifndef PHP_HTTP_REQUEST_POOL_API_H +#define PHP_HTTP_REQUEST_POOL_API_H + +#include "php_http_std_defs.h" +#include "phpstr/phpstr.h" + +#ifdef PHP_WIN32 +# include +#endif + +#include + +typedef struct { + CURLM *ch; + zend_llist handles; + zend_llist bodies; + int unfinished; +} http_request_pool; + +#define http_request_pool_responsehandler _http_request_pool_responsehandler +extern void _http_request_pool_responsehandler(zval **req TSRMLS_DC); + +#define http_request_pool_init(p) _http_request_pool_init((p) TSRMLS_CC) +PHP_HTTP_API http_request_pool *_http_request_pool_init(http_request_pool *pool TSRMLS_DC); + +#define http_request_pool_attach(p, r) _http_request_pool_attach((p), (r) TSRMLS_CC) +PHP_HTTP_API STATUS _http_request_pool_attach(http_request_pool *pool, zval *request TSRMLS_DC); + +#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); + +#define http_request_pool_select _http_request_pool_select +PHP_HTTP_API STATUS _http_request_pool_select(http_request_pool *pool); + +#define http_request_pool_perform _http_request_pool_perform +PHP_HTTP_API int _http_request_pool_perform(http_request_pool *pool); + +#define http_request_pool_dtor(p) _http_request_pool_dtor((p) TSRMLS_CC) +PHP_HTTP_API void _http_request_pool_dtor(http_request_pool *pool TSRMLS_DC); + +#endif + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ + diff --git a/php_http_requestpool_object.h b/php_http_requestpool_object.h index f11e65c..336fed2 100644 --- a/php_http_requestpool_object.h +++ b/php_http_requestpool_object.h @@ -26,7 +26,7 @@ #include -#include "php_http_request_api.h" +#include "php_http_request_pool_api.h" typedef struct { zend_object zo; -- 2.30.2