Criteria for 1.0 (was: Re: If D becomes a failure, what's the key reason, do you think?)
Kirk McDonald
kirklin.mcdonald at gmail.com
Thu Jul 13 14:14:47 PDT 2006
Sean Kelly wrote:
> BCS wrote:
>
>> Kirk McDonald wrote:
>>
>>> Walter Bright wrote:
>>>
>>>> Kirk McDonald wrote:
>>>>
>>>>> Here's something that has been annoying me, and this week-old
>>>>> thread is as good a place as any to bring it up: Shared library
>>>>> support on Linux. I could not take D seriously if it did a "1.0"
>>>>> release without this. I do hate to cram more on your plate, Walter,
>>>>> but I consider this a more serious issue than even this import
>>>>> thing that has gripped the newsgroup for the past week.
>>>>
>>>>
>>>>
>>>>
>>>> I know about the shared library issue on Linux. And to tell the
>>>> truth, I've been procrastinating on it. The big job, -fPIC, is done.
>>>> I don't know how much beyond that needs to be done.
>>>>
>>>> Will the shared libraries work with GDC?
>>>
>>>
>>>
>>> Ha! Well, at least this simple case does:
>>>
>> [proof]
>>
>>>
>>> Sweet. However, I am a little concerned. When making DLLs on Windows,
>>> there is some boilerplate code needed to initialize and shut down the
>>> GC and do some other routine things. Is something like that needed here?
>>>
>>
>>
>> Doesn't said boilerplate consist of linking the GC of the calling
>> program in to the GC of the called so? why not do it the other way
>> around? place the GC in its own so and have everything else link in to
>> it? Not too clean for small projects but once you are using so's
>> anyway it would be cleaner than putting gc hookup code all over the
>> place.
>
>
> The issue is somewhat messy. If Phobos is statically linked and the
> user DLL is loaded by a D app then there would be two GCs and two thread
> lists that need to cooperate. It would be far preferable to put Phobos
> in a DLL of its own so only a single copy of this code is in use. But
> now assume the DLL is loaded by a C app. The user DLL would have to
> load/attach to the Phobos DLL. I think the "cr_init" and "cr_term"
> functions I mentioned in my other post might have to be reentrant for
> everything to work properly? I'll admit to having given the DLL issue
> basically no thought so far.
>
>
> Sean
I just did some testing, and this is exactly right. I modified the old
myso2.d to create a class and instantiate it:
[myso2.d]
module myso;
import std.stdio;
class A {
~this() { writefln("A.~this()"); }
void foo() { writefln("A.foo()"); }
}
export extern(C)
void mysoprint() {
A a = new A;
a.foo();
}
When loaded by a D module, it works just fine. However, the following
promptly causes Python to segfault when imported:
[testpy.d]
import python;
import std.stdio;
PyMethodDef testpy_methods[] = [
{ null, null, 0, null }
];
class A {
~this() { writefln("A.~this()"); }
void foo() { writefln("A.foo()"); }
}
extern(C)
export void inittestpy() {
Py_InitModule("testpy", testpy_methods);
A a = new A;
a.foo();
}
>>> import testpy
Segmentation fault
$
This, however, runs fine:
[testpy2.d]
import python;
import std.stdio;
PyMethodDef testpy_methods[] = [
{ null, null, 0, null }
];
extern(C)
export void inittestpy() {
Py_InitModule("testpy", testpy_methods);
writefln("Hello, world!");
}
>>> import testpy2
Hello, world!
>>>
It seems clear to me that the GC is causing the trouble.
--
Kirk McDonald
Pyd: Wrapping Python with D
http://dsource.org/projects/pyd/wiki
More information about the Digitalmars-d
mailing list