@@ -407,7 +407,8 @@ ZEND_API void zend_async_waker_destroy(zend_coroutine_t *coroutine)
407
407
}
408
408
409
409
if (waker -> triggered_events != NULL ) {
410
- zend_array_release (waker -> triggered_events );
410
+ zend_hash_destroy (waker -> triggered_events );
411
+ efree (waker -> triggered_events );
411
412
waker -> triggered_events = NULL ;
412
413
}
413
414
@@ -424,10 +425,14 @@ ZEND_API void zend_async_waker_destroy(zend_coroutine_t *coroutine)
424
425
425
426
static void event_callback_dispose (zend_async_event_callback_t * callback , zend_async_event_t * event )
426
427
{
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 -- ;
428
431
return ;
429
432
}
430
433
434
+ callback -> ref_count = 0 ;
435
+
431
436
zend_async_waker_t * waker = ((zend_coroutine_event_callback_t * ) callback )-> coroutine -> waker ;
432
437
433
438
if (event != NULL && waker != NULL ) {
@@ -449,7 +454,7 @@ ZEND_API void zend_async_waker_add_triggered_event(zend_coroutine_t *coroutine,
449
454
}
450
455
451
456
if (coroutine -> waker -> triggered_events == NULL ) {
452
- coroutine -> waker -> triggered_events = (HashTable * ) malloc (sizeof (HashTable ));
457
+ coroutine -> waker -> triggered_events = (HashTable * ) emalloc (sizeof (HashTable ));
453
458
zend_hash_init (coroutine -> waker -> triggered_events , 2 , NULL , waker_triggered_events_dtor , 0 );
454
459
}
455
460
@@ -529,7 +534,7 @@ ZEND_API void zend_async_waker_callback_resolve(
529
534
if (exception == NULL && coroutine -> waker != NULL ) {
530
535
531
536
if (coroutine -> waker -> triggered_events == NULL ) {
532
- coroutine -> waker -> triggered_events = (HashTable * ) malloc (sizeof (HashTable ));
537
+ coroutine -> waker -> triggered_events = (HashTable * ) emalloc (sizeof (HashTable ));
533
538
zend_hash_init (coroutine -> waker -> triggered_events , 2 , NULL , waker_triggered_events_dtor , 0 );
534
539
}
535
540
@@ -538,7 +543,7 @@ ZEND_API void zend_async_waker_callback_resolve(
538
543
}
539
544
540
545
// 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 ) {
542
547
ZVAL_COPY (& coroutine -> waker -> result , result );
543
548
}
544
549
}
0 commit comments