読者です 読者をやめる 読者になる 読者になる

言語のしくみを読む

node_run関数
strm_seq_init(),strm_socket_init()が準備を完了させたら
次に呼ぶのがexec_expr関数で、渡されたnodeをswitch文で分岐させながら
taskを作ってキューに登録する。登録されたtaskはqueue.cのstrm_queue_exec関数が
実行を行っている。
キューに登録された関数はwrite_cb関数で渡されたデータは"Hello world"という文字列
であった。

exec_expr関数にnodeが渡されると最初に取り出されるのはNODE_STMTS  
そこから再帰的にexec_expr関数が呼ばれNODE_OPが取り出される。
strm_string opは文字列に"|“を持っている
node * lhs NODE_ARRAY
node * rhs NODE_IDENT

lhsからexec_expr関数を呼び出し、中身は"Hello world"を持っている
一度呼び出し側に戻り今度はrhsでexec_expr関数を呼び出す。
NODE_OPに帰ってきたらexec_call関数を呼び出す。
この時呼び出される関数はexec_bar関数で、今回はlhs:arrayのコメントが
あるパートからstrm_alloc_stream関数を呼びstrm_taskにタスクを登録している
start_funcにwrite_cb関数を登録している。

他のスレッドによりstrm_queue_exec関数内からwrite_cb関数を
呼び、画面に(STDOUT)に"Hello World"を表示させている