20,741
edits
(→The pool manager: some feedback based on the latest arena developments at github: https://github.com/chrisforbes/incgc) |
|||
Line 450: | Line 450: | ||
This also means that we basically just need to provide an alternate naGC_get() function, next to the existing one, to add support for alternate GC schemes. | This also means that we basically just need to provide an alternate naGC_get() function, next to the existing one, to add support for alternate GC schemes. | ||
= Supporting additional GC implementations == | |||
It would probably make sense to change the pool manager interface/signature such that additional implementations can be easily provided and registered, so that merely a GC_CALLBACK pointer must be set during initialization in order to use a different GC scheme: | |||
<syntaxhighlight lang="diff"> | |||
diff --git a/simgear/nasal/data.h b/simgear/nasal/data.h | |||
index deb4fbd..f3fcaa1 100644 | |||
--- a/simgear/nasal/data.h | |||
+++ b/simgear/nasal/data.h | |||
@@ -202,7 +202,7 @@ int naiHash_sym(struct naHash* h, struct naStr* sym, naRef* out); | |||
void naiHash_newsym(struct naHash* h, naRef* sym, naRef* val); | |||
void naGC_init(struct naPool* p, int type); | |||
-struct naObj** naGC_get(struct naPool* p, int n, int* nout); | |||
+void naGC_alloc(struct Context* c, int type, int n); | |||
void naGC_swapfree(void** target, void* val); | |||
void naGC_freedead(); | |||
void naiGCMark(naRef r); | |||
diff --git a/simgear/nasal/gc.c b/simgear/nasal/gc.c | |||
index e9d9b7b..3bae313 100644 | |||
--- a/simgear/nasal/gc.c | |||
+++ b/simgear/nasal/gc.c | |||
@@ -191,8 +191,10 @@ static int poolsize(struct naPool* p) | |||
return total; | |||
} | |||
-struct naObj** naGC_get(struct naPool* p, int n, int* nout) | |||
+void naGC_alloc(struct Context* c, int type, int n) | |||
{ | |||
+ struct naPool* p = &globals->pools[type]; // type-specific memory pool | |||
+ int* nout = &c->nfree[type]; // | |||
struct naObj** result; | |||
naCheckBottleneck(); | |||
LOCK(); | |||
@@ -208,7 +210,7 @@ struct naObj** naGC_get(struct naPool* p, int n, int* nout) | |||
globals->allocCount -= n; | |||
result = (struct naObj**)(p->free + p->nfree); | |||
UNLOCK(); | |||
- return result; | |||
+ c->free[type]=result; | |||
} | |||
static void markvec(naRef r) | |||
diff --git a/simgear/nasal/misc.c b/simgear/nasal/misc.c | |||
index dae0bfe..5caeb76 100644 | |||
--- a/simgear/nasal/misc.c | |||
+++ b/simgear/nasal/misc.c | |||
@@ -66,9 +66,7 @@ naRef naStringValue(naContext c, naRef r) | |||
naRef naNew(struct Context* c, int type) | |||
{ | |||
naRef result; | |||
- if(c->nfree[type] == 0) | |||
- c->free[type] = naGC_get(&globals->pools[type], | |||
- OBJ_CACHE_SZ, &c->nfree[type]); | |||
+ if(! c->nfree[type] ) naGC_alloc(c, type, OBJ_CACHE_SZ); | |||
result = naObj(type, c->free[type][--c->nfree[type]]); | |||
naTempSave(c, result); | |||
return result; | |||
</syntaxhighlight> | |||
= Disabling the current GC = | = Disabling the current GC = |