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.

Reply via email to