2020#include "php_uv.h"
2121#include "ext/standard/info.h"
2222
23+
2324#ifndef PHP_UV_DEBUG
2425#define PHP_UV_DEBUG 0
2526#endif
@@ -168,6 +169,16 @@ zend_fcall_info empty_fcall_info = { 0, NULL, NULL, NULL, NULL, 0, NULL, NULL, 0
168169#define PHP_UV_DEBUG_RESOURCE_REFCOUNT (name , resource_id )
169170#endif
170171
172+ #ifdef ZTS
173+ #define UV_FETCH_ALL (ls , id , type ) ((type) (*((void ***) ls))[TSRM_UNSHUFFLE_RSRC_ID(id)])
174+ #define UV_FETCH_CTX (ls , id , type , element ) (((type) (*((void ***) ls))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element)
175+ #define UV_CG (ls , v ) UV_FETCH_CTX(ls, compiler_globals_id, zend_compiler_globals*, v)
176+ #define UV_CG_ALL (ls ) UV_FETCH_ALL(ls, compiler_globals_id, zend_compiler_globals*)
177+ #define UV_EG (ls , v ) UV_FETCH_CTX(ls, executor_globals_id, zend_executor_globals*, v)
178+ #define UV_SG (ls , v ) UV_FETCH_CTX(ls, sapi_globals_id, sapi_globals_struct*, v)
179+ #define UV_EG_ALL (ls ) UV_FETCH_ALL(ls, executor_globals_id, zend_executor_globals*)
180+ #endif
181+
171182
172183extern void php_uv_init (TSRMLS_D );
173184
@@ -1197,20 +1208,80 @@ static int php_uv_do_callback(zval **retval_ptr, zval *callback, zval ***params,
11971208 return error ;
11981209}
11991210
1200-
12011211static int php_uv_do_callback2 (zval * * retval_ptr , php_uv_t * uv , zval * * * params , int param_count , enum php_uv_callback_type type TSRMLS_DC )
12021212{
12031213 int error = 0 ;
1204-
1214+
1215+ if (ZEND_FCI_INITIALIZED (uv -> callback [type ]-> fci )) {
1216+ uv -> callback [type ]-> fci .params = params ;
1217+ uv -> callback [type ]-> fci .retval_ptr_ptr = retval_ptr ;
1218+ uv -> callback [type ]-> fci .param_count = param_count ;
1219+ uv -> callback [type ]-> fci .no_separation = 1 ;
1220+
1221+ if (zend_call_function (& uv -> callback [type ]-> fci , & uv -> callback [type ]-> fcc TSRMLS_CC ) != SUCCESS ) {
1222+ error = -1 ;
1223+ }
1224+ } else {
1225+ error = -2 ;
1226+ }
1227+
1228+ //zend_fcall_info_args_clear(&uv->callback[type]->fci, 0);
1229+
1230+ return error ;
1231+ }
1232+
1233+ #ifdef ZTS
1234+ static int php_uv_do_callback3 (zval * * retval_ptr , php_uv_t * uv , zval * * * params , int param_count , enum php_uv_callback_type type )
1235+ {
1236+ int error = 0 ;
1237+ zend_executor_globals * ZEG = NULL ;
1238+ void * * * tsrm_ls , * * * old ;
1239+
12051240 if (ZEND_FCI_INITIALIZED (uv -> callback [type ]-> fci )) {
1241+ tsrm_ls = tsrm_new_interpreter_context ();
1242+ old = tsrm_set_interpreter_context (tsrm_ls );
1243+
1244+ PG (expose_php ) = 0 ;
1245+ PG (auto_globals_jit ) = 0 ;
1246+
1247+ php_request_startup (TSRMLS_C );
1248+ ZEG = UV_EG_ALL (TSRMLS_C );
1249+ ZEG -> in_execution = 1 ;
1250+ ZEG -> current_execute_data = NULL ;
1251+ ZEG -> current_module = phpext_uv_ptr ;
1252+ ZEG -> This = NULL ;
1253+
12061254 uv -> callback [type ]-> fci .params = params ;
12071255 uv -> callback [type ]-> fci .retval_ptr_ptr = retval_ptr ;
12081256 uv -> callback [type ]-> fci .param_count = param_count ;
12091257 uv -> callback [type ]-> fci .no_separation = 1 ;
1258+ uv -> callback [type ]-> fci .object_ptr = ZEG -> This ;
1259+ uv -> callback [type ]-> fcc .initialized = 1 ;
1260+
1261+ uv -> callback [type ]-> fcc .calling_scope = NULL ;
1262+ uv -> callback [type ]-> fcc .called_scope = NULL ;
1263+ uv -> callback [type ]-> fcc .object_ptr = ZEG -> This ;
12101264
12111265 if (zend_call_function (& uv -> callback [type ]-> fci , & uv -> callback [type ]-> fcc TSRMLS_CC ) != SUCCESS ) {
12121266 error = -1 ;
12131267 }
1268+
1269+ {
1270+ zend_op_array * ops = & uv -> callback [type ]-> fcc .function_handler -> op_array ;
1271+ if (ops ) {
1272+ if (ops -> run_time_cache ) {
1273+ efree (ops -> run_time_cache );
1274+ ops -> run_time_cache = NULL ;
1275+ }
1276+ }
1277+ }
1278+ if (retval_ptr != NULL ) {
1279+ zval_ptr_dtor (retval_ptr );
1280+ }
1281+
1282+ php_request_shutdown (TSRMLS_C );
1283+ tsrm_set_interpreter_context (old );
1284+ tsrm_free_interpreter_context (tsrm_ls );
12141285 } else {
12151286 error = -2 ;
12161287 }
@@ -1219,6 +1290,11 @@ static int php_uv_do_callback2(zval **retval_ptr, php_uv_t *uv, zval ***params,
12191290
12201291 return error ;
12211292}
1293+ #else
1294+ static int php_uv_do_callback3 (zval * * retval_ptr , php_uv_t * uv , zval * * * params , int param_count , enum php_uv_callback_type type )
1295+ {
1296+ }
1297+ #endif
12221298
12231299static void php_uv_tcp_connect_cb (uv_connect_t * req , int status )
12241300{
@@ -1628,7 +1704,7 @@ static void php_uv_async_cb(uv_async_t* handle, int status)
16281704
16291705 params [0 ] = & resource ;
16301706 params [1 ] = & zstat ;
1631-
1707+
16321708 php_uv_do_callback2 (& retval_ptr , uv , params , 2 , PHP_UV_ASYNC_CB TSRMLS_CC );
16331709
16341710 zval_ptr_dtor (& resource );
@@ -1650,11 +1726,8 @@ static void php_uv_work_cb(uv_work_t* req)
16501726
16511727 PHP_UV_DEBUG_PRINT ("work_cb\n" );
16521728
1653- php_uv_do_callback2 (& retval_ptr , uv , NULL , 0 , PHP_UV_WORK_CB TSRMLS_CC );
1729+ php_uv_do_callback3 (& retval_ptr , uv , NULL , 0 , PHP_UV_WORK_CB );
16541730
1655- if (retval_ptr != NULL ) {
1656- zval_ptr_dtor (& retval_ptr );
1657- }
16581731 PHP_UV_DEBUG_RESOURCE_REFCOUNT (uv_work_cb , uv -> resource_id );
16591732}
16601733
@@ -1664,12 +1737,13 @@ static void php_uv_after_work_cb(uv_work_t* req, int status)
16641737 php_uv_t * uv = (php_uv_t * )req -> data ;
16651738 TSRMLS_FETCH_FROM_CTX (uv != NULL ? uv -> thread_ctx : NULL );
16661739
1740+ uv = (php_uv_t * )req -> data ;
1741+
16671742 PHP_UV_DEBUG_PRINT ("after_work_cb\n" );
16681743
1669- php_uv_do_callback2 (& retval_ptr , uv , NULL , 0 , PHP_UV_AFTER_WORK_CB TSRMLS_CC );
1744+ php_uv_do_callback3 (& retval_ptr , uv , NULL , 0 , PHP_UV_AFTER_WORK_CB );
16701745
1671- zval_ptr_dtor (& retval_ptr );
1672- PHP_UV_DEBUG_RESOURCE_REFCOUNT (uv_after_work_cb , uv -> resource_id );
1746+ PHP_UV_DEBUG_RESOURCE_REFCOUNT (uv_work_cb , uv -> resource_id );
16731747}
16741748
16751749static void php_uv_fs_cb (uv_fs_t * req )
@@ -5537,6 +5611,7 @@ PHP_FUNCTION(uv_async_send)
55375611*/
55385612PHP_FUNCTION (uv_queue_work )
55395613{
5614+ #ifdef ZTS
55405615 int r ;
55415616 zval * zloop = NULL ;
55425617 uv_loop_t * loop ;
@@ -5564,6 +5639,9 @@ PHP_FUNCTION(uv_queue_work)
55645639 php_error_docref (NULL TSRMLS_CC , E_ERROR , "uv_queue_work failed ");
55655640 return ;
55665641 }
5642+ #else
5643+ php_error_docref (NULL TSRMLS_CC , E_ERROR , "uv_queue_work doesn't support this PHP. please rebuild with --enable-maintainer-zts" );
5644+ #endif
55675645}
55685646/* }}} */
55695647
0 commit comments