X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=src%2Fphp_http_client_curl_event.c;h=b8db1b2d5e15c33429b1c6f6cdc7c06da70ff201;hp=9b1808b92f43be348222de8fc481a770c4ae139f;hb=f7bda4412c966a3eb3d930cca798694bb321fa1a;hpb=286dfcc5b1e7b24117132c7bff5b8e64ac6ac5d0 diff --git a/src/php_http_client_curl_event.c b/src/php_http_client_curl_event.c index 9b1808b..b8db1b2 100644 --- a/src/php_http_client_curl_event.c +++ b/src/php_http_client_curl_event.c @@ -11,29 +11,14 @@ */ #include "php_http_api.h" -#include "php_http_client.h" -#include "php_http_client_curl.h" - -#if PHP_HTTP_HAVE_CURL -#if PHP_HTTP_HAVE_EVENT -# if !PHP_HTTP_HAVE_EVENT2 && /* just be really sure */ !(LIBEVENT_VERSION_NUMBER >= 0x02000000) -# include -# define event_base_new event_init -# define event_assign(e, b, s, a, cb, d) do {\ - event_set(e, s, a, cb, d); \ - event_base_set(b, e); \ - } while(0) -# else -# if PHP_HTTP_HAVE_EVENT2 -# include -# include -# else -# error "libevent presence is unknown" -# endif -# endif -# ifndef DBG_EVENTS -# define DBG_EVENTS 0 -# endif + +#if PHP_HTTP_HAVE_LIBCURL +#if PHP_HTTP_HAVE_LIBEVENT + +#include +#ifndef DBG_EVENTS +# define DBG_EVENTS 0 +#endif typedef struct php_http_client_curl_event_context { php_http_client_t *client; @@ -67,7 +52,6 @@ static void php_http_client_curl_event_handler(void *context, curl_socket_t s, i CURLMcode rc; php_http_client_curl_event_context_t *ctx = context; php_http_client_curl_t *curl = ctx->client->ctx; - TSRMLS_FETCH_FROM_CTX(ctx->client->ts); #if DBG_EVENTS fprintf(stderr, "H"); @@ -78,7 +62,7 @@ static void php_http_client_curl_event_handler(void *context, curl_socket_t s, i } while (CURLM_CALL_MULTI_PERFORM == rc); if (CURLM_OK != rc) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", curl_multi_strerror(rc)); + php_error_docref(NULL, E_WARNING, "%s", curl_multi_strerror(rc)); } php_http_client_curl_responsehandler(ctx->client); @@ -100,16 +84,22 @@ static void php_http_client_curl_event_timeout_callback(int socket, short action static void php_http_client_curl_event_timer(CURLM *multi, long timeout_ms, void *timer_data) { php_http_client_curl_event_context_t *context = timer_data; + struct timeval timeout; #if DBG_EVENTS - fprintf(stderr, "\ntimer <- timeout_ms: %ld\n", timeout_ms); + fprintf(stderr, "(%ld)", timeout_ms); #endif - if (timeout_ms < 0) { + switch (timeout_ms) { + case -1: + if (event_initialized(context->timeout) && event_pending(context->timeout, EV_TIMEOUT, NULL)) { + event_del(context->timeout); + } + break; + case 0: php_http_client_curl_event_handler(context, CURL_SOCKET_TIMEOUT, 0); - } else if (timeout_ms > 0 || !event_initialized(context->timeout) || !event_pending(context->timeout, EV_TIMEOUT, NULL)) { - struct timeval timeout; - + break; + default: if (!event_initialized(context->timeout)) { event_assign(context->timeout, context->evbase, CURL_SOCKET_TIMEOUT, 0, php_http_client_curl_event_timeout_callback, context); } @@ -117,7 +107,10 @@ static void php_http_client_curl_event_timer(CURLM *multi, long timeout_ms, void timeout.tv_sec = timeout_ms / 1000; timeout.tv_usec = (timeout_ms % 1000) * 1000; - event_add(context->timeout, &timeout); + if (!event_pending(context->timeout, EV_TIMEOUT, &timeout)) { + event_add(context->timeout, &timeout); + } + break; } } @@ -144,7 +137,6 @@ static int php_http_client_curl_event_socket(CURL *easy, curl_socket_t sock, int php_http_client_curl_t *curl = ctx->client->ctx; int events = EV_PERSIST; php_http_client_curl_event_ev_t *ev = assign_data; - TSRMLS_FETCH_FROM_CTX(ctx->client->ts); #if DBG_EVENTS fprintf(stderr, "S"); @@ -176,7 +168,7 @@ static int php_http_client_curl_event_socket(CURL *easy, curl_socket_t sock, int return 0; default: - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown socket action %d", action); + php_error_docref(NULL, E_WARNING, "Unknown socket action %d", action); return -1; } @@ -235,7 +227,6 @@ static ZEND_RESULT_CODE php_http_client_curl_event_exec(void *context) { php_http_client_curl_event_context_t *ctx = context; php_http_client_curl_t *curl = ctx->client->ctx; - TSRMLS_FETCH_FROM_CTX(ctx->client->ts); #if DBG_EVENTS fprintf(stderr, "E"); @@ -289,8 +280,6 @@ static void php_http_client_curl_event_dtor(void **context) fprintf(stderr, "D"); #endif - ZEND_ASSERT(ctx); - curl = ctx->client->ctx; curl_multi_setopt(curl->handle->multi, CURLMOPT_SOCKETDATA, NULL); @@ -321,8 +310,8 @@ php_http_client_curl_ops_t *php_http_client_curl_event_ops_get() return &php_http_client_curl_event_ops; } -#endif /* PHP_HTTP_HAVE_EVENT */ -#endif /* PHP_HTTP_HAVE_CURL */ +#endif /* PHP_HTTP_HAVE_LIBEVENT */ +#endif /* PHP_HTTP_HAVE_LIBCURL */ /* * Local variables: