Calling D from C

Chris W. wendlec at tcd.ie
Mon Mar 12 08:48:54 PDT 2012


On Monday, 12 March 2012 at 15:39:15 UTC, Alex Rønne Petersen 
wrote:
> On 12-03-2012 16:36, Steven Schveighoffer wrote:
>> On Mon, 12 Mar 2012 11:17:31 -0400, Alex Rønne Petersen
>> <xtzgzorex at gmail.com> wrote:
>>
>>> On 12-03-2012 16:09, Chris W. wrote:
>>>> On Monday, 12 March 2012 at 15:00:31 UTC, Steven 
>>>> Schveighoffer wrote:
>>>>> On Mon, 12 Mar 2012 10:53:09 -0400, Chris W. 
>>>>> <wendlec at cd.ie> wrote:
>>>>>
>>>>>> I have a problem when calling D functions from C. While I 
>>>>>> can
>>>>>> perform simple arithmetic operations (i.e. the calculation 
>>>>>> is
>>>>>> performed in D and returned to C), I experience problems 
>>>>>> when
>>>>>> trying to perform string/char operations or call functions 
>>>>>> from
>>>>>> the D standard library (e.g. writefln()). The usual error 
>>>>>> message
>>>>>> I get is either "Bus error" or "Segmentation fault". I 
>>>>>> haven't
>>>>>> been able to find the reason for this. The programs 
>>>>>> compile and
>>>>>> link, however, when run, they terminate with "Bus error" 
>>>>>> whenever
>>>>>> a D function is performed within the D code, e.g. 
>>>>>> something like
>>>>>> char[] s2 = s.dup; (s is a char* passed from C). Any hint 
>>>>>> or help
>>>>>> would be appreciated.
>>>>>>
>>>>>> I am using Mac OS X, 10.6.7
>>>>>
>>>>> If C is running your application startup, you must 
>>>>> initialize D's
>>>>> runtime from your C main routine.
>>>>>
>>>>> -Steve
>>>>
>>>> Yes, I am using extern (C) and in my C main function I call
>>>>
>>>> gc_init();
>>>> thread_attachThis();
>>>>
>>>> This works fine for primitive types such as int + int 
>>>> calculations. But
>>>> anything more sophisticated renders a Bus error. I am sure 
>>>> it is just
>>>> some little detail I have forgotten.
>>>
>>> Don't forget to call this:
>>> https://github.com/D-Programming-Language/druntime/blob/master/src/core/runtime.d#L33
>>>
>>>
>>> Documented here:
>>> https://github.com/D-Programming-Language/druntime/blob/master/src/core/runtime.d#L101
>>>
>>
>> More appropriate:
>>
>> http://dlang.org/phobos/core_runtime.html#initialize
>
> But that's effectively an extern (D) function. That's why I 
> linked to rt_init.
>
>>
>> And actually, I think this should do everything necessary. No 
>> need to
>> call gc_init and thread_attachThis().
>>
>> -Steve

It's fine, no need to call gc_init() or thread_attachThis() once 
the runtime is initialized. Thanks guys.


More information about the Digitalmars-d mailing list