From 0ef5cf22891c9d34a88ccc5d89eb0ed82b004471 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 22 Apr 1996 15:00:37 -0300 Subject: lock mechanism seperseded by the REFERENCE mechanism. --- fallback.c | 70 ++++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 43 insertions(+), 27 deletions(-) (limited to 'fallback.c') diff --git a/fallback.c b/fallback.c index 8913797f..9d2db515 100644 --- a/fallback.c +++ b/fallback.c @@ -3,7 +3,7 @@ ** TecCGraf - PUC-Rio */ -char *rcs_fallback="$Id: fallback.c,v 1.22 1996/03/19 22:28:37 roberto Exp roberto $"; +char *rcs_fallback="$Id: fallback.c,v 1.23 1996/03/21 16:31:32 roberto Exp roberto $"; #include #include @@ -12,6 +12,7 @@ char *rcs_fallback="$Id: fallback.c,v 1.22 1996/03/19 22:28:37 roberto Exp rober #include "fallback.h" #include "opcode.h" #include "lua.h" +#include "table.h" static void errorFB (void); @@ -112,59 +113,74 @@ static void funcFB (void) /* -** Lock routines +** Reference routines */ -static Object *lockArray = NULL; -static int lockSize = 0; +static struct ref { + Object o; + enum {LOCK, HOLD, FREE, COLLECTED} status; +} *refArray = NULL; +static int refSize = 0; -int luaI_lock (Object *object) +lua_Reference luaI_ref (Object *object, int lock) { int i; int oldSize; if (tag(object) == LUA_T_NIL) - return -1; /* special lock ref for nil */ - for (i=0; i= 0 && ref < lockSize) - tag(&lockArray[ref]) = LUA_T_NIL; + if (ref >= 0 && ref < refSize) + refArray[ref].status = FREE; } -Object *luaI_getlocked (int ref) +Object *luaI_getref (lua_Reference ref) { static Object nul = {LUA_T_NIL, {0}}; - if (ref >= 0 && ref < lockSize) - return &lockArray[ref]; - else + if (ref == -1) return &nul; + if (ref >= 0 && ref < refSize && + (refArray[ref].status == LOCK || refArray[ref].status == HOLD)) + return &refArray[ref].o; + else + return NULL; } void luaI_travlock (int (*fn)(Object *)) { int i; - for (i=0; i