digitalmars.D.learn - How to ensure a thread cannot be blocked by the GC?
- ponce (9/9) Dec 03 2014 I have a DLL written in D that gets called by two different
- ponce (2/13) Dec 03 2014
- "Ola Fosheim =?UTF-8?B?R3LDuHN0YWQi?= (10/19) Dec 03 2014 I assume you are referring to Windows and I have no good answer
- "Ola Fosheim =?UTF-8?B?R3LDuHN0YWQi?= (5/6) Dec 03 2014 Btw, I found this page to be a nice starting point and generally
- "Ola Fosheim =?UTF-8?B?R3LDuHN0YWQi?= (11/12) Dec 03 2014 Hmmm, I have no idea why I wrote this. According to the code for
- "Ola Fosheim =?UTF-8?B?R3LDuHN0YWQi?= (13/16) Dec 03 2014 What a mess of incorrect recollection and typos (it is late, 3AM
- ponce (8/16) Dec 04 2014 Thanks Ola & Jacob.
- "Ola Fosheim =?UTF-8?B?R3LDuHN0YWQi?= (7/12) Dec 04 2014 Yes, I assume you should still call it for the real time thread,
- Jacob Carlborg (5/8) Dec 04 2014 No, the runtime in D doesn't know anything about threads created outside...
I have a DLL written in D that gets called by two different threads, created by a non-D host program (audio plugin). I did not create those threads, but my understanding is that they get "attached" to the D runtime. Thread A is a real-time callback and should not ever block. nogc seems perfect for this. Thread B and it's impractical to make it nogc. How to ensure that a collection triggered by thread B never stop thread A in stop the world collections?
Dec 03 2014
On Wednesday, 3 December 2014 at 22:53:48 UTC, ponce wrote:I have a DLL written in D that gets called by two different threads, created by a non-D host program (audio plugin). I did not create those threads, but my understanding is that they get "attached" to the D runtime. Thread A is a real-time callback and should not ever block. nogc seems perfect for this. Thread B and it's impractical to make it nogc. How to ensure that a collection triggered by thread B never stop thread A in stop the world collections?Correction:Thread B isn't real-time, allocates, and it's impractical to make it nogc.
Dec 03 2014
On Wednesday, 3 December 2014 at 22:53:48 UTC, ponce wrote:I have a DLL written in D that gets called by two different threads, created by a non-D host program (audio plugin). I did not create those threads, but my understanding is that they get "attached" to the D runtime. Thread A is a real-time callback and should not ever block. nogc seems perfect for this. Thread B and it's impractical to make it nogc. How to ensure that a collection triggered by thread B never stop thread A in stop the world collections?I assume you are referring to Windows and I have no good answer for you. Could it not vary between implementations or is it language defined? However, a real time thread ought to be specified by the OS as being non-interruptable (but with a timeout). Otherwise it should not be labeled as realtime… AudioUnits on OS-X are called with realtime priority. IRRC the D GC uses SIGUSR1 on unix, so there you should be able to specify a signal mask to tell the OS whether to block the thread on collection or not.
Dec 03 2014
On Thursday, 4 December 2014 at 00:27:49 UTC, Ola Fosheim Grøstad wrote:I assume you are referring to Windows and I have no good answerBtw, I found this page to be a nice starting point and generally a good read for writing portable code: http://msdn.microsoft.com/en-us/library/ms811896.aspx
Dec 03 2014
On Thursday, 4 December 2014 at 00:27:49 UTC, Ola Fosheim Grøstad wrote:IRRC the D GC uses SIGUSR1 on unix, so there you should be ableHmmm, I have no idea why I wrote this. According to the code for the runtime it only suspends threads that inherit from Thread? GC fullcollect calls thread_suspendAll which traverses a linked list of Threads. So I suppose none of your threads are suspended unless you suspend it with Thread on call_back entry? But why suspend a nogc thread? https://github.com/D-Programming-Language/druntime/blob/master/src/core/thread.d#L2501 https://github.com/D-Programming-Language/druntime/blob/master/src/gc/gc.d#L2479
Dec 03 2014
On Thursday, 4 December 2014 at 01:36:13 UTC, Ola Fosheim Grøstad wrote:So I suppose none of your threads are suspended unless you suspend it with Thread on call_back entry? But why suspend a nogc thread?What a mess of incorrect recollection and typos (it is late, 3AM :-P): I meant to say that I suppose none of your threads are suspended unless you register it as a Thread before the call_back entry. But if you do it on the call_back entry point by registering a fake Thread object you must ensure that you are not already in a collection cycle before continuing… Seems to me that there should either be better documentation of GC behaviour or some extra functionality for controlling GC interference with threads and Threads. I also find this confusing… There is a lot of policy making in D's runtime and standard library.
Dec 03 2014
On Thursday, 4 December 2014 at 02:01:26 UTC, Ola Fosheim Grøstad wrote:On Thursday, 4 December 2014 at 01:36:13 UTC, Ola Fosheim Grøstad wrote:Thanks Ola & Jacob. In fact I was registering them both with core.sys.windows.dll.dll_thread_attach() when callbacked with DLL_THREAD_ATTACH, but I see now that I should instead register to the runtime only the interruptible thread. Made-up problem!So I suppose none of your threads are suspended unless you suspend it with Thread on call_back entry? But why suspend a nogc thread?What a mess of incorrect recollection and typos (it is late, 3AM :-P): I meant to say that I suppose none of your threads are suspended unless you register it as a Thread
Dec 04 2014
On Thursday, 4 December 2014 at 08:18:23 UTC, ponce wrote:In fact I was registering them both with core.sys.windows.dll.dll_thread_attach() when callbacked with DLL_THREAD_ATTACH, but I see now that I should instead register to the runtime only the interruptible thread.Yes, I assume you should still call it for the real time thread, but with the first param set to false? bool dll_thread_attach( bool attach_thread = true, bool initTls = true )Made-up problem!Made-up problems can be very useful. I got some new ideas for real time GC support when thinking about this… ;-)
Dec 04 2014
On 2014-12-03 23:53, ponce wrote:I have a DLL written in D that gets called by two different threads, created by a non-D host program (audio plugin). I did not create those threads, but my understanding is that they get "attached" to the D runtime.No, the runtime in D doesn't know anything about threads created outside of D, unless you explicitly register them with the runtime. -- /Jacob Carlborg
Dec 04 2014