Skip to content

Commit 09947a1

Browse files
committed
Add cross-thread trigger event API
Implement zend_async_trigger_event_t using uv_async_t for thread-safe event activation across different threads and event loops. - Add API definitions in zend_async_API.h - Implement libuv backend in ext/async/ - Thread-safe trigger() method - Persistent memory allocation - No additional synchronization needed
1 parent 964eca0 commit 09947a1

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

Zend/zend_async_API.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ zend_async_freeaddrinfo_t zend_async_freeaddrinfo_fn = NULL;
101101
zend_async_new_exec_event_t zend_async_new_exec_event_fn = NULL;
102102
zend_async_exec_t zend_async_exec_fn = NULL;
103103

104+
/* Trigger Event API */
105+
zend_async_new_trigger_event_t zend_async_new_trigger_event_fn = NULL;
106+
104107
static zend_string * thread_pool_module_name = NULL;
105108
zend_async_queue_task_t zend_async_queue_task_fn = NULL;
106109

@@ -259,7 +262,8 @@ ZEND_API bool zend_async_reactor_register(
259262
zend_async_getaddrinfo_t getaddrinfo_fn,
260263
zend_async_freeaddrinfo_t freeaddrinfo_fn,
261264
zend_async_new_exec_event_t new_exec_event_fn,
262-
zend_async_exec_t exec_fn
265+
zend_async_exec_t exec_fn,
266+
zend_async_new_trigger_event_t new_trigger_event_fn
263267
)
264268
{
265269
if (zend_atomic_bool_exchange(&reactor_lock, 1)) {
@@ -301,6 +305,8 @@ ZEND_API bool zend_async_reactor_register(
301305
zend_async_new_exec_event_fn = new_exec_event_fn;
302306
zend_async_exec_fn = exec_fn;
303307

308+
zend_async_new_trigger_event_fn = new_trigger_event_fn;
309+
304310
zend_atomic_bool_store(&reactor_lock, 0);
305311

306312
return true;

Zend/zend_async_API.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ typedef struct _zend_async_filesystem_event_s zend_async_filesystem_event_t;
170170

171171
typedef struct _zend_async_process_event_s zend_async_process_event_t;
172172
typedef struct _zend_async_thread_event_s zend_async_thread_event_t;
173+
typedef struct _zend_async_trigger_event_s zend_async_trigger_event_t;
173174

174175
typedef struct _zend_async_dns_nameinfo_s zend_async_dns_nameinfo_t;
175176
typedef struct _zend_async_dns_addrinfo_s zend_async_dns_addrinfo_t;
@@ -215,6 +216,8 @@ typedef void (*zend_async_thread_entry_t)(void *arg, size_t extra_size);
215216
typedef zend_async_thread_event_t* (*zend_async_new_thread_event_t)(
216217
zend_async_thread_entry_t entry, void *arg, size_t extra_size
217218
);
219+
typedef void (*zend_async_trigger_event_trigger_fn)(zend_async_trigger_event_t *event);
220+
typedef zend_async_trigger_event_t* (*zend_async_new_trigger_event_t)(size_t extra_size);
218221
typedef zend_async_filesystem_event_t* (*zend_async_new_filesystem_event_t)(
219222
zend_string * path, const unsigned int flags, size_t extra_size
220223
);
@@ -618,6 +621,11 @@ struct _zend_async_task_s {
618621
zend_async_event_t base;
619622
};
620623

624+
struct _zend_async_trigger_event_s {
625+
zend_async_event_t base;
626+
zend_async_trigger_event_trigger_fn trigger;
627+
};
628+
621629
///////////////////////////////////////////////////////////////////
622630
/// Scope Structures
623631
///////////////////////////////////////////////////////////////////
@@ -1106,6 +1114,9 @@ ZEND_API extern zend_async_exec_t zend_async_exec_fn;
11061114
ZEND_API bool zend_async_thread_pool_is_enabled(void);
11071115
ZEND_API extern zend_async_queue_task_t zend_async_queue_task_fn;
11081116

1117+
/* Trigger Event API */
1118+
ZEND_API extern zend_async_new_trigger_event_t zend_async_new_trigger_event_fn;
1119+
11091120
ZEND_API bool zend_async_scheduler_register(
11101121
char *module,
11111122
bool allow_override,
@@ -1142,7 +1153,8 @@ ZEND_API bool zend_async_reactor_register(
11421153
zend_async_getaddrinfo_t getaddrinfo_fn,
11431154
zend_async_freeaddrinfo_t freeaddrinfo_fn,
11441155
zend_async_new_exec_event_t new_exec_event_fn,
1145-
zend_async_exec_t exec_fn
1156+
zend_async_exec_t exec_fn,
1157+
zend_async_new_trigger_event_t new_trigger_event_fn
11461158
);
11471159

11481160
ZEND_API void zend_async_thread_pool_register(
@@ -1292,6 +1304,10 @@ END_EXTERN_C()
12921304

12931305
#define ZEND_ASYNC_QUEUE_TASK(task) zend_async_queue_task_fn(task)
12941306

1307+
/* Trigger Event API Macros */
1308+
#define ZEND_ASYNC_NEW_TRIGGER_EVENT() zend_async_new_trigger_event_fn(0)
1309+
#define ZEND_ASYNC_NEW_TRIGGER_EVENT_EX(extra_size) zend_async_new_trigger_event_fn(extra_size)
1310+
12951311
/* Socket Listening API Macros */
12961312
#define ZEND_ASYNC_SOCKET_LISTEN(host, port, backlog) \
12971313
zend_async_socket_listen_fn(host, port, backlog, 0)

0 commit comments

Comments
 (0)