diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-09-14 14:48:57 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-09-14 14:48:57 -0300 |
commit | 8dcc6bc5321f12f28c6738b68350e920983101fb (patch) | |
tree | 18ab8546e074758ba793777dfc7551e8a506995e | |
parent | 38f585d271dd666d14d589909be22aa671a80eaa (diff) | |
download | lua-8dcc6bc5321f12f28c6738b68350e920983101fb.tar.gz lua-8dcc6bc5321f12f28c6738b68350e920983101fb.tar.bz2 lua-8dcc6bc5321f12f28c6738b68350e920983101fb.zip |
avoid the use of global lock
-rw-r--r-- | ltests.c | 26 | ||||
-rw-r--r-- | ltests.h | 17 |
2 files changed, 16 insertions, 27 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltests.c,v 2.29 2005/08/26 17:32:05 roberto Exp roberto $ | 2 | ** $Id: ltests.c,v 2.30 2005/08/26 17:36:32 roberto Exp roberto $ |
3 | ** Internal Module for Debugging of the Lua Implementation | 3 | ** Internal Module for Debugging of the Lua Implementation |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -737,7 +737,6 @@ static int loadlib (lua_State *L) { | |||
737 | static int closestate (lua_State *L) { | 737 | static int closestate (lua_State *L) { |
738 | lua_State *L1 = cast(lua_State *, cast(unsigned long, luaL_checknumber(L, 1))); | 738 | lua_State *L1 = cast(lua_State *, cast(unsigned long, luaL_checknumber(L, 1))); |
739 | lua_close(L1); | 739 | lua_close(L1); |
740 | lua_unlock(L); /* close cannot unlock that */ | ||
741 | return 0; | 740 | return 0; |
742 | } | 741 | } |
743 | 742 | ||
@@ -1121,39 +1120,26 @@ static const struct luaL_Reg tests_funcs[] = { | |||
1121 | }; | 1120 | }; |
1122 | 1121 | ||
1123 | 1122 | ||
1124 | static void fim (void) { | ||
1125 | if (!islocked) | ||
1126 | lua_close(lua_state); | ||
1127 | lua_assert(memcontrol.numblocks == 0); | ||
1128 | lua_assert(memcontrol.total == 0); | ||
1129 | } | ||
1130 | |||
1131 | |||
1132 | static int l_panic (lua_State *L) { | ||
1133 | UNUSED(L); | ||
1134 | fprintf(stderr, "unable to recover; exiting\n"); | ||
1135 | return 0; | ||
1136 | } | ||
1137 | |||
1138 | |||
1139 | int luaB_opentests (lua_State *L) { | 1123 | int luaB_opentests (lua_State *L) { |
1140 | void *ud; | 1124 | void *ud; |
1141 | lua_assert(lua_getallocf(L, &ud) == debug_realloc); | 1125 | lua_assert(lua_getallocf(L, &ud) == debug_realloc); |
1142 | lua_assert(ud == cast(void *, &memcontrol)); | 1126 | lua_assert(ud == cast(void *, &memcontrol)); |
1143 | lua_atpanic(L, l_panic); | ||
1144 | lua_state = L; /* keep first state to be opened */ | 1127 | lua_state = L; /* keep first state to be opened */ |
1145 | luaL_register(L, "T", tests_funcs); | 1128 | luaL_register(L, "T", tests_funcs); |
1146 | atexit(fim); | ||
1147 | return 0; | 1129 | return 0; |
1148 | } | 1130 | } |
1149 | 1131 | ||
1150 | 1132 | ||
1151 | #undef main | 1133 | #undef main |
1152 | int main (int argc, char *argv[]) { | 1134 | int main (int argc, char *argv[]) { |
1135 | int ret; | ||
1153 | char *limit = getenv("MEMLIMIT"); | 1136 | char *limit = getenv("MEMLIMIT"); |
1154 | if (limit) | 1137 | if (limit) |
1155 | memcontrol.memlimit = strtoul(limit, NULL, 10); | 1138 | memcontrol.memlimit = strtoul(limit, NULL, 10); |
1156 | return l_main(argc, argv); | 1139 | ret = l_main(argc, argv); |
1140 | lua_assert(memcontrol.numblocks == 0); | ||
1141 | lua_assert(memcontrol.total == 0); | ||
1142 | return ret; | ||
1157 | } | 1143 | } |
1158 | 1144 | ||
1159 | #endif | 1145 | #endif |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltests.h,v 2.14 2005/05/03 19:01:17 roberto Exp roberto $ | 2 | ** $Id: ltests.h,v 2.15 2005/06/06 13:30:25 roberto Exp roberto $ |
3 | ** Internal Header for Debugging of the Lua Implementation | 3 | ** Internal Header for Debugging of the Lua Implementation |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -55,16 +55,19 @@ int lua_checkpc (lua_State *L, pCallInfo ci); | |||
55 | 55 | ||
56 | /* test for lock/unlock */ | 56 | /* test for lock/unlock */ |
57 | #undef luai_userstateopen | 57 | #undef luai_userstateopen |
58 | #undef luai_userstatethread | ||
58 | #undef lua_lock | 59 | #undef lua_lock |
59 | #undef lua_unlock | 60 | #undef lua_unlock |
60 | #undef LUAI_EXTRASPACE | 61 | #undef LUAI_EXTRASPACE |
61 | 62 | ||
62 | LUAI_DATA int islocked; | 63 | struct L_EXTRA { int lock; int *plock; }; |
63 | #define LUAI_EXTRASPACE sizeof(double) | 64 | #define LUAI_EXTRASPACE sizeof(struct L_EXTRA) |
64 | #define getlock(l) (*(cast(int **, l) - 1)) | 65 | #define getlock(l) (cast(struct L_EXTRA *, l) - 1) |
65 | #define luai_userstateopen(l) getlock(l) = &islocked; | 66 | #define luai_userstateopen(l) \ |
66 | #define lua_lock(l) lua_assert((*getlock(l))++ == 0) | 67 | (getlock(l)->lock = 0, getlock(l)->plock = &(getlock(l)->lock)) |
67 | #define lua_unlock(l) lua_assert(--(*getlock(l)) == 0) | 68 | #define luai_userstatethread(l,l1) (getlock(l1)->plock = getlock(l)->plock) |
69 | #define lua_lock(l) lua_assert((*getlock(l)->plock)++ == 0) | ||
70 | #define lua_unlock(l) lua_assert(--(*getlock(l)->plock) == 0) | ||
68 | 71 | ||
69 | 72 | ||
70 | int luaB_opentests (lua_State *L); | 73 | int luaB_opentests (lua_State *L); |