GC collecting "too much"..
simendsjo
simendsjo at gmail.com
Mon Mar 26 02:55:32 PDT 2012
On Mon, 26 Mar 2012 10:13:35 +0200, simendsjo <simendsjo at gmail.com> wrote:
> On Sun, 25 Mar 2012 22:18:02 +0200, bearophile
> <bearophileHUGS at lycos.com> wrote:
>
>> On Sunday, 25 March 2012 at 19:15:05 UTC, simendsjo wrote:
>>> I'm doing some coding against a c library, and Ds GC keeps collecting
>>> c owned objects (I think - disabling the GC makes everything work)
>>
>> Three alternative solutions:
>> - Allocate from the C heap the memory that C will need to use, and free
>> it manually or in a struct destructor (RAII) or with scope(exit).
>> - Keep a pointer to the D-GC memory in the D code too.
>> - In core.memory there are ways to disable scanning of a memory zone.
>> Maybe it's usable for your purposes too.
>>
>> Bye,
>> bearophile
>
>
> I've been able to find where the code fails, but now I don't understand
> what's happening at all.
> Is calling GC.collect() from an extern(C) function undefined?
>
> The following code just starts a mongoose web server and tries to run
> GC.collect in the handler.
>
> extern(C) void* cb(mg_event event, mg_connection* conn, mg_request_info*
> request_info)
> {
> GC.collect(); // segfault
> return null;
> }
>
> void main()
> {
> auto opts = ["listening_ports",
> "6969"].map!(toUTFz!(char*))().array();
> mg_start(&cb, null, cast(const(char**))opts);
> GC.collect(); // no problem
> readln();
> }
>
> If I collect memory from main(), it works as expected (removing the
> collect from cb of course)
> while(readln().chomp() != "q") { GC.collect(); }
>
> The documentation in core.memory is a bit sparse on how the GC works.
> Are there any articles on the D GC?
It seems threads created in the c library is totally unknown to D. How can
I make D aware of these threads when there is no library support for it?
More information about the Digitalmars-d-learn
mailing list