Hi. I'm new here and this is my first post. I'm not sure this is
the right subforum for it, but wasn't sure where else to put it
either.
I've written a library to talk to some external hardware using a
socket. It uses the std.concurrency threads to send messages
between the main D-object for the hardware and the D-object for
the sockets. I then wanted to be able to call these functions
from Python. PyD appeared to be out of date, so I've been using a
D -> C interface, and a C -> Python interface. The python code
will often run from different python threads, so I then added yet
another message-passing layer between the D->C interface and the
D->hardware interface.
My problem is that this code routinely causes segmentation
faults. I've spent a long time going through trying to figure out
exactly what the causes are. I think there have been some related
to D-exceptions not being handled gracefully by the C/Python
code. Some more by stdout writing from multiple threads (which
surprised me).
I'm fairly sure I have tackled both of these issues, but it still
seems like Python threads and D threads don't mix well. When
running the same functions from D, I am able to get no errors,
but when run from Python/C it causes segfaults reliably.
Sorry for the large exposition. I am currently at the point of
suspecting bugs in Phobos, but I am unskilled enough to tell for
sure, and would appreciate any help.
The latest core dump gives a backtrace of almost entirely phobos
commands:
#0 0x00007fe789ad3b97 in gc.gc.Gcx.fullcollect() () from
/lib/libphobos2.so.0.66
#1 0x00007fe789ad3294 in gc.gc.Gcx.bigAlloc() () from
/lib/libphobos2.so.0.66
#2 0x00007fe789ad0df1 in gc.gc.GC.mallocNoSync() () from
/lib/libphobos2.so.0.66
#3 0x00007fe789ad0c15 in gc.gc.GC.malloc() () from
/lib/libphobos2.so.0.66
#4 0x00007fe789ad6470 in gc_malloc () from
/lib/libphobos2.so.0.66
#5 0x00007fe789ae6d36 in _d_newitemT () from
/lib/libphobos2.so.0.66
#6 0x00007fe789e57112 in
std.array.__T8AppenderTAaZ.Appender.__T3putTAxaZ.put() () from
/usr/lib/libv5camera.so
#7 0x00007fe789e570b5 in
std.array.__T8AppenderTAaZ.Appender.__T3putTAxaZ.put() () from
/usr/lib/libv5camera.so
#8 0x00007fe789e562dc in
std.array.__T8AppenderTAaZ.Appender.__T3putTAaZ.put() () from
/usr/lib/libv5camera.so
#9 0x00007fe789e561ea in
std.array.__T8AppenderTAaZ.Appender.__T3putTxwZ.put() () from
/usr/lib/libv5camera.so
#10 0x00007fe789e5617d in
std.format.__T10formatCharTS3std5array16__T8AppenderTAaZ8AppenderZ.formatChar()
() from /usr/lib/libv5camera.so
#11 0x00007fe789e56132 in
std.format.__T10formatCharTS3std5array16__T8AppenderTAaZ8AppenderZ.formatChar()
() from /usr/lib/libv5camera.so
#12 0x00007fe789e61f09 in
std.concurrency.MessageBox.__T3getTS4core4time8DurationTDFNfAyaiZvZ.get()
() from /usr/lib/libv5camera.so
#13 0x00007fe789e5b4ac in
std.concurrency.MessageBox.__T3getTS4core4time8DurationTDFNaNbNiNfAyaiZvZ.get()
() from /usr/lib/libv5camera.so
#14 0x00007fe789e57e8d in
std.typecons.__T5TupleTAyaTiTG65536kZ.Tuple.__T6__ctorTS3std8typecons24__T5TupleTAyaTiTG65536kZ5TupleZ.__ctor()
()
from /usr/lib/libv5camera.so
#15 0x00007fe789e581f1 in
std.variant.__T8VariantNVmi32Z.VariantN.__T7handlerTS3std8typecons24__T5TupleTAyaTiTG65536kZ5TupleZ.handler()
()
from /usr/lib/libv5camera.so
#16 0x00007fe789e57d0f in
std.typecons.__T5TupleTAyaTiTG65536kZ.Tuple.__T8opEqualsTS3std8typecons24__T5TupleTAyaTiTG65536kZ5TupleZ.opEquals()
()
from /usr/lib/libv5camera.so
#17 0x00007fe789e57ba8 in
std.typecons.__T5TupleTAyaTiTG65536kZ.injectNamedFields() () from
/usr/lib/libv5camera.so
#18 0x00007fe789e62087 in
std.concurrency.MessageBox.__T3getTS4core4time8DurationTDFNfAyaiZvZ.get()
() from /usr/lib/libv5camera.so
#19 0x00007fe789e621a3 in
std.concurrency.MessageBox.__T3getTS4core4time8DurationTDFNfAyaiZvZ.get()
() from /usr/lib/libv5camera.so
#20 0x00007fe789e5b7f6 in
std.concurrency.MessageBox.__T3getTS4core4time8DurationTDFNaNbNiNfAyaiZvZ.get()
() from /usr/lib/libv5camera.so
#21 0x00007fe789ac7d51 in core.thread.Thread.run() () from
/lib/libphobos2.so.0.66
#22 0x00007fe789ac6f95 in thread_entryPoint () from
/lib/libphobos2.so.0.66
#23 0x00007fe79cee5182 in start_thread (arg=0x7fe77aca5700) at
pthread_create.c:312
#24 0x00007fe79cc11fbd in clone () at
../sysdeps/unix/sysv/linux/x86_64/clone.S:111
Cheers,
Michael.