<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=GB2312">
</head>
<body text="#000000" bgcolor="#FFFFFF">
Hi PulseAudio developers, <br>
<br>
I am developing PulseAudio Python Binding in C based on
pa_threaded_mainloop to handle pa_context_subscribe callback.<br>
<br>
For example, when received PA_SUBSCRIPTION_EVENT_SINK
PA_SUBSCRIPTION_EVENT_CHANGE event, I used PyEval_CallFunction to
call Python (pygtk.py) callback.<br>
Then pygtk.py testcase throw segfault, gdb DEBUG shown as below:<br>
<br>
Program received signal SIGSEGV, Segmentation fault.<br>
[Switching to Thread 0x7fffebb3f700 (LWP 10150)]<br>
0x00000000004e9f20 in PyObject_Call ()<br>
(gdb) bt<br>
#0 0x00000000004e9f20 in PyObject_Call ()<br>
#1 0x00000000004ea396 in PyEval_CallObjectWithKeywords ()<br>
#2 0x0000000000478a99 in PyEval_CallFunction ()<br>
#3 0x00007fffed1969b6 in ?? () from
/usr/lib/x86_64-linux-gnu/libpulse.so.0<br>
#4 0x00007fffecd45693 in ?? () from
/usr/lib/x86_64-linux-gnu/libpulsecommon-1.1.so<br>
#5 0x00007fffecd45a03 in pa_pdispatch_run () from
/usr/lib/x86_64-linux-gnu/libpulsecommon-1.1.so<br>
#6 0x00007fffed18cbdd in ?? () from
/usr/lib/x86_64-linux-gnu/libpulse.so.0<br>
#7 0x00007fffecd4a2a9 in ?? () from
/usr/lib/x86_64-linux-gnu/libpulsecommon-1.1.so<br>
#8 0x00007fffed19fa1e in pa_mainloop_dispatch () from
/usr/lib/x86_64-linux-gnu/libpulse.so.0<br>
#9 0x00007fffed19fde5 in pa_mainloop_iterate () from
/usr/lib/x86_64-linux-gnu/libpulse.so.0<br>
#10 0x00007fffed19fe90 in pa_mainloop_run () from
/usr/lib/x86_64-linux-gnu/libpulse.so.0<br>
#11 0x00007fffed1ae30f in ?? () from
/usr/lib/x86_64-linux-gnu/libpulse.so.0<br>
#12 0x00007fffecd57d18 in ?? () from
/usr/lib/x86_64-linux-gnu/libpulsecommon-1.1.so<br>
#13 0x00007ffff7bc4e9a in start_thread (arg=0x7fffebb3f700) at
pthread_create.c:308<br>
#14 0x00007ffff69b3cbd in clone () at
../sysdeps/unix/sysv/linux/x86_64/clone.S:112<br>
#15 0x0000000000000000 in ?? ()<br>
<br>
I tried to add PyGILState_Ensure() & PyGILState_Release() around
PyEval_CallFunction() for locking/unlocking, it still throw another
segfault shown as below:<br>
<br>
Program received signal SIGSEGV, Segmentation fault.<br>
[Switching to Thread 0x7fffebb3f700 (LWP 10362)]<br>
sem_post () at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S:34<br>
(gdb) bt<br>
#0 sem_post () at
../nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S:34<br>
#1 0x00000000004d456e in PyGILState_Release ()<br>
#2 0x00007fffed1969b6 in ?? () from
/usr/lib/x86_64-linux-gnu/libpulse.so.0<br>
#3 0x00007fffecd45693 in ?? () from
/usr/lib/x86_64-linux-gnu/libpulsecommon-1.1.so<br>
#4 0x00007fffecd45a03 in pa_pdispatch_run () from
/usr/lib/x86_64-linux-gnu/libpulsecommon-1.1.so<br>
#5 0x00007fffed18cbdd in ?? () from
/usr/lib/x86_64-linux-gnu/libpulse.so.0<br>
#6 0x00007fffecd4a2a9 in ?? () from
/usr/lib/x86_64-linux-gnu/libpulsecommon-1.1.so<br>
#7 0x00007fffed19fa1e in pa_mainloop_dispatch () from
/usr/lib/x86_64-linux-gnu/libpulse.so.0<br>
#8 0x00007fffed19fde5 in pa_mainloop_iterate () from
/usr/lib/x86_64-linux-gnu/libpulse.so.0<br>
#9 0x00007fffed19fe90 in pa_mainloop_run () from
/usr/lib/x86_64-linux-gnu/libpulse.so.0<br>
#10 0x00007fffed1ae30f in ?? () from
/usr/lib/x86_64-linux-gnu/libpulse.so.0<br>
#11 0x00007fffecd57d18 in ?? () from
/usr/lib/x86_64-linux-gnu/libpulsecommon-1.1.so<br>
#12 0x00007ffff7bc4e9a in start_thread (arg=0x7fffebb3f700) at
pthread_create.c:308<br>
#13 0x00007ffff69b3cbd in clone () at
../sysdeps/unix/sysv/linux/x86_64/clone.S:112<br>
#14 0x0000000000000000 in ?? ()<br>
<br>
However, the console.py (non-gtk & no g_main_loop) testcase
worked happily without segfault!<br>
<br>
The source code and testcase host on github
<meta http-equiv="content-type" content="text/html; charset=GB2312">
<a href="https://github.com/xiangzhai/pypulseaudio">https://github.com/xiangzhai/pypulseaudio</a>
please someone give me advice, thanks a lot!<br>
<br>
Xiang Zhai<br>
</body>
</html>