@@ -407,7 +407,8 @@ ZEND_API void zend_async_waker_destroy(zend_coroutine_t *coroutine)
407407 }
408408
409409 if (waker -> triggered_events != NULL ) {
410- zend_array_release (waker -> triggered_events );
410+ zend_hash_destroy (waker -> triggered_events );
411+ efree (waker -> triggered_events );
411412 waker -> triggered_events = NULL ;
412413 }
413414
@@ -424,10 +425,14 @@ ZEND_API void zend_async_waker_destroy(zend_coroutine_t *coroutine)
424425
425426static void event_callback_dispose (zend_async_event_callback_t * callback , zend_async_event_t * event )
426427{
427- if (callback -> ref_count != 0 ) {
428+ if (callback -> ref_count > 1 ) {
429+ // If the callback is still referenced, we cannot dispose it yet
430+ callback -> ref_count -- ;
428431 return ;
429432 }
430433
434+ callback -> ref_count = 0 ;
435+
431436 zend_async_waker_t * waker = ((zend_coroutine_event_callback_t * ) callback )-> coroutine -> waker ;
432437
433438 if (event != NULL && waker != NULL ) {
@@ -449,7 +454,7 @@ ZEND_API void zend_async_waker_add_triggered_event(zend_coroutine_t *coroutine,
449454 }
450455
451456 if (coroutine -> waker -> triggered_events == NULL ) {
452- coroutine -> waker -> triggered_events = (HashTable * ) malloc (sizeof (HashTable ));
457+ coroutine -> waker -> triggered_events = (HashTable * ) emalloc (sizeof (HashTable ));
453458 zend_hash_init (coroutine -> waker -> triggered_events , 2 , NULL , waker_triggered_events_dtor , 0 );
454459 }
455460
@@ -529,7 +534,7 @@ ZEND_API void zend_async_waker_callback_resolve(
529534 if (exception == NULL && coroutine -> waker != NULL ) {
530535
531536 if (coroutine -> waker -> triggered_events == NULL ) {
532- coroutine -> waker -> triggered_events = (HashTable * ) malloc (sizeof (HashTable ));
537+ coroutine -> waker -> triggered_events = (HashTable * ) emalloc (sizeof (HashTable ));
533538 zend_hash_init (coroutine -> waker -> triggered_events , 2 , NULL , waker_triggered_events_dtor , 0 );
534539 }
535540
@@ -538,7 +543,7 @@ ZEND_API void zend_async_waker_callback_resolve(
538543 }
539544
540545 // Copy the result to the waker if it is not NULL
541- if (ZEND_ASYNC_EVENT_WILL_RESULT_USED (event ) && result != NULL ) {
546+ if (ZEND_ASYNC_EVENT_WILL_ZVAL_RESULT (event ) && result != NULL ) {
542547 ZVAL_COPY (& coroutine -> waker -> result , result );
543548 }
544549 }
0 commit comments