boost::asio::io_service::poll_once vs EPOLLET
The conditional define of boost::asio::io_service that uses epoll always seems to use edge triggered (ET) flag instead of level triggered (LT). This makes me think poll_once should be avoided due to Scenario 1 below. Can anyone confirm this? Given: 1) 2 sockets (A and B) added to epoll interface for receiving only 2) 2 UDP messages arrive in the same moment on socket A 3) epoll_wait returns a ready socket (socket A) Scenario 1: Using ET with poll_once: 4) If io_service::poll_once is called 1 of 2 messages are read 5) epoll_wait(ET) blocks until another message is received Result: Bad, starvation if another message is not received Scenario 2: Using ET with poll: 4) If io_service::poll is called 2 of 2 messages are read 5) epoll_wait(ET) blocks until another message is received? Result: Good, all messages processed without A/B fairness (unfair since read was greedy) Scenario 3: Using LT with poll_once: 4) If io_service::poll_once is called 1 of 2 messages are read 5) epoll_wait(LT) returns a ready socket (socket A) 6) If io_service::poll_once is called 1 of 1 messages are read Result: Good, all messages processed with A/B fairness I don't think Scenario 3 is currently supported by boost::asio::io_service. Jason
participants (1)
-
Jason Aubrey