#703: Deadlock in libpulse when frequently stopping/starting audio ----------------------+----------------------------------------------------- Reporter: aldimond | Owner: lennart Type: defect | Status: new Milestone: | Component: libpulse Keywords: | ----------------------+----------------------------------------------------- The program I'm using is Audacity (which goes through PortAudio -- the deadlock does not occur unless i output through Pulse). I can easily repro this by playing anything, then dragging around the "Play at Speed" slider. The Pulse server continues to work fine. I'm using Pulse v0.9.19. Another developer is using 0.9.14 and doesn't have this problem.
Here's a backtrace: {{{ (gdb) thread apply all bt full Thread 431 (Thread 0x7fffe15b1910 (LWP 12847)): #0 pthread_cond_wait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:261 No locals. #1 0x00007fffe6e4442b in pa_threaded_mainloop_wait (m=0x2065350) at pulse /thread-mainloop.c:209 __func__ = "pa_threaded_mainloop_wait" __PRETTY_FUNCTION__ = "pa_threaded_mainloop_wait" #2 0x00007fffe65b92aa in pulse_wait_operation () from /usr/lib/alsa- lib/libasound_module_pcm_pulse.so No symbol table info available. #3 0x00007fffe65b8774 in ?? () from /usr/lib/alsa- lib/libasound_module_pcm_pulse.so No symbol table info available. #4 0x00007ffff3f69867 in ?? () from /usr/lib/libasound.so.2 No symbol table info available. #5 0x0000000000955c19 in AlsaStop (stream=0x24a6b40, abort=128) at src/hostapi/alsa/pa_linux_alsa.c:2196 result = <value optimized out> #6 0x0000000000956bfa in OnExit (data=0x24a6b40) at src/hostapi/alsa/pa_linux_alsa.c:2513 __PRETTY_FUNCTION__ = "OnExit" #7 0x000000000095b5a8 in CallbackThreadFunc (userData=<value optimized out>) at src/hostapi/alsa/pa_linux_alsa.c:3251 __cancel_buf = {__cancel_jmp_buf = {{__cancel_jmp_buf = {140736974231824, 8249672085128685470, 140737488343584, 0, 0, 3, -8249614046678145122, 8249671094559909790}, __mask_was_saved = 0}}, __pad = {0x7fffe15b10a0, 0x0, 0x7ffff3abd9aa, 0x0}} not_first_call = -512 result = <value optimized out> stream = 0x24a6b40 timeInfo = {inputBufferAdcTime = 0.046439909297052155, currentTime = 0, outputBufferDacTime = 0.046439909297052155} callbackResult = 0 cbFlags = <value optimized out> __PRETTY_FUNCTION__ = "CallbackThreadFunc" #8 0x00007ffff3abca04 in start_thread (arg=<value optimized out>) at pthread_create.c:300 __res = <value optimized out> pd = 0x7fffe15b1910 unwind_buf = {cancel_jmp_buf = {{jmp_buf = {140736974231824, 8249672085128685470, 140737488343584, 0, 0, 3, -8249614046577481826, -8249646351502465122}, mask_was_saved = 0}}, priv = { pad = {0x0, 0x0, 0x0, 0x0}, data = {prev = 0x0, cleanup = 0x0, canceltype = 0}}} not_first_call = <value optimized out> robust = <value optimized out> #9 0x00007ffff307b7bd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112 No locals. #10 0x0000000000000000 in ?? () No symbol table info available. Thread 430 (Thread 0x7fffe1db2910 (LWP 12846)): #0 __pthread_mutex_lock_full (mutex=0x26393d0) at pthread_mutex_lock.c:303 private = <value optimized out> e = <value optimized out> kind = 1 robust = 0 oldval = <value optimized out> __PRETTY_FUNCTION__ = "__pthread_mutex_lock_full" #1 0x00007fffe6c044ee in pa_mutex_lock (m=0x26393d0) at pulsecore/mutex- posix.c:90 __func__ = "pa_mutex_lock" __PRETTY_FUNCTION__ = "pa_mutex_lock" #2 0x00007fffe6e44219 in poll_func (ufds=<value optimized out>, nfds=2, timeout=10, userdata=0x26393d0) at pulse/thread-mainloop.c:76 r = 1 __func__ = "poll_func" __PRETTY_FUNCTION__ = "poll_func" #3 0x00007fffe6e345e6 in pa_mainloop_poll (m=0x21f0700) at pulse/mainloop.c:879 __func__ = "pa_mainloop_poll" __PRETTY_FUNCTION__ = "pa_mainloop_poll" #4 0x00007fffe6e35eb9 in pa_mainloop_iterate (m=0x21f0700, block=<value optimized out>, retval=0x0) at pulse/mainloop.c:961 r = <value optimized out> __func__ = "pa_mainloop_iterate" __PRETTY_FUNCTION__ = "pa_mainloop_iterate" ---Type <return> to continue, or q <return> to quit--- #5 0x00007fffe6e35f70 in pa_mainloop_run (m=0x21f0700, retval=0x0) at pulse/mainloop.c:979 r = <value optimized out> #6 0x00007fffe6e4412b in thread (userdata=0x2065350) at pulse/thread- mainloop.c:94 mask = {__val = {18446744067267100671, 18446744073709551615 <repeats 15 times>}} #7 0x00007fffe6c05050 in internal_thread_func (userdata=0x2042f60) at pulsecore/thread-posix.c:72 __func__ = "internal_thread_func" __PRETTY_FUNCTION__ = "internal_thread_func" #8 0x00007ffff3abca04 in start_thread (arg=<value optimized out>) at pthread_create.c:300 __res = <value optimized out> pd = 0x7fffe1db2910 unwind_buf = {cancel_jmp_buf = {{jmp_buf = {140736982624528, 8249672085128685470, 140737281552512, 0, 0, 3, -8249615145552238690, -8249646351502465122}, mask_was_saved = 0}}, priv = { pad = {0x0, 0x0, 0x0, 0x0}, data = {prev = 0x0, cleanup = 0x0, canceltype = 0}}} not_first_call = <value optimized out> robust = <value optimized out> #9 0x00007ffff307b7bd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112 No locals. #10 0x0000000000000000 in ?? () No symbol table info available. Current language: auto The current source language is "auto; currently asm". Thread 6 (Thread 0x7fffe25b3910 (LWP 11987)): #0 0x00007ffff3ac48f1 in nanosleep () from /lib/libpthread.so.0 No symbol table info available. #1 0x00007ffff60bea8c in wxMicroSleep (microseconds=<value optimized out>) at ../src/unix/utilsunx.cpp:191 tmReq = {tv_sec = 0, tv_nsec = 10000000} #2 0x0000000000592e50 in AudioThread::Entry (this=0x7fffdc001650) at AudioIO.cpp:1676 No locals. #3 0x00007ffff60b8a3a in wxThreadInternal::PthreadStart (thread=0x7fffdc001650) at ../src/unix/threadpsx.cpp:766 pthread = 0x7fffdc002940 rc = <value optimized out> dontRunAtAll = false __FUNCTION__ = "PthreadStart" #4 0x00007ffff3abca04 in start_thread (arg=<value optimized out>) at pthread_create.c:300 __res = <value optimized out> pd = 0x7fffe25b3910 unwind_buf = {cancel_jmp_buf = {{jmp_buf = {140736991017232, 8249672085128685470, 140737488346432, 0, 0, 3, -8249611846480484450, -8249646351502465122}, mask_was_saved = 0}}, priv = { pad = {0x0, 0x0, 0x0, 0x0}, data = {prev = 0x0, cleanup = 0x0, canceltype = 0}}} not_first_call = <value optimized out> robust = <value optimized out> #5 0x00007ffff307b7bd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112 No locals. #6 0x0000000000000000 in ?? () No symbol table info available. Current language: auto The current source language is "auto; currently c". Thread 1 (Thread 0x7ffff7fb47f0 (LWP 11980)): #0 0x00007ffff3abdcfd in pthread_join (threadid=140736974231824, thread_return=0x7fffffffd138) at pthread_join.c:89 __ignore = <value optimized out> _tid = 12847 _buffer = {__routine = 0x7ffff3abdbd0 <cleanup>, __arg = 0x7fffe15b1d38, __canceltype = 0, __prev = 0x0} oldtype = 0 result = <value optimized out> #1 0x00000000009537e1 in PaUnixThread_Terminate (self=0x24a6cd0, wait=<value optimized out>, exitResult=0x7fffffffd16c) at src/os/unix/pa_unix_util.c:406 result = <value optimized out> pret = <value optimized out> __PRETTY_FUNCTION__ = "PaUnixThread_Terminate" #2 0x00000000009569c3 in RealStop (stream=0x24a6b40, abort=<value optimized out>) at src/hostapi/alsa/pa_linux_alsa.c:2256 threadRes = 0 result = <value optimized out> #3 0x00000000005917d5 in AudioIO::StopStream (this=0x1eb1510) at AudioIO.cpp:1189 No locals. ---Type <return> to continue, or q <return> to quit--- #4 0x000000000079cd03 in ControlToolBar::StopPlaying (this=0x20dca80) at toolbars/ControlToolBar.cpp:709 project = 0x7fffdc09e810 #5 0x00000000007b277c in TranscriptionToolBar::OnPlaySpeed (this=0x20ddb50, event=...) at toolbars/TranscriptionToolBar.cpp:404 p = 0x7fffdc09e810 playRegionStart = 6.9533558073029944e-310 playRegionEnd = 1.5755287047907678e-316 #6 0x00000000007b28c9 in TranscriptionToolBar::OnSpeedSlider (this=0x20ddb50, event=...) at toolbars/TranscriptionToolBar.cpp:433 No locals. #7 0x00007ffff60b97b0 in wxEvtHandler::ProcessEventIfMatches (entry=<value optimized out>, handler=0x0, event=...) at ../src/common/event.cpp:1231 tableId1 = <value optimized out> tableId2 = <value optimized out> #8 0x00007ffff60bace7 in wxEventHashTable::HandleEvent (this=<value optimized out>, event=..., self=0x20ddb50) at ../src/common/event.cpp:906 n = 0 count = 2 eventType = <value optimized out> eTTnode = 0x2183ec0 #9 0x00007ffff60bae28 in wxEvtHandler::ProcessEvent (this=0x20ddb50, event=...) at ../src/common/event.cpp:1293 __FUNCTION__ = "ProcessEvent" #10 0x00007ffff6a857fd in wxWindowBase::TryParent (this=<value optimized out>, event=...) at ../src/common/wincmn.cpp:2661 parent = 0x20ddb50 #11 0x00000000007bbcce in LWSlider::SendUpdate (this=0x1e696a0, newValue=0.00999999978) at widgets/ASlider.cpp:1105 e = {<wxEvent> = {<wxObject> = {_vptr.wxObject = 0x1cc2770, static ms_classInfo = {m_className = 0x7ffff60e87d0 L"wxObject", m_objectSize = 16, m_objectConstructor = 0, m_baseInfo1 = 0x0, m_baseInfo2 = 0x0, static sm_first = 0x0, m_next = 0x7ffff6341d00, static sm_classTable = 0x1ce5980}, m_refData = 0x0}, m_eventObject = 0x0, m_eventType = 10087, m_timeStamp = 0, m_id = 11, m_callbackUserData = 0x0, m_propagationLevel = 2147483646, m_skipped = false, m_isCommandEvent = true, static ms_classInfo = {m_className = 0x0, m_objectSize = 0, m_objectConstructor = 0, m_baseInfo1 = 0x0, m_baseInfo2 = 0x0, static sm_first = 0x0, m_next = 0x0, static sm_classTable = 0x1ce5980}}, m_cmdString = {<wxStringBase> = { static npos = 18446744073709551615, m_pchData = 0x7ffff60ed818 L""}, <No data fields>}, m_commandInt = 0, m_extraLong = 0, m_clientData = 0x0, m_clientObject = 0x0, static ms_classInfo = {m_className = 0x7ffff6ad84a0 L"wxCommandEvent", m_objectSize = 104, m_objectConstructor = 0x7ffff6942ab0 <wxCommandEvent::wxCreateObject()>, m_baseInfo1 = 0x1cbba60, m_baseInfo2 = 0x0, static sm_first = 0x0, m_next = 0x7ffff6ddd580, static sm_classTable = 0x1ce5980}} intValue = 0 #12 0x00000000007bb79a in LWSlider::OnMouseEvent (this=0x1e696a0, event=...) at widgets/ASlider.cpp:1019 prevValue = 1.40314603 r = {x = 41, y = 9, width = 11, height = 14} tolerantThumbRect = {x = 38, y = 6, width = 17, height = 20} #13 0x00000000007bcbf0 in ASlider::OnMouseEvent (this=0x1e69170, event=...) at widgets/ASlider.cpp:1380 No locals. #14 0x00007ffff60b97b0 in wxEvtHandler::ProcessEventIfMatches (entry=<value optimized out>, handler=0x0, event=...) at ../src/common/event.cpp:1231 tableId1 = <value optimized out> tableId2 = <value optimized out> #15 0x00007ffff60bace7 in wxEventHashTable::HandleEvent (this=<value optimized out>, event=..., self=0x1e69170) at ../src/common/event.cpp:906 n = 0 count = 1 eventType = <value optimized out> eTTnode = 0x1dcd090 #16 0x00007ffff60bae28 in wxEvtHandler::ProcessEvent (this=0x1e69170, event=...) at ../src/common/event.cpp:1293 __FUNCTION__ = "ProcessEvent" #17 0x00007ffff6980b6a in gtk_window_motion_notify_callback (widget=<value optimized out>, gdk_event=0x21c7a60, win=0x1e69170) at ../src/gtk/window.cpp:1786 rc = <value optimized out> event = {<wxEvent> = {<wxObject> = {_vptr.wxObject = 0x1cc3030, static ms_classInfo = {m_className = 0x7ffff60e87d0 L"wxObject", m_objectSize = 16, m_objectConstructor = 0, m_baseInfo1 = 0x0, m_baseInfo2 = 0x0, static sm_first = 0x0, m_next = 0x7ffff6341d00, static sm_classTable = 0x1ce5980}, m_refData = 0x0}, m_eventObject = 0x1e69170, m_eventType = 10103, m_timeStamp = 85361163, m_id = 11, m_callbackUserData = 0x0, m_propagationLevel = 0, m_skipped = false, m_isCommandEvent = false, static ms_classInfo = { m_className = 0x0, m_objectSize = 0, m_objectConstructor = 0, m_baseInfo1 = 0x0, m_baseInfo2 = 0x0, static sm_first = 0x0, m_next = 0x0, static sm_classTable = 0x1ce5980}}, m_x = 2, m_y = 15, m_leftDown = true, m_middleDown = false, m_rightDown = false, m_controlDown = false, m_shiftDown = false, m_altDown = false, m_metaDown = false, m_wheelRotation = 0, m_wheelDelta = 0, m_linesPerAction = 0, static ms_classInfo = {m_className = 0x7ffff6ad8598 L"wxMouseEvent", m_objectSize = 96, m_objectConstructor = 0x7ffff6942850 <wxMouseEvent::wxCreateObject()>, m_baseInfo1 = 0x1cbba60, m_baseInfo2 = 0x0, static sm_first = 0x0, m_next = 0x7ffff6ddd680, static sm_classTable = 0x1ce5980}} ret = false #18 0x00007ffff2ad2728 in _gtk_marshal_BOOLEAN__BOXED (closure=0x217f380, return_value=0x7fffffffdb80, n_param_values=<value optimized out>, param_values=0x2668d00, invocation_hint=<value optimized out>, marshal_data=0x7ffff6980a20) at /build/buildd/gtk+2.0-2.18.3/gtk/gtkmarshalers.c:84 data1 = 0x2164270 data2 = 0x322f v_return = <value optimized out> ---Type <return> to continue, or q <return> to quit--- __PRETTY_FUNCTION__ = "_gtk_marshal_BOOLEAN__BOXED" #19 0x00007ffff24ab5ae in IA__g_closure_invoke (closure=0x217f380, return_value=0x7fffffffdb80, n_param_values=2, param_values=0x2668d00, invocation_hint=0x7fffffffdb40) at /build/buildd/glib2.0-2.22.2/gobject/gclosure.c:767 marshal = 0xfffffffffffffe00 marshal_data = 0x1b __PRETTY_FUNCTION__ = "IA__g_closure_invoke" #20 0x00007ffff24c0983 in signal_emit_unlocked_R (node=0x1dbee50, detail=<value optimized out>, instance=<value optimized out>, emission_return=<value optimized out>, instance_and_params=<value optimized out>) at /build/buildd/glib2.0-2.22.2/gobject/gsignal.c:3247 tmp = 0x7ffff3ac06b0 handler = 0x217f530 accumulator = 0x1dbeed0 emission = {next = 0x0, instance = 0x2164270, ihint = {signal_id = 42, detail = 0, run_type = G_SIGNAL_RUN_FIRST}, state = EMISSION_RUN, chain_type = 4} class_closure = 0x1dbede0 handler_list = 0x217f530 return_accu = <value optimized out> accu = {g_type = 20, data = {{v_int = 0, v_uint = 0, v_long = 0, v_ulong = 0, v_int64 = 0, v_uint64 = 0, v_float = 0, v_double = 0, v_pointer = 0x0}, {v_int = 0, v_uint = 0, v_long = 0, v_ulong = 0, v_int64 = 0, v_uint64 = 0, v_float = 0, v_double = 0, v_pointer = 0x0}}} signal_id = 42 max_sequential_handler_number = <value optimized out> return_value_altered = 0 #21 0x00007ffff24c1bcc in IA__g_signal_emit_valist (instance=0x2164270, signal_id=<value optimized out>, detail=0, var_args=0x7fffffffdd30) at /build/buildd/glib2.0-2.22.2/gobject/gsignal.c:2990 return_value = {g_type = 20, data = {{v_int = 0, v_uint = 0, v_long = 0, v_ulong = 0, v_int64 = 0, v_uint64 = 0, v_float = 0, v_double = 0, v_pointer = 0x0}, {v_int = 0, v_uint = 0, v_long = 0, v_ulong = 0, v_int64 = 0, v_uint64 = 0, v_float = 0, v_double = 0, v_pointer = 0x0}}} error = <value optimized out> signal_return_type = 20 param_values = <value optimized out> node = 0x1dbee50 i = <value optimized out> n_params = <value optimized out> __PRETTY_FUNCTION__ = "IA__g_signal_emit_valist" #22 0x00007ffff24c2283 in IA__g_signal_emit (instance=0x7fffe15b19e0, signal_id=0, detail=12847) at /build/buildd/glib2.0-2.22.2/gobject/gsignal.c:3037 var_args = {{gp_offset = 32, fp_offset = 48, overflow_arg_area = 0x7fffffffde10, reg_save_area = 0x7fffffffdd50}} #23 0x00007ffff2bd972f in gtk_widget_event_internal (widget=0x2164270, event=0x21c7a60) at /build/buildd/gtk+2.0-2.18.3/gtk/gtkwidget.c:4767 signal_num = <value optimized out> return_val = 0 #24 0x00007ffff2acacd3 in IA__gtk_propagate_event (widget=0x2164270, event=0x21c7a60) at /build/buildd/gtk+2.0-2.18.3/gtk/gtkmain.c:2417 tmp = 0x0 handled_event = 35013232 __PRETTY_FUNCTION__ = "IA__gtk_propagate_event" #25 0x00007ffff2acbca3 in IA__gtk_main_do_event (event=0x21c7a60) at /build/buildd/gtk+2.0-2.18.3/gtk/gtkmain.c:1622 event_widget = <value optimized out> grab_widget = 0x2164270 window_group = 0x21c6500 rewritten_event = 0x0 tmp_list = <value optimized out> __PRETTY_FUNCTION__ = "IA__gtk_main_do_event" #26 0x00007ffff2740cdc in gdk_event_dispatch (source=<value optimized out>, callback=<value optimized out>, user_data=<value optimized out>) at /build/buildd/gtk+2.0-2.18.3/gdk/x11/gdkevents-x11.c:2369 display = <value optimized out> event = <value optimized out> #27 0x00007ffff2212bbe in g_main_dispatch (context=0x1d6ddc0) at /build/buildd/glib2.0-2.22.2/glib/gmain.c:1960 dispatch = 0x7ffff2740c90 <gdk_event_dispatch> user_data = 0x0 callback = 0 cb_funcs = 0x0 cb_data = 0x0 current_source_link = {data = 0x1d6dd40, next = 0x0} source = 0x1d6dd40 current = 0x1dea750 i = 0 #28 IA__g_main_context_dispatch (context=0x1d6ddc0) at /build/buildd/glib2.0-2.22.2/glib/gmain.c:2513 ---Type <return> to continue, or q <return> to quit--- No locals. #29 0x00007ffff2216588 in g_main_context_iterate (context=0x1d6ddc0, block=<value optimized out>, dispatch=<value optimized out>, self=<value optimized out>) at /build/buildd/glib2.0-2.22.2/glib/gmain.c:2591 max_priority = 0 timeout = 0 some_ready = 1 nfds = 7 allocated_nfds = -158001008 fds = <value optimized out> __PRETTY_FUNCTION__ = "g_main_context_iterate" #30 0x00007ffff22169e5 in IA__g_main_loop_run (loop=0x22fe720) at /build/buildd/glib2.0-2.22.2/glib/gmain.c:2799 self = 0x1d1e930 __PRETTY_FUNCTION__ = "IA__g_main_loop_run" #31 0x00007ffff2acc177 in IA__gtk_main () at /build/buildd/gtk+2.0-2.18.3/gtk/gtkmain.c:1218 tmp_list = 0x22fef10 functions = 0x0 init = 0x7ffff6de4548 loop = <value optimized out> #32 0x00007ffff696bb48 in wxEventLoop::Run (this=0x22fef10) at ../src/gtk/evtloop.cpp:76 __FUNCTION__ = "Run" exitcode = <value optimized out> #33 0x00007ffff69fbec8 in wxAppBase::MainLoop (this=0x1e16290) at ../src/common/appcmn.cpp:312 mainLoop = {<wxEventLoopPtr> = {m_ptr = 0x22fef10}, m_pp = 0x1e16308, m_pOld = 0x0} #34 0x00007ffff60513bc in wxEntry (argc=<value optimized out>, argv=<value optimized out>) at ../src/common/init.cpp:460 No locals. #35 0x0000000000589e63 in main (argc=1, argv=0x7fffffffe218) at AudacityApp.cpp:594 No locals. }}} Threads 430 and 431 are probably the ones you care about -- Audacity's thread 1 is waiting on 431, which is in a pthread_cond_wait(). 430 is in a pthread_mutex_lock(), after releasing the mutex in poll_func. I don't know what thread is holding the mutex -- it's not 431, as it's in a pthread_cond_wait. Maybe 430 already had it somehow when it called pthread_mutex_lock(). I'd be glad to look into this further but I don't really know where to look at this point. -- Ticket URL: <http://pulseaudio.org/ticket/703> PulseAudio <http://pulseaudio.org/> The PulseAudio Sound Server _______________________________________________ pulseaudio-tickets mailing list pulseaudio-tickets@mail.0pointer.de https://tango.0pointer.de/mailman/listinfo/pulseaudio-tickets