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.

Reply via email to