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=e1ba505b783d828ec92ca25d576f2432e394afdd;hb=f7bda4412c966a3eb3d930cca798694bb321fa1a;hpb=d7652a44e061886c95dcb730e13c52163039d429 diff --git a/src/php_http_client_curl_event.c b/src/php_http_client_curl_event.c index e1ba505..b8db1b2 100644 --- a/src/php_http_client_curl_event.c +++ b/src/php_http_client_curl_event.c @@ -12,26 +12,13 @@ #include "php_http_api.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; @@ -97,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); } @@ -114,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; } } @@ -314,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: