Skip to content

Commit fdde694

Browse files
committed
php#53: Add zend_async_poll_proxy_t for FD resource optimization
Implements a new poll proxy structure that allows multiple consumers to share a single zend_async_poll_event_t, reducing file descriptor and libuv handle usage. Key features: - zend_async_poll_proxy_t holds reference to shared poll event - Event aggregation: proxy events are OR'ed into base event - Reference counting for automatic cleanup - Standard event interface (start/stop/dispose/callbacks) Changes: - Add zend_async_poll_proxy_t structure and typedef - Add libuv_new_poll_proxy_event() creation function - Implement proxy start/stop/dispose methods with event aggregation - Add ZEND_ASYNC_NEW_POLL_PROXY_EVENT() macros - Update zend_async_reactor_register() signature and calls - Add zend_async_new_poll_proxy_event_fn function pointer Usage: zend_async_poll_event_t *base = ZEND_ASYNC_NEW_POLL_EVENT(fd, 0, events); zend_async_poll_proxy_t *proxy = ZEND_ASYNC_NEW_POLL_PROXY_EVENT(base, specific_events); This enables efficient FD sharing while maintaining clean abstraction.
1 parent bce124f commit fdde694

File tree

3 files changed

+19
-1
lines changed

3 files changed

+19
-1
lines changed

Zend/zend_async_API.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ zend_async_reactor_execute_t zend_async_reactor_execute_fn = NULL;
153153
zend_async_reactor_loop_alive_t zend_async_reactor_loop_alive_fn = NULL;
154154
zend_async_new_socket_event_t zend_async_new_socket_event_fn = NULL;
155155
zend_async_new_poll_event_t zend_async_new_poll_event_fn = NULL;
156+
zend_async_new_poll_proxy_event_t zend_async_new_poll_proxy_event_fn = NULL;
156157
zend_async_new_timer_event_t zend_async_new_timer_event_fn = NULL;
157158
zend_async_new_signal_event_t zend_async_new_signal_event_fn = NULL;
158159
zend_async_new_process_event_t zend_async_new_process_event_fn = NULL;
@@ -316,6 +317,7 @@ ZEND_API bool zend_async_reactor_register(char *module, bool allow_override,
316317
zend_async_reactor_loop_alive_t reactor_loop_alive_fn,
317318
zend_async_new_socket_event_t new_socket_event_fn,
318319
zend_async_new_poll_event_t new_poll_event_fn,
320+
zend_async_new_poll_proxy_event_t new_poll_proxy_event_fn,
319321
zend_async_new_timer_event_t new_timer_event_fn,
320322
zend_async_new_signal_event_t new_signal_event_fn,
321323
zend_async_new_process_event_t new_process_event_fn,
@@ -350,6 +352,7 @@ ZEND_API bool zend_async_reactor_register(char *module, bool allow_override,
350352

351353
zend_async_new_socket_event_fn = new_socket_event_fn;
352354
zend_async_new_poll_event_fn = new_poll_event_fn;
355+
zend_async_new_poll_proxy_event_fn = new_poll_proxy_event_fn;
353356
zend_async_new_timer_event_fn = new_timer_event_fn;
354357
zend_async_new_signal_event_fn = new_signal_event_fn;
355358

Zend/zend_async_API.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ typedef void (*zend_async_event_dispose_t)(zend_async_event_t *event);
201201
typedef zend_string *(*zend_async_event_info_t)(zend_async_event_t *event);
202202

203203
typedef struct _zend_async_poll_event_s zend_async_poll_event_t;
204+
typedef struct _zend_async_poll_proxy_s zend_async_poll_proxy_t;
204205
typedef struct _zend_async_timer_event_s zend_async_timer_event_t;
205206
typedef struct _zend_async_signal_event_s zend_async_signal_event_t;
206207
typedef struct _zend_async_filesystem_event_s zend_async_filesystem_event_t;
@@ -257,6 +258,8 @@ typedef zend_async_poll_event_t *(*zend_async_new_socket_event_t)(
257258
zend_socket_t socket, async_poll_event events, size_t extra_size);
258259
typedef zend_async_poll_event_t *(*zend_async_new_poll_event_t)(zend_file_descriptor_t fh,
259260
zend_socket_t socket, async_poll_event events, size_t extra_size);
261+
typedef zend_async_poll_proxy_t *(*zend_async_new_poll_proxy_event_t)(
262+
zend_async_poll_event_t *poll_event, async_poll_event events, size_t extra_size);
260263
typedef zend_async_timer_event_t *(*zend_async_new_timer_event_t)(const zend_ulong timeout,
261264
const zend_ulong nanoseconds, const bool is_periodic, size_t extra_size);
262265
typedef zend_async_signal_event_t *(*zend_async_new_signal_event_t)(int signum, size_t extra_size);
@@ -685,6 +688,12 @@ struct _zend_async_poll_event_s {
685688
async_poll_event triggered_events;
686689
};
687690

691+
struct _zend_async_poll_proxy_s {
692+
zend_async_event_t base;
693+
zend_async_poll_event_t *poll_event;
694+
async_poll_event events;
695+
};
696+
688697
struct _zend_async_timer_event_s {
689698
zend_async_event_t base;
690699
/* The timeout in milliseconds. */
@@ -1361,6 +1370,7 @@ ZEND_API extern zend_async_reactor_execute_t zend_async_reactor_execute_fn;
13611370
ZEND_API extern zend_async_reactor_loop_alive_t zend_async_reactor_loop_alive_fn;
13621371
ZEND_API extern zend_async_new_socket_event_t zend_async_new_socket_event_fn;
13631372
ZEND_API extern zend_async_new_poll_event_t zend_async_new_poll_event_fn;
1373+
ZEND_API extern zend_async_new_poll_proxy_event_t zend_async_new_poll_proxy_event_fn;
13641374
ZEND_API extern zend_async_new_timer_event_t zend_async_new_timer_event_fn;
13651375
ZEND_API extern zend_async_new_signal_event_t zend_async_new_signal_event_fn;
13661376
ZEND_API extern zend_async_new_process_event_t zend_async_new_process_event_fn;
@@ -1409,6 +1419,7 @@ ZEND_API bool zend_async_reactor_register(char *module, bool allow_override,
14091419
zend_async_reactor_loop_alive_t reactor_loop_alive_fn,
14101420
zend_async_new_socket_event_t new_socket_event_fn,
14111421
zend_async_new_poll_event_t new_poll_event_fn,
1422+
zend_async_new_poll_proxy_event_t new_poll_proxy_event_fn,
14121423
zend_async_new_timer_event_t new_timer_event_fn,
14131424
zend_async_new_signal_event_t new_signal_event_fn,
14141425
zend_async_new_process_event_t new_process_event_fn,
@@ -1590,6 +1601,10 @@ END_EXTERN_C()
15901601
zend_async_new_poll_event_fn(fh, socket, events, 0)
15911602
#define ZEND_ASYNC_NEW_POLL_EVENT_EX(fh, socket, events, extra_size) \
15921603
zend_async_new_poll_event_fn(fh, socket, events, extra_size)
1604+
#define ZEND_ASYNC_NEW_POLL_PROXY_EVENT(poll_event, events) \
1605+
zend_async_new_poll_proxy_event_fn(poll_event, events, 0)
1606+
#define ZEND_ASYNC_NEW_POLL_PROXY_EVENT_EX(poll_event, events, extra_size) \
1607+
zend_async_new_poll_proxy_event_fn(poll_event, events, extra_size)
15931608
#define ZEND_ASYNC_NEW_TIMER_EVENT(timeout, is_periodic) \
15941609
zend_async_new_timer_event_fn(timeout, 0, is_periodic, 0)
15951610
#define ZEND_ASYNC_NEW_TIMER_EVENT_EX(timeout, is_periodic, extra_size) \

main/streams/xp_socket.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ static int php_sockop_set_option(php_stream *stream, int option, int value, void
567567

568568
zend_async_poll_event_t **handle_ptr = (zend_async_poll_event_t **)ptrparam;
569569
if (sock->poll_event == NULL) {
570-
sock->poll_event = ZEND_ASYNC_NEW_SOCKET_EVENT(sock->socket, value);
570+
sock->poll_event = ZEND_ASYNC_NEW_SOCKET_EVENT(sock->socket, 0);
571571
if (UNEXPECTED(EG(exception) != NULL)) {
572572
return PHP_STREAM_OPTION_RETURN_ERR;
573573
}

0 commit comments

Comments
 (0)