diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1994-11-08 17:56:39 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1994-11-08 17:56:39 -0200 |
| commit | 2cf954b8ae08a9094354551ee3733f4ff8078443 (patch) | |
| tree | bd6f42e34ad38802a31a135dbf446ea7e70b1427 /fallback.c | |
| parent | aa7b1fcec4f4a8147150fcb726146800c3c6af7e (diff) | |
| download | lua-2cf954b8ae08a9094354551ee3733f4ff8078443.tar.gz lua-2cf954b8ae08a9094354551ee3733f4ff8078443.tar.bz2 lua-2cf954b8ae08a9094354551ee3733f4ff8078443.zip | |
lock mechanism
Diffstat (limited to 'fallback.c')
| -rw-r--r-- | fallback.c | 67 |
1 files changed, 66 insertions, 1 deletions
| @@ -3,11 +3,13 @@ | |||
| 3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_fallback="$Id: $"; | 6 | char *rcs_fallback="$Id: fallback.c,v 1.1 1994/11/07 15:20:56 roberto Exp roberto $"; |
| 7 | 7 | ||
| 8 | #include <stdio.h> | 8 | #include <stdio.h> |
| 9 | #include <stdlib.h> | ||
| 9 | 10 | ||
| 10 | #include "fallback.h" | 11 | #include "fallback.h" |
| 12 | #include "opcode.h" | ||
| 11 | #include "lua.h" | 13 | #include "lua.h" |
| 12 | 14 | ||
| 13 | 15 | ||
| @@ -49,3 +51,66 @@ void luaI_orderFB (void) | |||
| 49 | lua_error("unexpected type at comparison"); | 51 | lua_error("unexpected type at comparison"); |
| 50 | } | 52 | } |
| 51 | 53 | ||
| 54 | |||
| 55 | /* | ||
| 56 | ** Lock routines | ||
| 57 | */ | ||
| 58 | |||
| 59 | static Object *lockArray = NULL; | ||
| 60 | static int lockSize = 0; | ||
| 61 | |||
| 62 | int lua_lock (lua_Object object) | ||
| 63 | { | ||
| 64 | int i; | ||
| 65 | int oldSize; | ||
| 66 | if (lua_isnil(object)) | ||
| 67 | return -1; | ||
| 68 | for (i=0; i<lockSize; i++) | ||
| 69 | if (tag(&lockArray[i]) == LUA_T_NIL) | ||
| 70 | { | ||
| 71 | lockArray[i] = *luaI_Address(object); | ||
| 72 | return i; | ||
| 73 | } | ||
| 74 | /* no more empty spaces */ | ||
| 75 | oldSize = lockSize; | ||
| 76 | if (lockArray == NULL) | ||
| 77 | { | ||
| 78 | lockSize = 10; | ||
| 79 | lockArray = (Object *)malloc(lockSize); | ||
| 80 | } | ||
| 81 | else | ||
| 82 | { | ||
| 83 | lockSize = 3*oldSize/2 + 5; | ||
| 84 | lockArray = (Object *)realloc(lockArray, lockSize); | ||
| 85 | } | ||
| 86 | if (lockArray == NULL) | ||
| 87 | { | ||
| 88 | lockSize = 0; | ||
| 89 | lua_error("lock - not enough memory"); | ||
| 90 | } | ||
| 91 | for (i=oldSize; i<lockSize; i++) | ||
| 92 | tag(&lockArray[i]) = LUA_T_NIL; | ||
| 93 | lockArray[oldSize] = *luaI_Address(object); | ||
| 94 | return oldSize; | ||
| 95 | } | ||
| 96 | |||
| 97 | |||
| 98 | void lua_unlock (int ref) | ||
| 99 | { | ||
| 100 | tag(&lockArray[ref]) = LUA_T_NIL; | ||
| 101 | } | ||
| 102 | |||
| 103 | |||
| 104 | Object *luaI_getlocked (int ref) | ||
| 105 | { | ||
| 106 | return &lockArray[ref]; | ||
| 107 | } | ||
| 108 | |||
| 109 | |||
| 110 | void luaI_travlock (void (*fn)(Object *)) | ||
| 111 | { | ||
| 112 | int i; | ||
| 113 | for (i=0; i<lockSize; i++) | ||
| 114 | fn(&lockArray[i]); | ||
| 115 | } | ||
| 116 | |||
