}
/* }}} */
+/* {{{ proto protected bool HttpRequestPool::socketSend()
+ *
+ * Usage:
+ * <pre>
+ * <?php
+ * while ($pool->socketSend()) {
+ * do_something_else();
+ * if (!$pool->socketSelect()) {
+ * die('Socket error');
+ * }
+ * }
+ * $pool->socketRead();
+ * ?>
+ * </pre>
+ */
+PHP_METHOD(HttpRequestPool, socketSend)
+{
+ getObject(http_requestpool_object, obj);
+
+ NO_ARGS;
+
+ RETURN_BOOL(0 < http_request_pool_perform(&obj->pool));
+}
+/* }}} */
+
+/* {{{ proto protected bool HttpRequestPool::socketSelect()
+ *
+ * See HttpRequestPool::socketSend().
+ */
+PHP_METHOD(HttpRequestPool, socketSelect)
+{
+ getObject(http_requestpool_object, obj);
+
+ NO_ARGS;
+
+ RETURN_SUCCESS(http_request_pool_select(&obj->pool));
+}
+/* }}} */
+
+/* {{{ proto protected void HttpRequestPool::socketRead()
+ *
+ * See HttpRequestPool::socketSend().
+ */
+PHP_METHOD(HttpRequestPool, socketRead)
+{
+ getObject(http_requestpool_object, obj);
+
+ NO_ARGS;
+
+ zend_llist_apply(&obj->pool.handles, (llist_apply_func_t) http_request_pool_responsehandler TSRMLS_CC);
+}
+
/* }}} */
/* }}} */
static void http_request_pool_freebody(http_request_body **body);
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);
#if HTTP_CURL_USE_ZEND_MM
static void http_curl_free(void *p) { efree(p); }
#if HTTP_DEBUG_REQPOOLS
fprintf(stderr, "Attempt to send requests of pool %p\n", pool);
#endif
- http_request_pool_perform(pool);
- while (pool->unfinished) {
+ while (http_request_pool_perform(pool)) {
#if HTTP_DEBUG_REQPOOLS
fprintf(stderr, "%d unfinished requests of pool %p remaining\n", pool->unfinished, pool);
#endif
http_error(E_WARNING, HTTP_E_CURL, "Socket error");
return FAILURE;
}
- http_request_pool_perform(pool);
}
zend_llist_apply(&pool->handles, (llist_apply_func_t) http_request_pool_responsehandler TSRMLS_CC);
return SUCCESS;
}
/* }}} */
-/*#*/
-
-/* {{{ static void http_request_pool_freebody(http_request_body **) */
-static void http_request_pool_freebody(http_request_body **body)
+/* {{{ STATUS http_request_pool_select(http_request_pool *) */
+PHP_HTTP_API STATUS _http_request_pool_select(http_request_pool *pool)
{
- TSRMLS_FETCH();
- http_request_body_free(*body);
+ 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;
}
/* }}} */
-/* {{{ static void http_request_pool_freehandle(zval **, http_request_pool *) */
-static void http_request_pool_freehandle(zval **request, http_request_pool *pool TSRMLS_DC)
+/* {{{ int http_request_pool_perform(http_request_pool *) */
+PHP_HTTP_API int _http_request_pool_perform(http_request_pool *pool)
{
- 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
+ while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(pool->ch, &pool->unfinished));
+ return pool->unfinished;
}
/* }}} */
-/* {{{ static void http_request_pool_responsehandler(zval **) */
-static void http_request_pool_responsehandler(zval **req TSRMLS_DC)
+/* {{{ 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
}
/* }}} */
-/* {{{ static inline STATUS http_request_pool_select(http_request_pool *) */
-static inline 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;
+/* {{{ 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 inline void http_request_pool_perform(http_request_pool *) */
-static inline void http_request_pool_perform(http_request_pool *pool)
+/* {{{ static void http_request_pool_freehandle(zval **, http_request_pool *) */
+static void http_request_pool_freehandle(zval **request, http_request_pool *pool TSRMLS_DC)
{
- while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(pool->ch, &pool->unfinished));
+ 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
}
/* }}} */
#define http_request_data_free_slist _http_request_data_free_slist
extern void _http_request_data_free_slist(void *list);
+#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);
#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);