]> git.mxchange.org Git - simgear.git/commitdiff
Nasal: add naGCSave/naGCRelease for preventing objects being garbage collected.
authorThomas Geymayer <tomgey@gmail.com>
Mon, 14 Oct 2013 22:19:32 +0000 (00:19 +0200)
committerThomas Geymayer <tomgey@gmail.com>
Mon, 14 Oct 2013 22:19:32 +0000 (00:19 +0200)
These new functions are meant to replace the gcSave/gcRelease
methods of the NasalSystem class in FlightGear, as passing an
adapter to SimGear from FlightGear is quite a lot of useless work
just for being able to save objects.

simgear/nasal/code.c
simgear/nasal/code.h
simgear/nasal/gc.c
simgear/nasal/nasal.h

index 0ce9b0537f447b0dc70b6172403a0b08a113d950..bac8b92bd900c9ea7fcd4da99d3f9b0351416601 100644 (file)
@@ -180,6 +180,8 @@ static void initGlobals()
 
     globals->symbols = naNewHash(c);
     globals->save = naNewVector(c);
+    globals->save_hash = naNewHash(c);
+    globals->next_gc_key = 0;
 
     // Cache pre-calculated "me", "arg" and "parents" scalars
     globals->meRef = naInternSymbol(naStr_fromdata(naNewString(c), "me", 2));
@@ -765,12 +767,25 @@ void naSave(naContext ctx, naRef obj)
     naVec_append(globals->save, obj);
 }
 
+int naGCSave(naRef obj)
+{
+  int key = globals->next_gc_key++;
+  naHash_set(globals->save_hash, naNum(key), obj);
+  return key;
+}
+
+void naGCRelease(int key)
+{
+  naHash_delete(globals->save_hash, naNum(key));
+}
+
 void naClearSaved()
 {
     naContext c;
     c = naNewContext();
     globals->save = naNewVector(c);
-    naFreeContext(c);   
+    globals->save_hash = naNewHash(c);
+    naFreeContext(c);
 }
 
 int naStackDepth(naContext ctx)
index 3db610773d95e84bd19ab2a2fc6c57017ed0ae20..4ff27afc5885c2b85fa26c5ef9ba08e739f80068 100644 (file)
@@ -62,7 +62,11 @@ struct Globals {
     // A hash of symbol names
     naRef symbols;
 
+    // Vector/hash containing objects which should not be freed by the gc
+    // TODO do we need a separate vector and hash?
     naRef save;
+    naRef save_hash;
+    int next_gc_key;
 
     struct Context* freeContexts;
     struct Context* allContexts;
index c3f1e66020c70a491ef5c6423e55e16521b93eab..a965aa79c523e3f881a9b4d3e2ad1d53b69e4239 100644 (file)
@@ -54,6 +54,7 @@ static void garbageCollect()
     }
 
     mark(globals->save);
+    mark(globals->save_hash);
     mark(globals->symbols);
     mark(globals->meRef);
     mark(globals->argRef);
index e57c856b7e65a67cee00211e0b48f573c739625c..0464c94cee864c0dc3fc0864fd604623d0ac030b 100644 (file)
@@ -47,8 +47,17 @@ void naGC();
 
 // "Save" this object in the context, preventing it (and objects
 // referenced by it) from being garbage collected.
+// TODO do we need a context? It is not used anyhow...
 void naSave(naContext ctx, naRef obj);
 
+// "Save" this object and get a key which allows do mark the object as free
+// later on (with naGCFree).
+int naGCSave(naRef obj);
+
+// Release an object previously passed to naGCSave to allow it being cleaned up
+// by the garbage collector.
+void naGCRelease(int key);
+
 // Drop all saved references
 void naClearSaved();