Skip to content

Commit 2137eb5

Browse files
committed
+ **Iterator API integration**: Added zend_async_iterator_t structure to TrueAsync API with run() and run_in_coroutine() methods
1 parent f195fe6 commit 2137eb5

File tree

2 files changed

+40
-2
lines changed

2 files changed

+40
-2
lines changed

Zend/zend_async_API.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ zend_async_new_trigger_event_t zend_async_new_trigger_event_fn = NULL;
107107
static zend_string * thread_pool_module_name = NULL;
108108
zend_async_queue_task_t zend_async_queue_task_fn = NULL;
109109

110+
/* Iterator API */
111+
zend_async_new_iterator_t zend_async_new_iterator_fn = NULL;
112+
110113
/* Context API */
111114
zend_async_new_context_t zend_async_new_context_fn = new_context;
112115

@@ -203,7 +206,8 @@ ZEND_API bool zend_async_scheduler_register(
203206
zend_async_get_coroutines_t get_coroutines_fn,
204207
zend_async_add_microtask_t add_microtask_fn,
205208
zend_async_get_awaiting_info_t get_awaiting_info_fn,
206-
zend_async_get_class_ce_t get_class_ce_fn
209+
zend_async_get_class_ce_t get_class_ce_fn,
210+
zend_async_new_iterator_t new_iterator_fn
207211
)
208212
{
209213
if (zend_atomic_bool_exchange(&scheduler_lock, 1)) {
@@ -238,6 +242,7 @@ ZEND_API bool zend_async_scheduler_register(
238242
zend_async_add_microtask_fn = add_microtask_fn;
239243
zend_async_get_awaiting_info_fn = get_awaiting_info_fn;
240244
zend_async_get_class_ce_fn = get_class_ce_fn;
245+
zend_async_new_iterator_fn = new_iterator_fn;
241246

242247
zend_atomic_bool_store(&scheduler_lock, 0);
243248

Zend/zend_async_API.h

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ typedef struct _zend_async_context_s zend_async_context_t;
118118
typedef struct _zend_async_waker_s zend_async_waker_t;
119119
typedef struct _zend_async_microtask_s zend_async_microtask_t;
120120
typedef struct _zend_async_scope_s zend_async_scope_t;
121+
typedef struct _zend_async_iterator_s zend_async_iterator_t;
121122
typedef struct _zend_fcall_s zend_fcall_t;
122123
typedef void (*zend_coroutine_entry_t)(void);
123124

@@ -291,6 +292,28 @@ struct _zend_async_microtask_s {
291292
uint32_t ref_count;
292293
};
293294

295+
///////////////////////////////////////////////////////////////////
296+
/// Async iterator structures
297+
///////////////////////////////////////////////////////////////////
298+
299+
struct _zend_async_iterator_s {
300+
zend_async_microtask_t microtask;
301+
void (*run)(zend_async_iterator_t *iterator);
302+
void (*run_in_coroutine)(zend_async_iterator_t *iterator, int32_t priority);
303+
};
304+
305+
typedef zend_result (*zend_async_iterator_handler_t)(zend_async_iterator_t *iterator, zval *current, zval *key);
306+
307+
typedef zend_async_iterator_t* (*zend_async_new_iterator_t)(
308+
zval *array,
309+
zend_object_iterator *zend_iterator,
310+
zend_fcall_t *fcall,
311+
zend_async_iterator_handler_t handler,
312+
unsigned int concurrency,
313+
int32_t priority,
314+
size_t iterator_size
315+
);
316+
294317
///////////////////////////////////////////////////////////////////
295318
/// Event Structures
296319
///////////////////////////////////////////////////////////////////
@@ -1065,6 +1088,9 @@ ZEND_API extern zend_async_add_microtask_t zend_async_add_microtask_fn;
10651088
ZEND_API extern zend_async_get_awaiting_info_t zend_async_get_awaiting_info_fn;
10661089
ZEND_API extern zend_async_get_class_ce_t zend_async_get_class_ce_fn;
10671090

1091+
/* Iterator API */
1092+
ZEND_API extern zend_async_new_iterator_t zend_async_new_iterator_fn;
1093+
10681094
/* Context API */
10691095
ZEND_API extern zend_async_new_context_t zend_async_new_context_fn;
10701096

@@ -1132,7 +1158,8 @@ ZEND_API bool zend_async_scheduler_register(
11321158
zend_async_get_coroutines_t get_coroutines_fn,
11331159
zend_async_add_microtask_t add_microtask_fn,
11341160
zend_async_get_awaiting_info_t get_awaiting_info_fn,
1135-
zend_async_get_class_ce_t get_class_ce_fn
1161+
zend_async_get_class_ce_t get_class_ce_fn,
1162+
zend_async_new_iterator_t new_iterator_fn
11361163
);
11371164

11381165
ZEND_API bool zend_async_reactor_register(
@@ -1314,6 +1341,12 @@ END_EXTERN_C()
13141341
#define ZEND_ASYNC_SOCKET_LISTEN_EX(host, port, backlog, extra_size) \
13151342
zend_async_socket_listen_fn(host, port, backlog, extra_size)
13161343

1344+
/* Iterator API Macros */
1345+
#define ZEND_ASYNC_NEW_ITERATOR(array, zend_iterator, fcall, handler, concurrency, priority) \
1346+
zend_async_new_iterator_fn(array, zend_iterator, fcall, handler, concurrency, priority, 0)
1347+
#define ZEND_ASYNC_NEW_ITERATOR_EX(array, zend_iterator, fcall, handler, concurrency, priority, size) \
1348+
zend_async_new_iterator_fn(array, zend_iterator, fcall, handler, concurrency, priority, size)
1349+
13171350
/* Context API Macros */
13181351
#define ZEND_ASYNC_NEW_CONTEXT(parent) zend_async_new_context_fn(parent)
13191352
#define ZEND_ASYNC_CURRENT_CONTEXT (ZEND_ASYNC_G(coroutine) != NULL ? ZEND_ASYNC_G(coroutine)->scope->context : NULL)

0 commit comments

Comments
 (0)