Running on Linux with pthreads.

One thread (CBTcpProxyListenerThread below) adds bufferevents (with option 
BEV_OPT_THREADSAFE) to an event_base.
A second thread (CBTcpProxySenderThread) dispatches on the event_base.

bufferevents are removed from the event_base either by a third thread or by the 
CBTcpProxySenderThread by calling bufferevent_free (without calling 
bufferevent_disable first - is this a misuse?).

The deadlock happens on pretty high load: ~6000 bufferevents are added and 
removed per second. Each one is triggered for write ~10 times per seconds 
(which gives ~60,000 triggeres per-second).

Here's the deadlock stack:
Thread 1 (CBTcpProxyListenerThread)
#0  0x00000030c1c0c758 in __lll_mutex_lock_wait () from 
/opt/breach-proxy/lib64/libpthread.so.0
#1  0x00000030c1c087fa in _L_mutex_lock_908 () from 
/opt/breach-proxy/lib64/libpthread.so.0
#2  0x00000030c1c08682 in pthread_mutex_lock () from 
/opt/breach-proxy/lib64/libpthread.so.0
#3  0x00002aaab13039c8 in evthread_posix_lock (mode=0, _lock=0x15f27b20) at 
evthread_pthread.c:71
#4  0x00002aaab10e0f05 in event_add (ev=0x15f27d58, tv=0x0) at event.c:1815
#5  0x00002aaab10ed356 in _bufferevent_add_event (ev=0x15f27d58, tv=0x15f27e40) 
at bufferevent.c:824
#6  0x00002aaab10edf3e in be_socket_enable (bufev=0x15f27cc0, event=4) at 
bufferevent_sock.c:548
#7  0x00002aaab10ec296 in bufferevent_enable (bufev=0x15f27cc0, event=4) at 
bufferevent.c:418
#8  0x00002aaaaaac398d in CBTcpProxySenderThread::AddEvents (this=0x15f27490, 
px...@0x15e649d0) at sender_thread.cpp:56
#9  0x00002aaaaaac4a83 in CBTcpProxy::AddEvents (this=0x7fff061d3a70, 
px...@0x15e649d0) at tcpproxy.cpp:465
#10 0x00002aaaaaabc920 in complete_pxcn_after_server_connect (fd=236, what=4, 
arg=0x15e649d0) at listener_thread.cpp:234
#11 0x00002aaab10dedca in event_process_active_single_queue (base=0x15c04650, 
activeq=0x15c066f0) at event.c:1232
#12 0x00002aaab10df35d in event_process_active (base=0x15c04650) at event.c:1290
#13 0x00002aaab10df98c in event_base_loop (base=0x15c04650, flags=0) at 
event.c:1483
#14 0x00002aaab10df3c6 in event_base_dispatch (event_base=0x15c04650) at 
event.c:1317
#15 0x00002aaaaaabdae3 in CBTcpProxyListenerThread::run (this=0x15c04510) at 
listener_thread.cpp:41
...

Thread 2 (CBTcpProxySenderThread)
#0  0x00000030c1c0c758 in __lll_mutex_lock_wait () from 
/opt/breach-proxy/lib64/libpthread.so.0
#1  0x00000030c1c087fa in _L_mutex_lock_908 () from 
/opt/breach-proxy/lib64/libpthread.so.0
#2  0x00000030c1c08682 in pthread_mutex_lock () from 
/opt/breach-proxy/lib64/libpthread.so.0
#3  0x00002aaab13039c8 in evthread_posix_lock (mode=0, _lock=0x15f27b20) at 
evthread_pthread.c:71
#4  0x00002aaab10e188e in event_del (ev=0x2aaabc0678a0) at event.c:2015
#5  0x00002aaab10ee095 in be_socket_destruct (bufev=0x2aaabc067890) at 
bufferevent_sock.c:581
#6  0x00002aaab10ec956 in _bufferevent_decref_and_unlock (bufev=0x2aaabc067890) 
at bufferevent.c:600
#7  0x00002aaab10ed85f in bufferevent_writecb (fd=321, event=4, 
arg=0x2aaabc067890) at bufferevent_sock.c:306
#8  0x00002aaab10df1a7 in event_persist_closure (base=0x15f275e0, 
ev=0x2aaabc067928) at event.c:1184
#9  0x00002aaab10ded6d in event_process_active_single_queue (base=0x15f275e0, 
activeq=0x15f27b00) at event.c:1227
#10 0x00002aaab10df35d in event_process_active (base=0x15f275e0) at event.c:1290
#11 0x00002aaab10df98c in event_base_loop (base=0x15f275e0, flags=0) at 
event.c:1483
#12 0x00002aaab10df3c6 in event_base_dispatch (event_base=0x15f275e0) at 
event.c:1317
#13 0x00002aaaaaac3ab2 in CBTcpProxySenderThread::run (this=0x15f27490) at 
sender_thread.cpp:35
...

Thanks,
Avi

Reply via email to