Skip to content

Commit

Permalink
Remove copying of fiber result to transfer value
Browse files Browse the repository at this point in the history
Removes unnecessary copying of fiber return value to transfer value. This zval was not used as the return of start/resume/throw, instead being destroyed when the fiber was dead. Now the zval initialized to NULL when starting the fiber is maintained as the transfer value and is subsequently returned from start/resume/throw.
  • Loading branch information
trowski committed Jun 19, 2021
1 parent f71d62e commit 15dcdd7
Showing 1 changed file with 8 additions and 13 deletions.
21 changes: 8 additions & 13 deletions Zend/zend_fibers.c
Expand Up @@ -388,6 +388,9 @@ ZEND_API void zend_fiber_switch_context(zend_fiber_transfer *transfer)

static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer)
{
ZEND_ASSERT(Z_TYPE(transfer->value) == IS_NULL && "Initial transfer value to fiber context must be NULL");
ZEND_ASSERT(!transfer->flags && "No flags should be set on initial transfer");

zend_fiber *fiber = EG(active_fiber);

/* Determine the current error_reporting ini setting. */
Expand All @@ -398,7 +401,6 @@ static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer)
}

EG(vm_stack) = NULL;
transfer->flags = 0;

zend_first_try {
zend_vm_stack stack = zend_vm_stack_new_page(ZEND_FIBER_VM_STACK_SIZE, NULL);
Expand Down Expand Up @@ -436,8 +438,6 @@ static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer)
}

zend_clear_exception();
} else {
ZVAL_COPY(&transfer->value, &fiber->result);
}
} zend_catch {
fiber->flags |= ZEND_FIBER_FLAG_BAILOUT;
Expand All @@ -454,19 +454,14 @@ static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer)

/* Handles forwarding of result / error from a transfer into the running fiber. */
static zend_always_inline void zend_fiber_delegate_transfer_result(
zend_fiber *fiber, zend_fiber_transfer *transfer, INTERNAL_FUNCTION_PARAMETERS
zend_fiber_transfer *transfer, INTERNAL_FUNCTION_PARAMETERS
) {
if (transfer->flags & ZEND_FIBER_TRANSFER_FLAG_ERROR) {
/* Use internal throw to skip the Throwable-check that would fail for (graceful) exit. */
zend_throw_exception_internal(Z_OBJ(transfer->value));
RETURN_THROWS();
}

if (fiber->context.status == ZEND_FIBER_STATUS_DEAD) {
zval_ptr_dtor(&transfer->value);
RETURN_NULL();
}

RETURN_COPY_VALUE(&transfer->value);
}

Expand Down Expand Up @@ -625,7 +620,7 @@ ZEND_METHOD(Fiber, start)

zend_fiber_transfer transfer = zend_fiber_resume(fiber, NULL, false);

zend_fiber_delegate_transfer_result(fiber, &transfer, INTERNAL_FUNCTION_PARAM_PASSTHRU);
zend_fiber_delegate_transfer_result(&transfer, INTERNAL_FUNCTION_PARAM_PASSTHRU);
}

ZEND_METHOD(Fiber, suspend)
Expand Down Expand Up @@ -668,7 +663,7 @@ ZEND_METHOD(Fiber, suspend)
RETURN_THROWS();
}

zend_fiber_delegate_transfer_result(fiber, &transfer, INTERNAL_FUNCTION_PARAM_PASSTHRU);
zend_fiber_delegate_transfer_result(&transfer, INTERNAL_FUNCTION_PARAM_PASSTHRU);
}

ZEND_METHOD(Fiber, resume)
Expand Down Expand Up @@ -697,7 +692,7 @@ ZEND_METHOD(Fiber, resume)

zend_fiber_transfer transfer = zend_fiber_resume(fiber, value, false);

zend_fiber_delegate_transfer_result(fiber, &transfer, INTERNAL_FUNCTION_PARAM_PASSTHRU);
zend_fiber_delegate_transfer_result(&transfer, INTERNAL_FUNCTION_PARAM_PASSTHRU);
}

ZEND_METHOD(Fiber, throw)
Expand Down Expand Up @@ -725,7 +720,7 @@ ZEND_METHOD(Fiber, throw)

zend_fiber_transfer transfer = zend_fiber_resume(fiber, exception, true);

zend_fiber_delegate_transfer_result(fiber, &transfer, INTERNAL_FUNCTION_PARAM_PASSTHRU);
zend_fiber_delegate_transfer_result(&transfer, INTERNAL_FUNCTION_PARAM_PASSTHRU);
}

ZEND_METHOD(Fiber, isStarted)
Expand Down

0 comments on commit 15dcdd7

Please sign in to comment.