yedf2 / handy

🔥简洁易用的C++11网络库 / 支持单机千万并发连接 / a simple C++11 network server framework
BSD 2-Clause "Simplified" License
4.56k stars 1.33k forks source link

Poller在处理事件不应该用 if else #46

Closed xxxsen closed 5 years ago

xxxsen commented 6 years ago

判断可读可写应该是2个 if 否则会导致读写事件同时出现的时候要2次 epoll_wait才能处理完,另外如果读事件一直出现还会导致写事件一直得不到处理。。简单瞄了一眼。。不知道有没有搞错。。😁😁

jovany-wang commented 6 years ago

@xxxsen Hey guy, Thanks for ur report.

Could you please give the location of the code? And I will check it later.

Also, could you write an unit test for this if you are free?

xxxsen commented 6 years ago

poller.cc PollerEpoll::loop_once

HaHaJeff commented 6 years ago

判断可读可写应该是2个 if 否则会导致读写事件同时出现的时候要2次 epoll_wait才能处理完,另外如果读事件一直出现还会导致写事件一直得不到处理。。简单瞄了一眼。。不知道有没有搞错。。😁😁

赞同。这里应该使用两个if语句进行判断。可以参见libevent的处理方式。传送门

fangxian commented 5 years ago

我写了个简单的测试用例, 如果一直有读事件的话,写事件时常会得不到及时处理 服务端 https://github.com/fangxian/handy/blob/3631a86176b04757c274e454e27f74e127e2b34c/examples/test_svr.cc 客户端 https://github.com/fangxian/handy/blob/4d768307d16d33d93a951b51263276747f967978/examples/test_cli.cc

loop_once()中添加了debug日志来查看一次epoll_wait是处理了读/写 or读写事件都处理 https://github.com/fangxian/handy/blob/4d768307d16d33d93a951b51263276747f967978/handy/poller.cc#L95

yedf2 commented 5 years ago

已更新