forked from swoole/swoole-src
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathswoole_coroutine.h
146 lines (126 loc) · 4.03 KB
/
swoole_coroutine.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#ifndef SWOOLE_CORO_INCLUDE_C_H_
#define SWOOLE_CORO_INCLUDE_C_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "coroutine.h"
#include "zend_vm.h"
#include "zend_closures.h"
/* PHP 7.0 compatibility macro {{{*/
#if PHP_VERSION_ID < 70100
#define SW_SAVE_EG_SCOPE(_scope) zend_class_entry *_scope = EG(scope)
#define SW_RESUME_EG_SCOPE(_scope) EG(scope) = _scope
#else
#define SW_SAVE_EG_SCOPE(scope)
#define SW_RESUME_EG_SCOPE(scope)
#endif/*}}}*/
/* PHP 7.3 compatibility macro {{{*/
#ifndef ZEND_CLOSURE_OBJECT
# define ZEND_CLOSURE_OBJECT(func) (zend_object*)func->op_array.prototype
#endif
#ifndef GC_ADDREF
# define GC_ADDREF(ref) ++GC_REFCOUNT(ref)
# define GC_DELREF(ref) --GC_REFCOUNT(ref)
#endif/*}}}*/
#define SW_EX_CV_NUM(ex, n) (((zval ***)(((char *)(ex)) + ZEND_MM_ALIGNED_SIZE(sizeof(zend_execute_data)))) + n)
#define SW_EX_CV(var) (*SW_EX_CV_NUM(execute_data, var))
typedef enum
{
SW_CORO_CONTEXT_RUNNING, SW_CORO_CONTEXT_IN_DELAYED_TIMEOUT_LIST, SW_CORO_CONTEXT_TERM
} php_context_state;
typedef struct _php_args
{
zend_fcall_info_cache *fci_cache;
zval **argv;
int argc;
zval *retval;
} php_args;
typedef struct _coro_task
{
#ifdef SW_LOG_TRACE_OPEN
int cid;
#endif
zend_execute_data *execute_data;
zend_vm_stack stack;
zval *vm_stack_top;
zval *vm_stack_end;
zend_vm_stack origin_stack;
zval *origin_vm_stack_top;
zval *origin_vm_stack_end;
zend_execute_data *yield_execute_data;
zend_vm_stack yield_stack;
zval *yield_vm_stack_top;
zval *yield_vm_stack_end;
zend_output_globals *current_coro_output_ptr;
/**
* user coroutine
*/
coroutine_t *co;
} coro_task;
typedef struct _php_context
{
zval **current_coro_return_value_ptr_ptr;
zval *current_coro_return_value_ptr;
zval coro_params;
void *private_data;
swTimer_node *timer;
zval **current_eg_return_value_ptr_ptr;
zend_execute_data *current_execute_data;
zval *current_vm_stack_top;
zval *current_vm_stack_end;
zval *allocated_return_value_ptr;
coro_task *current_task;
zend_vm_stack current_vm_stack;
php_context_state state;
zend_output_globals *current_coro_output_ptr;
} php_context;
typedef struct _coro_global
{
uint32_t coro_num;
uint32_t max_coro_num;
uint32_t peak_coro_num;
uint32_t stack_size;
zend_vm_stack origin_vm_stack;
zval *origin_vm_stack_top;
zval *origin_vm_stack_end;
zval *allocated_return_value_ptr;
zend_execute_data *origin_ex;
zend_bool active;
int error;
} coro_global;
typedef struct _swTimer_coro_callback
{
int ms;
int cli_fd;
long *timeout_id;
void* data;
} swTimer_coro_callback;
extern coro_global COROG;
int sw_get_current_cid();
int coro_init(void);
void coro_destroy(void);
void coro_check(void);
#define sw_coro_is_in() (sw_get_current_cid() != -1)
#define coro_create(op_array, argv, argc, retval, post_callback, param) \
sw_coro_create(op_array, argv, argc, *retval, post_callback, param)
#define coro_save(sw_php_context) \
sw_coro_save(return_value, sw_php_context);
#define coro_resume(sw_current_context, retval, coro_retval) \
sw_coro_resume(sw_current_context, retval, *coro_retval)
#define coro_yield() sw_coro_yield()
#define coro_use_return_value(); *(zend_uchar *) &execute_data->prev_execute_data->opline->result_type = IS_VAR;
/* output globals */
#define SWOG ((zend_output_globals *) &OG(handlers))
int sw_coro_create(zend_fcall_info_cache *op_array, zval **argv, int argc, zval *retval, void *post_callback, void *param);
void sw_coro_yield();
void sw_coro_close();
int sw_coro_resume(php_context *sw_current_context, zval *retval, zval *coro_retval);
void sw_coro_save(zval *return_value, php_context *sw_php_context);
void sw_coro_set_stack_size(int stack_size);
extern int swoole_coroutine_sleep(double msec);
int php_swoole_add_timer_coro(int ms, int cli_fd, long *timeout_id, void* param, swLinkedList_node **node);
int php_swoole_clear_timer_coro(long id);
#ifdef __cplusplus
} /* end extern "C" */
#endif
#endif /* SWOOLE_CORO_INCLUDE_C_H_ */