1919#include "zend_fibers.h"
2020#include "zend_globals.h"
2121
22- #define ZEND_ASYNC_API "TrueAsync API v0.2 .0"
22+ #define ZEND_ASYNC_API "TrueAsync API v0.3 .0"
2323#define ZEND_ASYNC_API_VERSION_MAJOR 0
24- #define ZEND_ASYNC_API_VERSION_MINOR 2
24+ #define ZEND_ASYNC_API_VERSION_MINOR 3
2525#define ZEND_ASYNC_API_VERSION_PATCH 0
2626
2727#define ZEND_ASYNC_API_VERSION_NUMBER \
@@ -88,6 +88,11 @@ typedef enum {
8888 ZEND_ASYNC_EXEC_MODE_SHELL_EXEC
8989} zend_async_exec_mode ;
9090
91+ typedef enum {
92+ ZEND_COROUTINE_NORMAL = 0 ,
93+ ZEND_COROUTINE_HI_PRIORITY = 255
94+ } zend_coroutine_priority ;
95+
9196typedef enum
9297{
9398 ZEND_ASYNC_CLASS_NO = 0 ,
@@ -334,7 +339,9 @@ typedef void (*zend_async_iterator_method_t)(zend_async_iterator_t *iterator);
334339 /* The maximum number of concurrent tasks that can be executed at the same time */ \
335340 unsigned int concurrency ; \
336341 /* Priority for coroutines created by this iterator */ \
337- int32_t priority ;
342+ int32_t priority ; \
343+ /* NULLABLE. Exception that stopped the iterator */ \
344+ zend_object * exception ;
338345
339346struct _zend_async_iterator_s {
340347 ZEND_ASYNC_ITERATOR_FIELDS
@@ -381,10 +388,12 @@ struct _zend_async_event_callback_s {
381388 }
382389
383390#define ZEND_ASYNC_EVENT_CALLBACK_RELEASE (callback ) \
384- if (callback != NULL && callback->ref_count > 1) { \
385- callback->ref_count--; \
391+ if ((callback) != NULL && (callback)->ref_count > 1) { \
392+ (callback)->ref_count--; \
393+ } else if((callback)->dispose != NULL) { \
394+ (callback)->dispose((callback), NULL); \
386395 } else { \
387- coroutine_event_callback_dispose(callback, NULL); \
396+ coroutine_event_callback_dispose(( callback) , NULL); \
388397 }
389398
390399struct _zend_coroutine_event_callback_s {
@@ -789,11 +798,13 @@ struct _zend_async_scope_s {
789798#define ZEND_ASYNC_SCOPE_F_NO_FREE_MEMORY ZEND_ASYNC_EVENT_F_NO_FREE_MEMORY /* scope will not free memory in dispose handler */
790799#define ZEND_ASYNC_SCOPE_F_DISPOSE_SAFELY (1u << 14) /* scope will be disposed safely */
791800#define ZEND_ASYNC_SCOPE_F_CANCELLED (1u << 15) /* scope was cancelled */
801+ #define ZEND_ASYNC_SCOPE_F_DISPOSING (1u << 16) /* scope disposing */
792802
793803#define ZEND_ASYNC_SCOPE_IS_CLOSED (scope ) (((scope)->event.flags & ZEND_ASYNC_SCOPE_F_CLOSED) != 0)
794804#define ZEND_ASYNC_SCOPE_IS_NO_FREE_MEMORY (scope ) (((scope)->event.flags & ZEND_ASYNC_SCOPE_F_NO_FREE_MEMORY) != 0)
795805#define ZEND_ASYNC_SCOPE_IS_DISPOSE_SAFELY (scope ) (((scope)->event.flags & ZEND_ASYNC_SCOPE_F_DISPOSE_SAFELY) != 0)
796806#define ZEND_ASYNC_SCOPE_IS_CANCELLED (scope ) (((scope)->event.flags & ZEND_ASYNC_SCOPE_F_CANCELLED) != 0)
807+ #define ZEND_ASYNC_SCOPE_IS_DISPOSING (scope ) (((scope)->event.flags & ZEND_ASYNC_SCOPE_F_DISPOSING) != 0)
797808
798809#define ZEND_ASYNC_SCOPE_SET_CLOSED (scope ) ((scope)->event.flags |= ZEND_ASYNC_SCOPE_F_CLOSED)
799810#define ZEND_ASYNC_SCOPE_CLR_CLOSED (scope ) ((scope)->event.flags &= ~ZEND_ASYNC_SCOPE_F_CLOSED)
@@ -806,6 +817,9 @@ struct _zend_async_scope_s {
806817
807818#define ZEND_ASYNC_SCOPE_SET_CANCELLED (scope ) ((scope)->event.flags |= ZEND_ASYNC_SCOPE_F_CANCELLED)
808819
820+ #define ZEND_ASYNC_SCOPE_SET_DISPOSING (scope ) ((scope)->event.flags |= ZEND_ASYNC_SCOPE_F_DISPOSING)
821+ #define ZEND_ASYNC_SCOPE_CLR_DISPOSING (scope ) ((scope)->event.flags &= ~ZEND_ASYNC_SCOPE_F_DISPOSING)
822+
809823static zend_always_inline void
810824zend_async_scope_add_child (zend_async_scope_t * parent_scope , zend_async_scope_t * child_scope )
811825{
@@ -1282,6 +1296,7 @@ ZEND_API zend_async_event_callback_t * zend_async_event_callback_new(zend_async_
12821296ZEND_API zend_coroutine_event_callback_t * zend_async_coroutine_callback_new (
12831297 zend_coroutine_t * coroutine , zend_async_event_callback_fn callback , size_t size
12841298);
1299+ ZEND_API void coroutine_event_callback_dispose (zend_async_event_callback_t * callback , zend_async_event_t * event );
12851300
12861301/* Waker API */
12871302ZEND_API zend_async_waker_t * zend_async_waker_new (zend_coroutine_t * coroutine );
@@ -1293,6 +1308,7 @@ ZEND_API bool zend_async_waker_apply_error(
12931308);
12941309ZEND_API void zend_async_waker_destroy (zend_coroutine_t * coroutine );
12951310ZEND_API void zend_async_waker_add_triggered_event (zend_coroutine_t * coroutine , zend_async_event_t * event );
1311+ ZEND_API bool zend_async_waker_is_event_exists (zend_coroutine_t * coroutine , zend_async_event_t * event );
12961312
12971313#define ZEND_ASYNC_WAKER_APPLY_ERROR (waker , error , transfer ) zend_async_waker_apply_error((waker), (error), (transfer), true, false)
12981314#define ZEND_ASYNC_WAKER_APPEND_ERROR (waker , error , transfer ) zend_async_waker_apply_error((waker), (error), (transfer), false, false)
0 commit comments