php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
zend_fibers.h
Go to the documentation of this file.
1/*
2 +----------------------------------------------------------------------+
3 | Zend Engine |
4 +----------------------------------------------------------------------+
5 | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) |
6 +----------------------------------------------------------------------+
7 | This source file is subject to version 2.00 of the Zend license, |
8 | that is bundled with this package in the file LICENSE, and is |
9 | available through the world-wide-web at the following url: |
10 | http://www.zend.com/license/2_00.txt. |
11 | If you did not receive a copy of the Zend license and are unable to |
12 | obtain it through the world-wide-web, please send a note to |
13 | license@zend.com so we can mail you a copy immediately. |
14 +----------------------------------------------------------------------+
15 | Authors: Aaron Piotrowski <aaron@trowski.com> |
16 | Martin Schröder <m.schroeder2007@gmail.com> |
17 +----------------------------------------------------------------------+
18*/
19
20#ifndef ZEND_FIBERS_H
21#define ZEND_FIBERS_H
22
23#include "zend_API.h"
24#include "zend_types.h"
25
26#define ZEND_FIBER_GUARD_PAGES 1
27
28#define ZEND_FIBER_DEFAULT_C_STACK_SIZE (4096 * (((sizeof(void *)) < 8) ? 256 : 512))
29#define ZEND_FIBER_VM_STACK_SIZE (1024 * sizeof(zval))
30
32
39
45
50
51void zend_register_fiber_ce(void);
52void zend_fiber_init(void);
53void zend_fiber_shutdown(void);
54
56
58
59/* Encapsulates data needed for a context switch. */
60typedef struct _zend_fiber_transfer {
61 /* Fiber that will be switched to / has resumed us. */
63
64 /* Value to that should be send to (or was received from) a fiber. */
66
67 /* Bitmask of flags defined in enum zend_fiber_transfer_flag. */
68 uint8_t flags;
70
71/* Coroutine functions must populate the given transfer with a new context
72 * and (optional) data before they return. */
75
77 /* Pointer to boost.context or ucontext_t data. */
78 void *handle;
79
80 /* Pointer that identifies the fiber type. */
81 void *kind;
82
83 /* Entrypoint function of the fiber. */
85
86 /* Cleanup function for fiber. */
88
89 /* Assigned C stack. */
91
92 /* Fiber status. */
94
95 /* Observer state */
97
98 /* Reserved for extensions */
100};
101
103 /* PHP object handle. */
105
106 /* Flags are defined in enum zend_fiber_flag. */
107 uint8_t flags;
108
109 /* Native C fiber context. */
111
112 /* Fiber that resumed us. */
114
115 /* Fiber that suspended us. */
117
118 /* Callback and info / cache to be used when fiber is started. */
121
122 /* Current Zend VM execute data being run by the fiber. */
124
125 /* Frame on the bottom of the fiber vm stack. */
127
128 /* Active fiber vm stack. */
130
131 /* Storage for fiber return value. */
133};
134
138
139/* These functions may be used to create custom fiber objects using the bundled fiber switching context. */
143#ifdef ZEND_CHECK_STACK_LIMIT
144ZEND_API void* zend_fiber_stack_limit(zend_fiber_stack *stack);
145ZEND_API void* zend_fiber_stack_base(zend_fiber_stack *stack);
146#endif /* ZEND_CHECK_STACK_LIMIT */
147
151
153
154static zend_always_inline zend_fiber *zend_fiber_from_context(zend_fiber_context *context)
155{
156 ZEND_ASSERT(context->kind == zend_ce_fiber && "Fiber context does not belong to a Zend fiber");
157
158 return (zend_fiber *)(((char *) context) - XtOffsetOf(zend_fiber, context));
159}
160
161static zend_always_inline zend_fiber_context *zend_fiber_get_context(zend_fiber *fiber)
162{
163 return &fiber->context;
164}
165
166#endif
new_type kind
Definition ffi.c:4363
zend_execute_data * top_observed_frame
Definition zend_fibers.h:96
zend_fiber_clean cleanup
Definition zend_fibers.h:87
zend_fiber_status status
Definition zend_fibers.h:93
void * reserved[ZEND_MAX_RESERVED_RESOURCES]
Definition zend_fibers.h:99
zend_fiber_coroutine function
Definition zend_fibers.h:84
zend_fiber_stack * stack
Definition zend_fibers.h:90
zend_fiber_context * context
Definition zend_fibers.h:62
zend_execute_data * stack_bottom
zend_vm_stack vm_stack
zend_object std
zend_fcall_info fci
zend_fiber_context * caller
zend_fcall_info_cache fci_cache
uint8_t flags
zend_fiber_context context
zend_execute_data * execute_data
zend_fiber_context * previous
Definition dce.c:49
struct _zend_fcall_info_cache zend_fcall_info_cache
struct _zend_fcall_info zend_fcall_info
struct _zval_struct zval
#define ZEND_API
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)
ZEND_API zend_class_entry * zend_ce_fiber
ZEND_API zend_result zend_fiber_init_context(zend_fiber_context *context, void *kind, zend_fiber_coroutine coroutine, size_t stack_size)
void zend_register_fiber_ce(void)
void(* zend_fiber_clean)(zend_fiber_context *context)
Definition zend_fibers.h:74
ZEND_API void zend_fiber_resume(zend_fiber *fiber, zval *value, zval *return_value)
zend_fiber_transfer_flag
Definition zend_fibers.h:46
@ ZEND_FIBER_TRANSFER_FLAG_BAILOUT
Definition zend_fibers.h:48
@ ZEND_FIBER_TRANSFER_FLAG_ERROR
Definition zend_fibers.h:47
ZEND_API void zend_fiber_switch_context(zend_fiber_transfer *transfer)
struct _zend_fiber_stack zend_fiber_stack
Definition zend_fibers.h:57
zend_fiber_flag
Definition zend_fibers.h:40
@ ZEND_FIBER_FLAG_THREW
Definition zend_fibers.h:41
@ ZEND_FIBER_FLAG_DESTROYED
Definition zend_fibers.h:43
@ ZEND_FIBER_FLAG_BAILOUT
Definition zend_fibers.h:42
ZEND_API bool zend_fiber_switch_blocked(void)
ZEND_API void zend_fiber_suspend(zend_fiber *fiber, zval *value, zval *return_value)
zend_fiber_status
Definition zend_fibers.h:33
@ ZEND_FIBER_STATUS_RUNNING
Definition zend_fibers.h:35
@ ZEND_FIBER_STATUS_INIT
Definition zend_fibers.h:34
@ ZEND_FIBER_STATUS_SUSPENDED
Definition zend_fibers.h:36
@ ZEND_FIBER_STATUS_DEAD
Definition zend_fibers.h:37
ZEND_API void zend_fiber_switch_unblock(void)
void(* zend_fiber_coroutine)(zend_fiber_transfer *transfer)
Definition zend_fibers.h:73
void zend_fiber_init(void)
struct _zend_fiber_transfer zend_fiber_transfer
ZEND_API void zend_fiber_switch_block(void)
void zend_fiber_shutdown(void)
ZEND_API zend_result zend_fiber_start(zend_fiber *fiber, zval *return_value)
ZEND_API void zend_fiber_destroy_context(zend_fiber_context *context)
struct _zend_fiber_context zend_fiber_context
struct _zend_vm_stack * zend_vm_stack
struct _zend_fiber zend_fiber
#define END_EXTERN_C()
#define zend_always_inline
#define XtOffsetOf(s_type, field)
#define ZEND_ASSERT(c)
#define ZEND_MAX_RESERVED_RESOURCES
#define BEGIN_EXTERN_C()
struct _zend_class_entry zend_class_entry
struct _zend_object zend_object
ZEND_RESULT_CODE zend_result
Definition zend_types.h:64
struct _zend_execute_data zend_execute_data
Definition zend_types.h:91
zval * return_value
value