<37 new auto-negotiating client connection
37: going from conn_new_cmd to conn_waiting
37: going from conn_waiting to conn_read
37: going from conn_read to conn_parse_cmd
37: Client using the ascii protocol
<37 get test
> FOUND KEY test
>37 sending key test
>37 END
37: going from conn_parse_cmd to conn_mwrite
37: going from conn_mwrite to conn_new_cmd
37: going from conn_new_cmd to conn_waiting
37: going from conn_waiting to conn_read
第一步,主线程状态机处在 conn_listening 状态,accept 到客户端请求,调用
dispatch_conn_new 函数分配到一个 work thread,并指定 worker thread 初始状态为
conn_new_cmd,监听的 libevent 事件为 EV_READ,然后跳出主线程状态机,此后的工作
就交给 worker thread。
第二步,在 dispatch_conn_new,函数中将 connection 信息封装,加入到
connection 队列中去。同时为该线程的 pipe 写端写入字符’c’,转到 pipe 读端绑定的回调
函数 thread_libevent_process 中。
第三步,thread_libevent_process 接收到字符’c’,从改线程的 connection 池队头弹
出一个封装好了的 connection item。然后调用 conn_new 函数,实例化 connection 绑定回
调函数。此后就进入该线程的 machine_drive 函数里的有限状态机进行处理。此时状态机
的状态是第一步传进来的 conn_new_cmd 状态。
第四步,在 conn_new_cmd 状态进入 reset_cmd_handler 函数,在这个函数里面会
转入 conn_waiting 状态,在 conn_waiting 状态会转化为 conn_read 状态
第五步,在 conn_read 状态调用 try_read_network 函数,在此函数中会将该
connection 的 socket 内容读取到 connection 的结构体成员 rbuf 中并且根据 rbytes 做偏移,
并且根据 try_read_network 函数的返回值决定下一步状态。
评论0
最新资源