On Sunday, 1 July 2018 at 22:04:05 UTC, Robert M. Münch wrote:
On 2018-07-01 09:05:56 +0000, Robert M. Münch said:

This one look nasty...

And it was... the problem was, that I kept D allocated pointers in C code without informing the GC that the memory can't be collected nor moved. Bridging from D to C and back, is pretty tricky to not miss any allocated memory.

Couldn't such a problem be mitigated with an annotation like @externalRef or so, which would add the code to protect such memory from being GC? It would make the code much more explicit.

An annotation probably won't do it. This might:

    struct ExternalRef(T) {
        T* ptr;
        alias ptr this;

        void free() {
            import core.stdc.stdlib : free;
            free(ptr);
        }
    }

    auto externalRef(T)() {
        import core.stdc.stdlib : malloc;
        return ExternalRef!T(cast(T*)malloc(T.sizeof));
    }

    extern(C)
    void sendToC(ExternalRef!int p);
    extern(C)
    ExternalRef!int getFromC();

    unittest {
        sendToC(externalRef!int());
        getFromC().free();
    }

This is hardly a production-quality piece of code, but should give some ideas for what's possible.

--
  Simen

Reply via email to