On Friday, 12 August 2016 at 01:36:34 UTC, grampus wrote:
I can use dlang in this existing project as long as nothing can be changed on the C side.

then you have to check if runtime is initialized at the start of each function that can be called from C side. like this:


private void ensureRuntimeInited () {
  static bool tlsinited = false;
  __gshared bool inited = false;
  if (!tlsinited) {
    synchronized(Object.classinfo) {
      if (!inited) {
        import core.runtime : Runtime;
        if (!Runtime.initialize) {
          import core.stdc.stdio : stderr, fprintf;
          import core.stdc.stdlib : abort;
fprintf(stderr, "\nFATAL: failed to initialize druntime!\n");
          abort();
        }
        inited = true;
      }
    }
    tlsinited = true;
  }
}


extern(C) int myExtAPI () {
  ensureRuntimeInited();
  // your D code here
  return 0;
}


yes, you have to do that in each exported function.


as for your another question: if you won't call `rt_term()`, no module dtors will be called, no garbage will be collected at exit. there also may be problems with unregistering signal handlers, but i'm not sure.

if you C app routinely loads and unloads .so without notifying it about the fact that .so is being unloaded, you are in big troubles not only with D, but with .so written in any other language. you *may* hack around this, but it's *WAY* better to fix your C app in this case.

Reply via email to