@@ -322,15 +322,39 @@ ZEND_STATIC_ASSERT(ZEND_MM_ALIGNED_SIZE(sizeof(zval)) == sizeof(zval),
322322ZEND_API void zend_vm_stack_init (void );
323323ZEND_API void zend_vm_stack_init_ex (size_t page_size );
324324ZEND_API void zend_vm_stack_destroy (void );
325+ ZEND_API void zend_vm_stack_destroy_caches (void );
325326ZEND_API void * zend_vm_stack_extend (size_t size );
326327
327- static zend_always_inline zend_vm_stack zend_vm_stack_new_page (size_t size , zend_vm_stack prev ) {
328- zend_vm_stack page = EG (vm_stack_page_cache );
328+ #define ZEND_FIBER_VM_STACK_SIZE (1024 * sizeof(zval))
329+
330+ static zend_always_inline zend_vm_stack zend_vm_stack_cached_page (size_t size ) {
331+ zend_vm_stack page ;
329332
330- if (page != NULL && EXPECTED ((size_t )((char * )page -> end - (char * )page ) == size )) {
331- EG (vm_stack_page_cache ) = page -> prev ;
332- EG (vm_stack_page_cache_count )-- ;
333+ if (size == ZEND_FIBER_VM_STACK_SIZE ) {
334+ page = EG (fiber_vm_stack_page_cache );
335+ if (page ) {
336+ ZEND_ASSERT ((size_t )((char * )page -> end - (char * )page ) == size );
337+ EG (fiber_vm_stack_page_cache ) = page -> prev ;
338+ EG (fiber_vm_stack_page_cache_count )-- ;
339+ return page ;
340+ }
333341 } else {
342+ page = EG (vm_stack_page_cache );
343+ ZEND_ASSERT (!page || ((size_t )((char * )page -> end - (char * )page ) == size ) || size != EG (vm_stack_page_size ));
344+ if (page && EXPECTED ((size_t )((char * )page -> end - (char * )page ) == size )) {
345+ EG (vm_stack_page_cache ) = page -> prev ;
346+ EG (vm_stack_page_cache_count )-- ;
347+ return page ;
348+ }
349+ }
350+
351+ return NULL ;
352+ }
353+
354+ static zend_always_inline zend_vm_stack zend_vm_stack_new_page (size_t size , zend_vm_stack prev ) {
355+ zend_vm_stack page = zend_vm_stack_cached_page (size );
356+
357+ if (!page ) {
334358 page = (zend_vm_stack )emalloc (size );
335359 }
336360
@@ -428,13 +452,23 @@ static zend_always_inline void zend_vm_stack_free_call_frame_ex(uint32_t call_in
428452 EG (vm_stack_top ) = prev -> top ;
429453 EG (vm_stack_end ) = prev -> end ;
430454 EG (vm_stack ) = prev ;
431- if (EG (vm_stack_page_cache_count ) < 32
432- && (size_t )((char * )p -> end - (char * )p ) == EG (vm_stack_page_size )) {
433- p -> prev = EG (vm_stack_page_cache );
434- EG (vm_stack_page_cache ) = p ;
435- EG (vm_stack_page_cache_count )++ ;
455+ if ((size_t )((char * )p -> end - (char * )p ) == ZEND_FIBER_VM_STACK_SIZE ) {
456+ if (EG (fiber_vm_stack_page_cache_count ) < 32 ) {
457+ p -> prev = EG (fiber_vm_stack_page_cache );
458+ EG (fiber_vm_stack_page_cache ) = p ;
459+ EG (fiber_vm_stack_page_cache_count )++ ;
460+ } else {
461+ efree (p );
462+ }
436463 } else {
437- efree (p );
464+ if (EG (vm_stack_page_cache_count ) < 32
465+ && (size_t )((char * )p -> end - (char * )p ) == EG (vm_stack_page_size )) {
466+ p -> prev = EG (vm_stack_page_cache );
467+ EG (vm_stack_page_cache ) = p ;
468+ EG (vm_stack_page_cache_count )++ ;
469+ } else {
470+ efree (p );
471+ }
438472 }
439473 } else {
440474 EG (vm_stack_top ) = (zval * )call ;
0 commit comments