Debugging D shared libraries

Laeeth Isharc via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Sep 19 09:25:27 PDT 2015


On Saturday, 19 September 2015 at 12:21:02 UTC, ponce wrote:
> On Saturday, 19 September 2015 at 10:45:22 UTC, Russel Winder 
> wrote:
>> Calling D from Python. I have two functions in D, compiled to 
>> a shared object on Linux using LDC (but I get same problem 
>> using DMD).
>>
>> The sequential code:
>>
>>     extern(C)
>>     double sequential(const int n, const double delta) {
>>       Runtime.initialize();
>>       const pi = 4.0 * delta * reduce!(
>>             (double t, int i){ immutable x = (i - 0.5) * 
>> delta; return t + 1.0 / (1.0 + x * x); })(
>>             0.0, iota(1, n + 1));
>>       Runtime.terminate();
>>       return pi;
>>     }
>>
>> works entirely fine. However the "parallel" code:
>>
>>     extern(C)
>>     double parallel(const int n, const double delta) {
>>       Runtime.initialize();
>>       const pi = 4.0 * delta * taskPool.reduce!"a + b"(
>>           map!((int i){ immutable x = (i - 0.5) * delta; 
>> return 1.0 / (1.0 + x * x); })(iota(1, n + 1)));
>>       Runtime.terminate();
>>       return pi;
>>     }
>>
>> causes an immediate segfault (with LDC and DMD.  I am assuming 
>> that the problem is the lack of initialization of the 
>> std.parallelism module and hence the use of taskPool is 
>> causing a problem. I am betting I am missing something very 
>> simple about module initialization, and that this is not 
>> actually a bug.
>>
>> Anyone any proposals?
>
> Try using an explicit TaskPool and destroying it with 
> scope(exit).
>
>
> Also if using LDC, you can use global ctor/dtor to deal with 
> the runtime.
>
>
> ----------------------->8---------------------
>
>        extern (C) {
>             pragma(LDC_global_crt_ctor, 0)
>             void initRuntime()
>             {
>                 import core.runtime;
>                 Runtime.initialize();
>             }
>             pragma(LDC_global_crt_dtor, 0)
>             void deinitRuntime()
>             {
>                 import core.runtime;
>                 Runtime.terminate();
>             }
>         }
>
> ----------------------->8---------------------

What is the difference between shared static this and the global 
constructor ?  Russell, if you use shared static this for dmd 
does it work ?  Laeeth.



More information about the Digitalmars-d-learn mailing list