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
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy