@@ -174,7 +174,7 @@ static zend_fiber_stack *zend_fiber_stack_allocate(size_t size)
174
174
if (!pointer ) {
175
175
DWORD err = GetLastError ();
176
176
char * errmsg = php_win32_error_to_msg (err );
177
- zend_throw_exception_ex (NULL , 0 , "Fiber make context failed: VirtualAlloc failed: [0x%08lx] %s" , err , errmsg [0 ] ? errmsg : "Unknown" );
177
+ zend_throw_exception_ex (NULL , 0 , "Fiber stack allocate failed: VirtualAlloc failed: [0x%08lx] %s" , err , errmsg [0 ] ? errmsg : "Unknown" );
178
178
php_win32_error_msg_free (errmsg );
179
179
return NULL ;
180
180
}
@@ -185,7 +185,7 @@ static zend_fiber_stack *zend_fiber_stack_allocate(size_t size)
185
185
if (!VirtualProtect (pointer , ZEND_FIBER_GUARD_PAGES * page_size , PAGE_READWRITE | PAGE_GUARD , & protect )) {
186
186
DWORD err = GetLastError ();
187
187
char * errmsg = php_win32_error_to_msg (err );
188
- zend_throw_exception_ex (NULL , 0 , "Fiber protect stack failed: VirtualProtect failed: [0x%08lx] %s" , err , errmsg [0 ] ? errmsg : "Unknown" );
188
+ zend_throw_exception_ex (NULL , 0 , "Fiber stack protect failed: VirtualProtect failed: [0x%08lx] %s" , err , errmsg [0 ] ? errmsg : "Unknown" );
189
189
php_win32_error_msg_free (errmsg );
190
190
VirtualFree (pointer , 0 , MEM_RELEASE );
191
191
return NULL ;
@@ -195,13 +195,13 @@ static zend_fiber_stack *zend_fiber_stack_allocate(size_t size)
195
195
pointer = mmap (NULL , alloc_size , PROT_READ | PROT_WRITE , MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK , -1 , 0 );
196
196
197
197
if (pointer == MAP_FAILED ) {
198
- zend_throw_exception_ex (NULL , 0 , "Fiber make context failed: mmap failed: %s (%d)" , strerror (errno ), errno );
198
+ zend_throw_exception_ex (NULL , 0 , "Fiber stack allocate failed: mmap failed: %s (%d)" , strerror (errno ), errno );
199
199
return NULL ;
200
200
}
201
201
202
202
# if ZEND_FIBER_GUARD_PAGES
203
203
if (mprotect (pointer , ZEND_FIBER_GUARD_PAGES * page_size , PROT_NONE ) < 0 ) {
204
- zend_throw_exception_ex (NULL , 0 , "Fiber protect stack failed: mmap failed: %s (%d)" , strerror (errno ), errno );
204
+ zend_throw_exception_ex (NULL , 0 , "Fiber stack protect failed: mprotect failed: %s (%d)" , strerror (errno ), errno );
205
205
munmap (pointer , alloc_size );
206
206
return NULL ;
207
207
}
@@ -253,7 +253,7 @@ static ZEND_NORETURN void zend_fiber_trampoline(boost_context_data data)
253
253
__sanitizer_finish_switch_fiber (NULL , & from -> stack -> asan_pointer , & from -> stack -> asan_size );
254
254
#endif
255
255
256
- /* Get a hold of the context that resumed us and update it's handle to allow for symmetric coroutines. */
256
+ /* Get a hold of the context that resumed us and update its handle to allow for symmetric coroutines. */
257
257
from -> handle = data .handle ;
258
258
259
259
/* Initialize transfer struct with a copy of passed data. */
@@ -309,6 +309,9 @@ ZEND_API bool zend_fiber_init_context(zend_fiber_context *context, void *kind, z
309
309
context -> kind = kind ;
310
310
context -> function = coroutine ;
311
311
312
+ // Set status in case memory has not been zeroed.
313
+ context -> status = ZEND_FIBER_STATUS_INIT ;
314
+
312
315
return true;
313
316
}
314
317
@@ -323,7 +326,7 @@ ZEND_API void zend_fiber_switch_context(zend_fiber_transfer *transfer)
323
326
zend_fiber_context * to = transfer -> context ;
324
327
zend_fiber_vm_state state ;
325
328
326
- ZEND_ASSERT (to && to -> handle && "Invalid fiber context" );
329
+ ZEND_ASSERT (to && to -> handle && to -> status != ZEND_FIBER_STATUS_DEAD && "Invalid fiber context" );
327
330
ZEND_ASSERT (from && "From fiber context must be present" );
328
331
ZEND_ASSERT (to != from && "Cannot switch into the running fiber context" );
329
332
@@ -365,7 +368,7 @@ ZEND_API void zend_fiber_switch_context(zend_fiber_transfer *transfer)
365
368
/* Copy transfer struct because it might live on the other fiber's stack that will eventually be destroyed. */
366
369
* transfer = * data .transfer ;
367
370
368
- /* Get a hold of the context that resumed us and update it's handle to allow for symmetric coroutines. */
371
+ /* Get a hold of the context that resumed us and update its handle to allow for symmetric coroutines. */
369
372
to = transfer -> context ;
370
373
to -> handle = data .handle ;
371
374
@@ -377,7 +380,7 @@ ZEND_API void zend_fiber_switch_context(zend_fiber_transfer *transfer)
377
380
378
381
zend_fiber_restore_vm_state (& state );
379
382
380
- /* Destroy context first to ensure it does not leak if some extension does custom bailout handling . */
383
+ /* Destroy prior context if it has been marked as dead . */
381
384
if (to -> status == ZEND_FIBER_STATUS_DEAD ) {
382
385
zend_fiber_destroy_context (to );
383
386
}
@@ -450,7 +453,7 @@ static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer)
450
453
}
451
454
452
455
/* Handles forwarding of result / error from a transfer into the running fiber. */
453
- static zend_always_inline void delegate_transfer_result (
456
+ static zend_always_inline void zend_fiber_delegate_transfer_result (
454
457
zend_fiber * fiber , zend_fiber_transfer * transfer , INTERNAL_FUNCTION_PARAMETERS
455
458
) {
456
459
if (transfer -> flags & ZEND_FIBER_TRANSFER_FLAG_ERROR ) {
@@ -579,7 +582,7 @@ static void zend_fiber_object_free(zend_object *object)
579
582
580
583
ZEND_METHOD (Fiber , __construct )
581
584
{
582
- zend_fiber * fiber = (zend_fiber * ) Z_OBJ_P (getThis () );
585
+ zend_fiber * fiber = (zend_fiber * ) Z_OBJ_P (ZEND_THIS );
583
586
584
587
ZEND_PARSE_PARAMETERS_START (1 , 1 )
585
588
Z_PARAM_FUNC (fiber -> fci , fiber -> fci_cache )
@@ -591,7 +594,7 @@ ZEND_METHOD(Fiber, __construct)
591
594
592
595
ZEND_METHOD (Fiber , start )
593
596
{
594
- zend_fiber * fiber = (zend_fiber * ) Z_OBJ_P (getThis () );
597
+ zend_fiber * fiber = (zend_fiber * ) Z_OBJ_P (ZEND_THIS );
595
598
zval * params ;
596
599
uint32_t param_count ;
597
600
zend_array * named_params ;
@@ -622,7 +625,7 @@ ZEND_METHOD(Fiber, start)
622
625
623
626
zend_fiber_transfer transfer = zend_fiber_resume (fiber , NULL , false);
624
627
625
- delegate_transfer_result (fiber , & transfer , INTERNAL_FUNCTION_PARAM_PASSTHRU );
628
+ zend_fiber_delegate_transfer_result (fiber , & transfer , INTERNAL_FUNCTION_PARAM_PASSTHRU );
626
629
}
627
630
628
631
ZEND_METHOD (Fiber , suspend )
@@ -665,7 +668,7 @@ ZEND_METHOD(Fiber, suspend)
665
668
RETURN_THROWS ();
666
669
}
667
670
668
- delegate_transfer_result (fiber , & transfer , INTERNAL_FUNCTION_PARAM_PASSTHRU );
671
+ zend_fiber_delegate_transfer_result (fiber , & transfer , INTERNAL_FUNCTION_PARAM_PASSTHRU );
669
672
}
670
673
671
674
ZEND_METHOD (Fiber , resume )
@@ -683,7 +686,7 @@ ZEND_METHOD(Fiber, resume)
683
686
RETURN_THROWS ();
684
687
}
685
688
686
- fiber = (zend_fiber * ) Z_OBJ_P (getThis () );
689
+ fiber = (zend_fiber * ) Z_OBJ_P (ZEND_THIS );
687
690
688
691
if (UNEXPECTED (fiber -> context .status != ZEND_FIBER_STATUS_SUSPENDED || fiber -> caller != NULL )) {
689
692
zend_throw_error (zend_ce_fiber_error , "Cannot resume a fiber that is not suspended" );
@@ -694,7 +697,7 @@ ZEND_METHOD(Fiber, resume)
694
697
695
698
zend_fiber_transfer transfer = zend_fiber_resume (fiber , value , false);
696
699
697
- delegate_transfer_result (fiber , & transfer , INTERNAL_FUNCTION_PARAM_PASSTHRU );
700
+ zend_fiber_delegate_transfer_result (fiber , & transfer , INTERNAL_FUNCTION_PARAM_PASSTHRU );
698
701
}
699
702
700
703
ZEND_METHOD (Fiber , throw )
@@ -711,7 +714,7 @@ ZEND_METHOD(Fiber, throw)
711
714
RETURN_THROWS ();
712
715
}
713
716
714
- fiber = (zend_fiber * ) Z_OBJ_P (getThis () );
717
+ fiber = (zend_fiber * ) Z_OBJ_P (ZEND_THIS );
715
718
716
719
if (UNEXPECTED (fiber -> context .status != ZEND_FIBER_STATUS_SUSPENDED || fiber -> caller != NULL )) {
717
720
zend_throw_error (zend_ce_fiber_error , "Cannot resume a fiber that is not suspended" );
@@ -722,7 +725,7 @@ ZEND_METHOD(Fiber, throw)
722
725
723
726
zend_fiber_transfer transfer = zend_fiber_resume (fiber , exception , true);
724
727
725
- delegate_transfer_result (fiber , & transfer , INTERNAL_FUNCTION_PARAM_PASSTHRU );
728
+ zend_fiber_delegate_transfer_result (fiber , & transfer , INTERNAL_FUNCTION_PARAM_PASSTHRU );
726
729
}
727
730
728
731
ZEND_METHOD (Fiber , isStarted )
@@ -731,7 +734,7 @@ ZEND_METHOD(Fiber, isStarted)
731
734
732
735
ZEND_PARSE_PARAMETERS_NONE ();
733
736
734
- fiber = (zend_fiber * ) Z_OBJ_P (getThis () );
737
+ fiber = (zend_fiber * ) Z_OBJ_P (ZEND_THIS );
735
738
736
739
RETURN_BOOL (fiber -> context .status != ZEND_FIBER_STATUS_INIT );
737
740
}
@@ -742,7 +745,7 @@ ZEND_METHOD(Fiber, isSuspended)
742
745
743
746
ZEND_PARSE_PARAMETERS_NONE ();
744
747
745
- fiber = (zend_fiber * ) Z_OBJ_P (getThis () );
748
+ fiber = (zend_fiber * ) Z_OBJ_P (ZEND_THIS );
746
749
747
750
RETURN_BOOL (fiber -> context .status == ZEND_FIBER_STATUS_SUSPENDED && fiber -> caller == NULL );
748
751
}
@@ -753,7 +756,7 @@ ZEND_METHOD(Fiber, isRunning)
753
756
754
757
ZEND_PARSE_PARAMETERS_NONE ();
755
758
756
- fiber = (zend_fiber * ) Z_OBJ_P (getThis () );
759
+ fiber = (zend_fiber * ) Z_OBJ_P (ZEND_THIS );
757
760
758
761
RETURN_BOOL (fiber -> context .status == ZEND_FIBER_STATUS_RUNNING || fiber -> caller != NULL );
759
762
}
@@ -764,7 +767,7 @@ ZEND_METHOD(Fiber, isTerminated)
764
767
765
768
ZEND_PARSE_PARAMETERS_NONE ();
766
769
767
- fiber = (zend_fiber * ) Z_OBJ_P (getThis () );
770
+ fiber = (zend_fiber * ) Z_OBJ_P (ZEND_THIS );
768
771
769
772
RETURN_BOOL (fiber -> context .status == ZEND_FIBER_STATUS_DEAD );
770
773
}
@@ -776,7 +779,7 @@ ZEND_METHOD(Fiber, getReturn)
776
779
777
780
ZEND_PARSE_PARAMETERS_NONE ();
778
781
779
- fiber = (zend_fiber * ) Z_OBJ_P (getThis () );
782
+ fiber = (zend_fiber * ) Z_OBJ_P (ZEND_THIS );
780
783
781
784
if (fiber -> context .status == ZEND_FIBER_STATUS_DEAD ) {
782
785
if (fiber -> flags & ZEND_FIBER_FLAG_THREW ) {
@@ -814,7 +817,7 @@ ZEND_METHOD(FiberError, __construct)
814
817
zend_throw_error (
815
818
NULL ,
816
819
"The \"%s\" class is reserved for internal use and cannot be manually instantiated" ,
817
- ZSTR_VAL (Z_OBJCE_P (getThis () )-> name )
820
+ ZSTR_VAL (Z_OBJCE_P (ZEND_THIS )-> name )
818
821
);
819
822
}
820
823
0 commit comments