Nasal: add naGCSave/naGCRelease for preventing objects being garbage collected.
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.
This commit is contained in:
@@ -180,6 +180,8 @@ static void initGlobals()
|
|||||||
|
|
||||||
globals->symbols = naNewHash(c);
|
globals->symbols = naNewHash(c);
|
||||||
globals->save = naNewVector(c);
|
globals->save = naNewVector(c);
|
||||||
|
globals->save_hash = naNewHash(c);
|
||||||
|
globals->next_gc_key = 0;
|
||||||
|
|
||||||
// Cache pre-calculated "me", "arg" and "parents" scalars
|
// Cache pre-calculated "me", "arg" and "parents" scalars
|
||||||
globals->meRef = naInternSymbol(naStr_fromdata(naNewString(c), "me", 2));
|
globals->meRef = naInternSymbol(naStr_fromdata(naNewString(c), "me", 2));
|
||||||
@@ -765,11 +767,24 @@ void naSave(naContext ctx, naRef obj)
|
|||||||
naVec_append(globals->save, 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()
|
void naClearSaved()
|
||||||
{
|
{
|
||||||
naContext c;
|
naContext c;
|
||||||
c = naNewContext();
|
c = naNewContext();
|
||||||
globals->save = naNewVector(c);
|
globals->save = naNewVector(c);
|
||||||
|
globals->save_hash = naNewHash(c);
|
||||||
naFreeContext(c);
|
naFreeContext(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,11 @@ struct Globals {
|
|||||||
// A hash of symbol names
|
// A hash of symbol names
|
||||||
naRef symbols;
|
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;
|
||||||
|
naRef save_hash;
|
||||||
|
int next_gc_key;
|
||||||
|
|
||||||
struct Context* freeContexts;
|
struct Context* freeContexts;
|
||||||
struct Context* allContexts;
|
struct Context* allContexts;
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ static void garbageCollect()
|
|||||||
}
|
}
|
||||||
|
|
||||||
mark(globals->save);
|
mark(globals->save);
|
||||||
|
mark(globals->save_hash);
|
||||||
mark(globals->symbols);
|
mark(globals->symbols);
|
||||||
mark(globals->meRef);
|
mark(globals->meRef);
|
||||||
mark(globals->argRef);
|
mark(globals->argRef);
|
||||||
|
|||||||
@@ -47,8 +47,17 @@ void naGC();
|
|||||||
|
|
||||||
// "Save" this object in the context, preventing it (and objects
|
// "Save" this object in the context, preventing it (and objects
|
||||||
// referenced by it) from being garbage collected.
|
// referenced by it) from being garbage collected.
|
||||||
|
// TODO do we need a context? It is not used anyhow...
|
||||||
void naSave(naContext ctx, naRef obj);
|
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
|
// Drop all saved references
|
||||||
void naClearSaved();
|
void naClearSaved();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user