Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Inside SWOOLE: 非同期処理はどのようにして動くのか/inside_swoole

Inside SWOOLE: 非同期処理はどのようにして動くのか/inside_swoole

KOYAMA Tetsuji

February 09, 2020
Tweet

More Decks by KOYAMA Tetsuji

Other Decks in Programming

Transcript

  1. PHPerKaigi 2020 / 2020-02-09 ࣗݾ঺հ খࢁ఩ࢤ ͜΍·ͯͭ͡  ߹ಉձࣾ΄ٕ͛ݚ Ϣʔβձ͍͔ͭ͘

    ೔ຊ6/*9Ϣʔβձ ೔ຊ1PTUHSF42-Ϣʔβձ ೔ຊ1)1Ϣʔβձ SBLVNPגࣜձࣾΤϯδχΞ өըΛ؍Δਓˡ/&8 !LPZIPHF LPZIPHF
  2. PHPerKaigi 2020 / 2020-02-09 HP 473 if (SWOOLE_G(use_shortname)) 474 {

    475 SW_FUNCTION_ALIAS(CG(function_table), "swoole_coroutine_create", CG(function_table), "go"); 476 SW_FUNCTION_ALIAS(CG(function_table), "swoole_coroutine_defer", CG(function_table), "defer"); 477 } swoole.cc
  3. PHPerKaigi 2020 / 2020-02-09 TXPPMF@DPSPVUJOF@DSFBUF 931 PHP_FUNCTION(swoole_coroutine_create) 932 { 933

    zend_fcall_info fci; 934 zend_fcall_info_cache fci_cache; 935 936 ZEND_PARSE_PARAMETERS_START(1, -1) 937 Z_PARAM_FUNC(fci, fci_cache) 938 Z_PARAM_VARIADIC('*', fci.params, fci.param_count) 939 ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); 940 941 if (sw_unlikely(SWOOLE_G(req_status) == PHP_SWOOLE_CALL_USER_SHUTDOWNFUNC_BEGIN)) swoole_coroutine.cc
  4. PHPerKaigi 2020 / 2020-02-09 1)1$PSPVUJOFDSFBUF 814 long PHPCoroutine::create(zend_fcall_info_cache *fci_cache, uint32_t

    argc, zval *argv) 815 { : 838 php_coro_args php_coro_args; 839 php_coro_args.fci_cache = fci_cache; 840 php_coro_args.argv = argv; 841 php_coro_args.argc = argc; 842 save_task(get_task()); 843 844 return Coroutine::create(main_func, (void*) &php_coro_args); 845 } swoole_coroutine.cc
  5. PHPerKaigi 2020 / 2020-02-09 $PSPVUJOFDSFBUF 121 static inline long create(coroutine_func_t

    fn, void* args = nullptr) 122 { 123 return (new Coroutine(fn, args))->run(); 124 } include/coroutine.h
  6. PHPerKaigi 2020 / 2020-02-09 $PSPVUJOF$PSPVUJOF 205 Coroutine(coroutine_func_t fn, void *private_data)

    : 206 ctx(stack_size, fn, private_data) 207 { 208 cid = ++last_cid; 209 coroutines[cid] = this; 210 if (sw_unlikely(count() > peak_num)) 211 { 212 peak_num = count(); 213 } 214 } include/coroutine.h
  7. PHPerKaigi 2020 / 2020-02-09 $PSPVUJOFSVO 216 inline long run() 217

    { 218 long cid = this->cid; 219 origin = current; 220 current = this; 221 ctx.swap_in(); 222 check_end(); 223 return cid; 224 } include/coroutine.h
  8. PHPerKaigi 2020 / 2020-02-09 $PSPVUJOFDUY 199 sw_coro_state state = SW_CORO_INIT;

    200 long cid; 201 void *task = nullptr; 202 Context ctx; 203 Coroutine *origin; include/coroutine.h
  9. PHPerKaigi 2020 / 2020-02-09 $POUFYUTXBQ@JO 110 bool Context::swap_in() 111 {

    112 jump_fcontext(&swap_ctx_, ctx_, (intptr_t) this, true); 113 return true; 114 } src/coroutine/context.cc