Skip to content

Commit 6fa485b

Browse files
committed
* Unit test await\001-await_basic.phpt
1 parent 5059d33 commit 6fa485b

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

Zend/zend_async_API.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

425426
static 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

Comments
 (0)