Open sidyhe opened 2 years ago
之所以没将将超时设为-1,就是防止没有句柄被监听的情况。另外,该超时值还会被动态地修改,比如在 hooked poll中。
是的, 一共有两个超时判定 io loop的timeout和ev->timeout
分层来看 io loop只关心io和timer综合后应当timeout的值 event只关心上层给的timeout和自己的timeout谁更小
整体来看 所以io loop提供的timeout只是一个建议的值 event_process会把两个timeout做比较, 用最小的那个
你所说的动态修改是指ev->timeout吧, 看到poll和fiber delay会改它 又review了一遍代码, 应该没啥问题?
还需要拿一些例子去验证一下,另外,acl_fiber_nready 函数中需要把所有准备好的协程都得要包含进去。
unsigned acl_fiber_nready(void) {
if (__thread_fiber == NULL) {
return 0;
}
return (unsigned) ring_size(&__thread_fiber->ready);
}
是根据ndead仿照的, 是否有遗漏的情况呢
鉴于之前timer变量未更新的问题, 研究了一下io loop逻辑 发现即使需要更久的io超时, 也会把它限制在100毫秒以内 去掉此限制后, 程序却不会正常退出, 因为最后一个fiber无io无timer却会执行event_process且无期限(timeout == -1) 所以loop逻辑不够完善, 遂重写了一遍 添加了
acl_fiber_nready
函数 (所以之前fiber从创建到被调度是有额外延时的?) 重写之后会做最合适的超时判定, 不会再被无意义的唤醒, 减少了冗余代码 没有提PR的原因是刚写好, 尚未经过一定时间的验证, 也想请作者review一下