]> git.llucax.com Git - software/druntime.git/commitdiff
restored support for setting gc handle
authorwalter <walter@4a9d5153-6564-4b3f-b5e1-7e8e9dac548f>
Mon, 20 Oct 2008 05:01:16 +0000 (05:01 +0000)
committerwalter <walter@4a9d5153-6564-4b3f-b5e1-7e8e9dac548f>
Mon, 20 Oct 2008 05:01:16 +0000 (05:01 +0000)
git-svn-id: http://svn.dsource.org/projects/druntime/trunk@33 4a9d5153-6564-4b3f-b5e1-7e8e9dac548f

src/common/core/memory.d
src/common/posix.mak
src/compiler/dmd/memory.d
src/compiler/dmd/posix.mak
src/gc/basic/gc.d
src/gc/basic/gcx.d
src/gc/basic/posix.mak
src/gc/stub/gc.d
src/gc/stub/posix.mak

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();
+    }
 }
index 59d4ee0a7c23068e3342a8c732a5db612f38c47d..c630d4dec23e109d44f5453bbf160674fc840e85 100644 (file)
@@ -23,13 +23,13 @@ ADD_DFLAGS=
 CFLAGS=-O $(ADD_CFLAGS)\r
 #CFLAGS=-g $(ADD_CFLAGS)\r
 \r
-DFLAGS=-release -O -inline -w -nofloat -version=Posix $(ADD_DFLAGS)\r
-#DFLAGS=-g -w -nofloat -version=Posix $(ADD_DFLAGS)\r
+DFLAGS=-release -O -inline -w -nofloat $(ADD_DFLAGS)\r
+#DFLAGS=-g -w -nofloat $(ADD_DFLAGS)\r
 \r
-TFLAGS=-O -inline -w -nofloat -version=Posix $(ADD_DFLAGS)\r
-#TFLAGS=-g -w -nofloat -version=Posix $(ADD_DFLAGS)\r
+TFLAGS=-O -inline -w -nofloat $(ADD_DFLAGS)\r
+#TFLAGS=-g -w -nofloat $(ADD_DFLAGS)\r
 \r
-DOCFLAGS=-version=DDoc -version=Posix\r
+DOCFLAGS=-version=DDoc\r
 \r
 CC=gcc\r
 LC=$(AR) -qsv\r
index 7ed28b696dbde6a7dfe99f29dfd53447fb162dea..4f7188b8a10399be602fdb8e3346939b38b213ea 100644 (file)
@@ -139,17 +139,46 @@ private
  *
  */
 extern (C) void rt_scanStaticData( scanFn scan )
+{
+    scan(rt_staticDataBottom(), rt_staticDataTop());
+}
+
+/**
+ *
+ */
+extern (C) void* rt_staticDataBottom()
+{
+    version( Windows )
+    {
+        return &_xi_a;
+    }
+    else version( linux )
+    {
+        return &__data_start;
+    }
+    else
+    {
+        static assert( false, "Operating system not supported." );
+    }
+}
+
+/**
+ *
+ */
+extern (C) void* rt_staticDataTop()
 {
     version( Windows )
     {
-        scan( &_xi_a, &_end );
+        return &_end;
     }
     else version( linux )
     {
-        scan( &__data_start, &_end );
+        return &_end;
     }
     else
     {
         static assert( false, "Operating system not supported." );
     }
 }
+
+
index 3ecdacbc3c0717a4493ab3c4da39f77ea26460e0..bcc613261b357454f042aabba113d59639dbe296 100644 (file)
@@ -20,13 +20,13 @@ MD=mkdir -p
 CFLAGS=-O $(ADD_CFLAGS)
 #CFLAGS=-g $(ADD_CFLAGS)
 
-DFLAGS=-release -O -inline -w -nofloat -version=Posix $(ADD_DFLAGS)
-#DFLAGS=-g -w -nofloat -version=Posix $(ADD_DFLAGS)
+DFLAGS=-release -O -inline -w -nofloat $(ADD_DFLAGS)
+#DFLAGS=-g -w -nofloat $(ADD_DFLAGS)
 
-TFLAGS=-O -inline -w -nofloat -version=Posix $(ADD_DFLAGS)
-#TFLAGS=-g -w -nofloat -version=Posix $(ADD_DFLAGS)
+TFLAGS=-O -inline -w -nofloat $(ADD_DFLAGS)
+#TFLAGS=-g -w -nofloat $(ADD_DFLAGS)
 
-DOCFLAGS=-version=DDoc -version=Posix
+DOCFLAGS=-version=DDoc
 
 CC=gcc
 LC=$(AR) -qsv
index 4dd2d9f50cd832afe95e213a09592015d970d0b2..a6a4611b7bcc69bf48b6142482a0289dc65a5211 100644 (file)
@@ -186,3 +186,26 @@ extern (C) void gc_removeRange( void *p )
 {
     _gc.removeRange( p );
 }
+
+extern (C) void* gc_getHandle()
+{
+    return cast(void*)_gc;
+}
+
+extern (C) void gc_setHandle(void* p)
+{
+    void* oldp = gc_getHandle();
+    gc_t g = cast(gc_t)p;
+    if (g.gcversion != gcx.GCVERSION)
+        throw new Error("incompatible gc versions");
+
+    // Add our static data to the new gc
+    GC.scanStaticData(g);
+
+    _gc = g;
+}
+
+extern (C) void gc_endHandle()
+{
+    GC.unscanStaticData(_gc);
+}
index 5145839290b1e341132c8ae51dd1072a6169e579..c4a46c9a6b8e0022752b3f1b2d06b7b4a2c6d489 100644 (file)
@@ -86,6 +86,8 @@ private
 
     extern (C) void* rt_stackBottom();
     extern (C) void* rt_stackTop();
+    extern (C) void* rt_staticDataBottom();
+    extern (C) void* rt_staticDataTop();
 
     extern (C) void rt_finalize( void* p, bool det = true );
 
@@ -1124,6 +1126,21 @@ class GC
     }
 
 
+    static void scanStaticData(gc_t g)
+    {
+        //debug(PRINTF) printf("+GC.scanStaticData()\n");
+        auto pbot = rt_staticDataBottom();
+        auto ptop = rt_staticDataTop();
+        g.addRange(pbot, ptop - pbot);
+        //debug(PRINTF) printf("-GC.scanStaticData()\n");
+    }
+
+    static void unscanStaticData(gc_t g)
+    {
+        auto pbot = rt_staticDataBottom();
+        g.removeRange(pbot);
+    }
+
     /**
      * add p to list of roots
      */
index c0696c61fcad6c2149ed4dd7645110ba06fd4230..b4633f5bcdbbfbddc7797dd576f329ef2d4839c1 100644 (file)
@@ -23,13 +23,13 @@ ADD_DFLAGS=
 CFLAGS=-O $(ADD_CFLAGS)
 #CFLAGS=-g $(ADD_CFLAGS)
 
-DFLAGS=-release -O -inline -w -nofloat -version=Posix $(ADD_DFLAGS)
-#DFLAGS=-g -w -nofloat -version=Posix $(ADD_DFLAGS)
+DFLAGS=-release -O -inline -w -nofloat $(ADD_DFLAGS)
+#DFLAGS=-g -w -nofloat $(ADD_DFLAGS)
 
-TFLAGS=-O -inline -w -nofloat -version=Posix $(ADD_DFLAGS)
-#TFLAGS=-g -w -nofloat -version=Posix $(ADD_DFLAGS)
+TFLAGS=-O -inline -w -nofloat $(ADD_DFLAGS)
+#TFLAGS=-g -w -nofloat $(ADD_DFLAGS)
 
-DOCFLAGS=-version=DDoc -version=Posix
+DOCFLAGS=-version=DDoc
 
 CC=gcc
 LC=$(AR) -qsv
index 7232588c311d8ae9b95dfc0bdd08b2a207913cab..db95b09abab787d19434530485a5d8bec1af1174 100644 (file)
@@ -166,3 +166,17 @@ extern (C) void gc_removeRange( void *p )
 {
 
 }
+
+extern (C) void* gc_getHandle()
+{
+    return null;
+}
+
+extern (C) void gc_setHandle(void* p)
+{
+}
+
+extern (C) void gc_endHandle()
+{
+}
+
index c499b198cecf94481037403b764f48943867f94f..cb51e9818efed296aa629a373b8bea846df6d904 100644 (file)
@@ -25,13 +25,13 @@ CFLAGS=-O -m32 $(ADD_CFLAGS)
 
 ### warnings disabled because gcx has issues ###
 
-DFLAGS=-release -O -inline -version=Posix $(ADD_DFLAGS)
-#DFLAGS=-g -version=Posix $(ADD_DFLAGS)
+DFLAGS=-release -O -inline $(ADD_DFLAGS)
+#DFLAGS=-g $(ADD_DFLAGS)
 
-TFLAGS=-O -inline -version=Posix $(ADD_DFLAGS)
-#TFLAGS=-g -version=Posix $(ADD_DFLAGS)
+TFLAGS=-O -inline $(ADD_DFLAGS)
+#TFLAGS=-g $(ADD_DFLAGS)
 
-DOCFLAGS=-version=DDoc -version=Posix
+DOCFLAGS=-version=DDoc
 
 CC=gcc
 LC=$(AR) -qsv