]> git.llucax.com Git - software/druntime.git/blobdiff - src/common/core/memory.d
restored support for setting gc handle
[software/druntime.git] / src / common / core / memory.d
index 65c35c80211ea0359065f9c909c63fb2c0853329..1770dfbc51efe47d5707dbb0aa4f854c1691c59d 100644 (file)
@@ -47,6 +47,10 @@ private
 
     extern (C) void gc_removeRoot( void* p );
     extern (C) void gc_removeRange( void* p );
+
+    extern (C) void* gc_getHandle();
+    extern (C) void gc_setHandle( void* p );
+    extern (C) void gc_endHandle();
 }
 
 
@@ -441,4 +445,40 @@ struct GC
     {
         gc_removeRange( p );
     }
+
+    /**
+     * Get handle to the collector.
+     * The only thing that can be done with this handle is pass it to
+     * setHandle(). getHandle/setHandle/endHandle work together so that
+     * if there are multiple instances of the gc running, only one instance
+     * can be set to run.
+     * The most common case of this is under Windows where a D application
+     * calls functions in a DLL that is implemented in D.
+     */
+
+    static void* getHandle()
+    {
+       return gc_getHandle();
+    }
+
+    /**
+     * Set handle to the collector.
+     * The handle p is an opaque handle, acquired by a call to
+     * getHandle().
+     */
+
+    static void setHandle(void* p)
+    {
+       gc_setHandle(p);
+    }
+
+    /**
+     * Call when done using the collector specified by the
+     * call to setHandle().
+     */
+
+    static void endHandle()
+    {
+       gc_endHandle();
+    }
 }