/* trampoline signal handler */ static void trampoline (int sig) { if (coro_setjmp (new_coro->env)) coro_init (); /* start it */ else trampoline_done = 1; }
int main( void ) { coro_init(); for ( ; ; ) { if ( coro_schedule() == 0 ) break; } coro_uninit(); return ( 0 ); }
void php_swoole_event_wait() { if (SwooleWG.in_client == 1 && SwooleWG.reactor_ready == 0 && SwooleG.running) { if (PG(last_error_message)) { switch (PG(last_error_type)) { case E_ERROR: case E_CORE_ERROR: case E_USER_ERROR: case E_COMPILE_ERROR: return; default: break; } } SwooleWG.reactor_ready = 1; #ifdef HAVE_SIGNALFD if (SwooleG.main_reactor->check_signalfd) { swSignalfd_setup(SwooleG.main_reactor); } #endif #ifdef SW_COROUTINE if (COROG.active == 0) { coro_init(); } #endif if (!swReactor_empty(SwooleG.main_reactor)) { SW_SAVE_EG_SCOPE(scope); int ret = SwooleG.main_reactor->wait(SwooleG.main_reactor, NULL); if (ret < 0) { swoole_php_fatal_error(E_ERROR, "reactor wait failed. Error: %s [%d]", strerror(errno), errno); } SW_RESUME_EG_SCOPE(scope); } if (SwooleG.timer.map) { php_swoole_clear_all_timer(); } SwooleWG.reactor_exit = 1; } }
static PHP_METHOD(swoole_coroutine_util, create) { zval *callback; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &callback) == FAILURE) { return; } sw_zval_add_ref(&callback); callback = sw_zval_dup(callback); char *func_name = NULL; zend_fcall_info_cache *func_cache = emalloc(sizeof(zend_fcall_info_cache)); if (!sw_zend_is_callable_ex(callback, NULL, 0, &func_name, NULL, func_cache, NULL TSRMLS_CC)) { swoole_php_fatal_error(E_ERROR, "Function '%s' is not callable", func_name); sw_zval_free(callback); efree(func_name); return; } efree(func_name); php_swoole_check_reactor(); if (swReactorCheckPoint == NULL) { coro_init(TSRMLS_C); } zval *retval = NULL; zval *args[1]; jmp_buf *prev_checkpoint = swReactorCheckPoint; swReactorCheckPoint = emalloc(sizeof(jmp_buf)); php_context *cxt = emalloc(sizeof(php_context)); coro_save(cxt); int ret = coro_create(func_cache, args, 0, &retval, NULL, NULL); efree(func_cache); efree(swReactorCheckPoint); if (ret < 0) { sw_zval_free(callback); RETURN_FALSE; } //save callback COROG.current_coro->function = callback; swReactorCheckPoint = prev_checkpoint; coro_resume_parent(cxt, retval, retval); efree(cxt); if (EG(exception)) { zend_exception_error(EG(exception), E_ERROR TSRMLS_CC); } if (retval != NULL) { sw_zval_ptr_dtor(&retval); } RETURN_TRUE; }