On Sun, 25 Mar 2012 22:18:02 +0200, bearophile <bearophileh...@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?

Reply via email to