I ran into a strange situation where some new connections were randomly
closed just after many client connections were closed. I finally get the
reason after diving into source code and debugging for several hours.
When bufferevent is freed, the internal socket is closed at be_async_ctrl().
Call stack:
> 51CY.exe!be_async_ctrl(bufferevent * bev, bufferevent_ctrl_op op,
bufferevent_ctrl_data * data) Line 673 C
51CY.exe!bufferevent_cancel_all_(bufferevent * bev) Line 884 + 0x15
bytes C
51CY.exe!bufferevent_free(bufferevent * bufev) Line 786 + 0x9 bytes
C
51CY.exe!be_filter_unlink(bufferevent * bev) Line 234 + 0xf bytes
C
51CY.exe!bufferevent_decref_and_unlock_(bufferevent * bufev) Line
696 + 0xf bytes C
51CY.exe!bufferevent_free(bufferevent * bufev) Line 787 + 0x9 bytes
C
Bufferevent_free() also forwards a event callback to event_base.
Call stack:
> 51CY.exe!event_callback_finalize_many_(event_base * base, int n_cbs,
event_callback * * evcbs, void (event_callback *, void *)* cb) Line 2210
C
51CY.exe!bufferevent_decref_and_unlock_(bufferevent * bufev) Line
713 + 0x18 bytes C
51CY.exe!bufferevent_free(bufferevent * bufev) Line 787 + 0x9 bytes
C
The same socket is secondly closed when the event callback is invoked in the
next event_base loop.
Callstack:
> 51CYClient.exe!evutil_closesocket(int sock) Line 425 C
51CYClient.exe!be_async_destruct(bufferevent * bev) Line 386 + 0x9
bytes C
51CYClient.exe!bufferevent_finalize_cb_(event_callback * evcb, void *
arg_) Line 734 + 0xf bytes C
51CYClient.exe!event_process_active_single_queue(event_base * base,
evcallback_list * activeq, int max_to_process, const timeval * endtime)
Line 1604 + 0xe bytes C
51CYClient.exe!event_process_active(event_base * base) Line 1668 +
0x14 bytes C
51CYClient.exe!event_base_loop(event_base * base, int flags) Line
1890 + 0x9 bytes C
So socket of new connection will be closed by this mean if the new socket
handle value equals to the old one.