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