diff options
author | Benoit Germain <bnt.germain@gmail.com> | 2022-02-17 16:30:36 +0100 |
---|---|---|
committer | Benoit Germain <bnt.germain@gmail.com> | 2022-02-17 16:30:36 +0100 |
commit | c2f88350772c01631ea3b7d60e56cea335c458b7 (patch) | |
tree | b4fcc4bebb094190b0dc13561ab24c1593da86f7 /src | |
parent | 2c0000d5169cacf950d06637ada1a371cf382896 (diff) | |
download | lanes-c2f88350772c01631ea3b7d60e56cea335c458b7.tar.gz lanes-c2f88350772c01631ea3b7d60e56cea335c458b7.tar.bz2 lanes-c2f88350772c01631ea3b7d60e56cea335c458b7.zip |
NEVER use allocator obtained from lua_getallocf to allocate stuff manually when compiling for LuaJIT
Diffstat (limited to 'src')
-rw-r--r-- | src/lanes.c | 22 | ||||
-rw-r--r-- | src/linda.c | 27 | ||||
-rw-r--r-- | src/macros_and_utils.h | 10 | ||||
-rw-r--r-- | src/state.c | 35 | ||||
-rw-r--r-- | src/uniquekey.h | 8 |
5 files changed, 74 insertions, 28 deletions
diff --git a/src/lanes.c b/src/lanes.c index 8817071..bf0f0a3 100644 --- a/src/lanes.c +++ b/src/lanes.c | |||
@@ -238,7 +238,6 @@ static bool_t tracking_remove( Lane* s) | |||
238 | 238 | ||
239 | static void lane_cleanup( Lane* s) | 239 | static void lane_cleanup( Lane* s) |
240 | { | 240 | { |
241 | AllocatorDefinition* const allocD = &s->U->protected_allocator.definition; | ||
242 | // Clean up after a (finished) thread | 241 | // Clean up after a (finished) thread |
243 | // | 242 | // |
244 | #if THREADWAIT_METHOD == THREADWAIT_CONDVAR | 243 | #if THREADWAIT_METHOD == THREADWAIT_CONDVAR |
@@ -254,7 +253,15 @@ static void lane_cleanup( Lane* s) | |||
254 | } | 253 | } |
255 | #endif // HAVE_LANE_TRACKING | 254 | #endif // HAVE_LANE_TRACKING |
256 | 255 | ||
257 | allocD->allocF(allocD->allocUD, s, sizeof(Lane), 0); | 256 | // don't hijack the state allocator when running LuaJIT because it looks like LuaJIT does not expect it and might invalidate the memory unexpectedly |
257 | #if LUAJIT_FLAVOR == 0 | ||
258 | { | ||
259 | AllocatorDefinition* const allocD = &s->U->protected_allocator.definition; | ||
260 | allocD->allocF(allocD->allocUD, s, sizeof(Lane), 0); | ||
261 | } | ||
262 | #else // LUAJIT_FLAVOR | ||
263 | free(s); | ||
264 | #endif // LUAJIT_FLAVOR | ||
258 | } | 265 | } |
259 | 266 | ||
260 | /* | 267 | /* |
@@ -1054,7 +1061,6 @@ LUAG_FUNC( lane_new) | |||
1054 | #define FIXED_ARGS 7 | 1061 | #define FIXED_ARGS 7 |
1055 | int const nargs = lua_gettop(L) - FIXED_ARGS; | 1062 | int const nargs = lua_gettop(L) - FIXED_ARGS; |
1056 | Universe* U = universe_get( L); | 1063 | Universe* U = universe_get( L); |
1057 | AllocatorDefinition* const allocD = &U->protected_allocator.definition; | ||
1058 | ASSERT_L( nargs >= 0); | 1064 | ASSERT_L( nargs >= 0); |
1059 | 1065 | ||
1060 | // public Lanes API accepts a generic range -3/+3 | 1066 | // public Lanes API accepts a generic range -3/+3 |
@@ -1224,7 +1230,15 @@ LUAG_FUNC( lane_new) | |||
1224 | // | 1230 | // |
1225 | // a Lane full userdata needs a single uservalue | 1231 | // a Lane full userdata needs a single uservalue |
1226 | ud = lua_newuserdatauv( L, sizeof( Lane*), 1); // func libs priority globals package required gc_cb lane | 1232 | ud = lua_newuserdatauv( L, sizeof( Lane*), 1); // func libs priority globals package required gc_cb lane |
1227 | s = *ud = (Lane*) allocD->allocF( allocD->allocUD, NULL, 0, sizeof(Lane)); | 1233 | // don't hijack the state allocator when running LuaJIT because it looks like LuaJIT does not expect it and might invalidate the memory unexpectedly |
1234 | #if LUAJIT_FLAVOR == 0 | ||
1235 | { | ||
1236 | AllocatorDefinition* const allocD = &U->protected_allocator.definition; | ||
1237 | s = *ud = (Lane*)allocD->allocF(allocD->allocUD, NULL, 0, sizeof(Lane)); | ||
1238 | } | ||
1239 | #else // LUAJIT_FLAVOR | ||
1240 | s = *ud = (Lane*) malloc(sizeof(Lane)); | ||
1241 | #endif // LUAJIT_FLAVOR | ||
1228 | if( s == NULL) | 1242 | if( s == NULL) |
1229 | { | 1243 | { |
1230 | return luaL_error( L, "could not create lane: out of memory"); | 1244 | return luaL_error( L, "could not create lane: out of memory"); |
diff --git a/src/linda.c b/src/linda.c index 21b38fe..4149e71 100644 --- a/src/linda.c +++ b/src/linda.c | |||
@@ -758,9 +758,6 @@ LUAG_FUNC( linda_towatch) | |||
758 | */ | 758 | */ |
759 | static void* linda_id( lua_State* L, DeepOp op_) | 759 | static void* linda_id( lua_State* L, DeepOp op_) |
760 | { | 760 | { |
761 | Universe* const U = universe_get(L); | ||
762 | AllocatorDefinition* const allocD = &U->protected_allocator.definition; | ||
763 | |||
764 | switch( op_) | 761 | switch( op_) |
765 | { | 762 | { |
766 | case eDO_new: | 763 | case eDO_new: |
@@ -797,7 +794,17 @@ static void* linda_id( lua_State* L, DeepOp op_) | |||
797 | * One can use any memory allocation scheme. | 794 | * One can use any memory allocation scheme. |
798 | * just don't use L's allocF because we don't know which state will get the honor of GCing the linda | 795 | * just don't use L's allocF because we don't know which state will get the honor of GCing the linda |
799 | */ | 796 | */ |
800 | s = (struct s_Linda*) allocD->allocF( allocD->allocUD, NULL, 0, sizeof(struct s_Linda) + name_len); // terminating 0 is already included | 797 | // don't hijack the state allocator when running LuaJIT because it looks like LuaJIT does not expect it and might invalidate the memory unexpectedly |
798 | #if LUAJIT_FLAVOR == 0 | ||
799 | { | ||
800 | Universe* const U = universe_get(L); | ||
801 | AllocatorDefinition* const allocD = &U->protected_allocator.definition; | ||
802 | |||
803 | s = (struct s_Linda*)allocD->allocF(allocD->allocUD, NULL, 0, sizeof(struct s_Linda) + name_len); // terminating 0 is already included | ||
804 | } | ||
805 | #else // LUAJIT_FLAVOR | ||
806 | s = (struct s_Linda*)malloc(sizeof(struct s_Linda) + name_len); // terminating 0 is already included | ||
807 | #endif // LUAJIT_FLAVOR | ||
801 | if( s) | 808 | if( s) |
802 | { | 809 | { |
803 | s->prelude.magic.value = DEEP_VERSION.value; | 810 | s->prelude.magic.value = DEEP_VERSION.value; |
@@ -830,7 +837,17 @@ static void* linda_id( lua_State* L, DeepOp op_) | |||
830 | // There aren't any lanes waiting on these lindas, since all proxies have been gc'ed. Right? | 837 | // There aren't any lanes waiting on these lindas, since all proxies have been gc'ed. Right? |
831 | SIGNAL_FREE( &linda->read_happened); | 838 | SIGNAL_FREE( &linda->read_happened); |
832 | SIGNAL_FREE( &linda->write_happened); | 839 | SIGNAL_FREE( &linda->write_happened); |
833 | allocD->allocF( allocD->allocUD, linda, sizeof(struct s_Linda) + strlen(linda->name), 0); | 840 | // don't hijack the state allocator when running LuaJIT because it looks like LuaJIT does not expect it and might invalidate the memory unexpectedly |
841 | #if LUAJIT_FLAVOR == 0 | ||
842 | { | ||
843 | Universe* const U = universe_get(L); | ||
844 | AllocatorDefinition* const allocD = &U->protected_allocator.definition; | ||
845 | |||
846 | allocD->allocF(allocD->allocUD, linda, sizeof(struct s_Linda) + strlen(linda->name), 0); | ||
847 | } | ||
848 | #else // LUAJIT_FLAVOR | ||
849 | free(linda); | ||
850 | #endif // LUAJIT_FLAVOR | ||
834 | return NULL; | 851 | return NULL; |
835 | } | 852 | } |
836 | 853 | ||
diff --git a/src/macros_and_utils.h b/src/macros_and_utils.h index b67a7c4..dac89d1 100644 --- a/src/macros_and_utils.h +++ b/src/macros_and_utils.h | |||
@@ -99,4 +99,14 @@ extern char const* debugspew_indent; | |||
99 | 99 | ||
100 | #define LUAG_FUNC( func_name) int LG_##func_name( lua_State* L) | 100 | #define LUAG_FUNC( func_name) int LG_##func_name( lua_State* L) |
101 | 101 | ||
102 | #if defined(LUA_JITLIBNAME) | ||
103 | #if (defined(__x86_64__) || defined(_M_X64) || defined(__LP64__)) | ||
104 | #define LUAJIT_FLAVOR 64 | ||
105 | #else // 64 bits | ||
106 | #define LUAJIT_FLAVOR 32 | ||
107 | #endif // 64 bits | ||
108 | #else // LUA_JITLIBNAME | ||
109 | #define LUAJIT_FLAVOR 0 | ||
110 | #endif // LUA_JITLIBNAME | ||
111 | |||
102 | #endif // MACROS_AND_UTILS_H | 112 | #endif // MACROS_AND_UTILS_H |
diff --git a/src/state.c b/src/state.c index c6c04d7..a2de5cb 100644 --- a/src/state.c +++ b/src/state.c | |||
@@ -129,31 +129,31 @@ static int require_lanes_core( lua_State* L) | |||
129 | static const luaL_Reg libs[] = | 129 | static const luaL_Reg libs[] = |
130 | { | 130 | { |
131 | { LUA_LOADLIBNAME, luaopen_package}, | 131 | { LUA_LOADLIBNAME, luaopen_package}, |
132 | { LUA_TABLIBNAME, luaopen_table}, | 132 | { LUA_TABLIBNAME, luaopen_table}, |
133 | { LUA_STRLIBNAME, luaopen_string}, | 133 | { LUA_STRLIBNAME, luaopen_string}, |
134 | { LUA_MATHLIBNAME, luaopen_math}, | 134 | { LUA_MATHLIBNAME, luaopen_math}, |
135 | #ifndef PLATFORM_XBOX // no os/io libs on xbox | 135 | #ifndef PLATFORM_XBOX // no os/io libs on xbox |
136 | { LUA_OSLIBNAME, luaopen_os}, | 136 | { LUA_OSLIBNAME, luaopen_os}, |
137 | { LUA_IOLIBNAME, luaopen_io}, | 137 | { LUA_IOLIBNAME, luaopen_io}, |
138 | #endif // PLATFORM_XBOX | 138 | #endif // PLATFORM_XBOX |
139 | #if LUA_VERSION_NUM >= 503 | 139 | #if LUA_VERSION_NUM >= 503 |
140 | { LUA_UTF8LIBNAME, luaopen_utf8}, | 140 | { LUA_UTF8LIBNAME, luaopen_utf8}, |
141 | #endif | 141 | #endif |
142 | #if LUA_VERSION_NUM >= 502 | 142 | #if LUA_VERSION_NUM >= 502 |
143 | #ifdef luaopen_bit32 | 143 | #ifdef luaopen_bit32 |
144 | { LUA_BITLIBNAME, luaopen_bit32}, | 144 | { LUA_BITLIBNAME, luaopen_bit32}, |
145 | #endif | 145 | #endif |
146 | { LUA_COLIBNAME, luaopen_coroutine}, // Lua 5.2: coroutine is no longer a part of base! | 146 | { LUA_COLIBNAME, luaopen_coroutine}, // Lua 5.2: coroutine is no longer a part of base! |
147 | #else // LUA_VERSION_NUM | 147 | #else // LUA_VERSION_NUM |
148 | { LUA_COLIBNAME, NULL}, // Lua 5.1: part of base package | 148 | { LUA_COLIBNAME, NULL}, // Lua 5.1: part of base package |
149 | #endif // LUA_VERSION_NUM | 149 | #endif // LUA_VERSION_NUM |
150 | { LUA_DBLIBNAME, luaopen_debug}, | 150 | { LUA_DBLIBNAME, luaopen_debug}, |
151 | #if defined LUA_JITLIBNAME // building against LuaJIT headers, add some LuaJIT-specific libs | 151 | #if LUAJIT_FLAVOR != 0 // building against LuaJIT headers, add some LuaJIT-specific libs |
152 | //#pragma message( "supporting JIT base libs") | 152 | //#pragma message( "supporting JIT base libs") |
153 | { LUA_BITLIBNAME, luaopen_bit}, | 153 | { LUA_BITLIBNAME, luaopen_bit}, |
154 | { LUA_JITLIBNAME, luaopen_jit}, | 154 | { LUA_JITLIBNAME, luaopen_jit}, |
155 | { LUA_FFILIBNAME, luaopen_ffi}, | 155 | { LUA_FFILIBNAME, luaopen_ffi}, |
156 | #endif // LUA_JITLIBNAME | 156 | #endif // LUAJIT_FLAVOR |
157 | 157 | ||
158 | { LUA_DBLIBNAME, luaopen_debug}, | 158 | { LUA_DBLIBNAME, luaopen_debug}, |
159 | { "lanes.core", require_lanes_core}, // So that we can open it like any base library (possible since we have access to the init function) | 159 | { "lanes.core", require_lanes_core}, // So that we can open it like any base library (possible since we have access to the init function) |
@@ -249,6 +249,10 @@ void initialize_on_state_create( Universe* U, lua_State* L) | |||
249 | lua_State* create_state( Universe* U, lua_State* from_) | 249 | lua_State* create_state( Universe* U, lua_State* from_) |
250 | { | 250 | { |
251 | lua_State* L; | 251 | lua_State* L; |
252 | #if LUAJIT_FLAVOR == 64 | ||
253 | // for some reason, LuaJIT 64 bits does not support creating a state with lua_newstate... | ||
254 | L = luaL_newstate(); | ||
255 | #else // LUAJIT_FLAVOR == 64 | ||
252 | if( U->provide_allocator != NULL) // we have a function we can call to obtain an allocator | 256 | if( U->provide_allocator != NULL) // we have a function we can call to obtain an allocator |
253 | { | 257 | { |
254 | lua_pushcclosure( from_, U->provide_allocator, 0); | 258 | lua_pushcclosure( from_, U->provide_allocator, 0); |
@@ -264,6 +268,7 @@ lua_State* create_state( Universe* U, lua_State* from_) | |||
264 | // reuse the allocator provided when the master state was created | 268 | // reuse the allocator provided when the master state was created |
265 | L = lua_newstate( U->protected_allocator.definition.allocF, U->protected_allocator.definition.allocUD); | 269 | L = lua_newstate( U->protected_allocator.definition.allocF, U->protected_allocator.definition.allocUD); |
266 | } | 270 | } |
271 | #endif // LUAJIT_FLAVOR == 64 | ||
267 | 272 | ||
268 | if( L == NULL) | 273 | if( L == NULL) |
269 | { | 274 | { |
diff --git a/src/uniquekey.h b/src/uniquekey.h index ff3d45d..a72426c 100644 --- a/src/uniquekey.h +++ b/src/uniquekey.h | |||
@@ -1,7 +1,7 @@ | |||
1 | #if !defined __LANES_UNIQUEKEY_H__ | 1 | #if !defined __LANES_UNIQUEKEY_H__ |
2 | #define __LANES_UNIQUEKEY_H__ 1 | 2 | #define __LANES_UNIQUEKEY_H__ 1 |
3 | 3 | ||
4 | #include "lualib.h" | 4 | #include "macros_and_utils.h" |
5 | 5 | ||
6 | // Lua light userdata can hold a pointer. | 6 | // Lua light userdata can hold a pointer. |
7 | struct s_UniqueKey | 7 | struct s_UniqueKey |
@@ -10,11 +10,11 @@ struct s_UniqueKey | |||
10 | }; | 10 | }; |
11 | typedef struct s_UniqueKey UniqueKey; | 11 | typedef struct s_UniqueKey UniqueKey; |
12 | 12 | ||
13 | #if defined(LUA_JITLIBNAME) && (defined(__x86_64__) || defined(_M_X64) || defined(__LP64__)) // building against LuaJIT headers, light userdata is restricted to 47 significant bits. | 13 | #if LUAJIT_FLAVOR == 64 // building against LuaJIT headers for 64 bits, light userdata is restricted to 47 significant bits, because LuaJIT uses the other bits for internal optimizations |
14 | #define MAKE_UNIQUE_KEY( p_) ((void*)((ptrdiff_t)(p_) & 0x7fffffffffffull)) | 14 | #define MAKE_UNIQUE_KEY( p_) ((void*)((ptrdiff_t)(p_) & 0x7fffffffffffull)) |
15 | #else // LUA_JITLIBNAME | 15 | #else // LUAJIT_FLAVOR |
16 | #define MAKE_UNIQUE_KEY( p_) ((void*)(ptrdiff_t)(p_)) | 16 | #define MAKE_UNIQUE_KEY( p_) ((void*)(ptrdiff_t)(p_)) |
17 | #endif // LUA_JITLIBNAME | 17 | #endif // LUAJIT_FLAVOR |
18 | 18 | ||
19 | #define DECLARE_UNIQUE_KEY( name_) UniqueKey name_ | 19 | #define DECLARE_UNIQUE_KEY( name_) UniqueKey name_ |
20 | #define DECLARE_CONST_UNIQUE_KEY( name_, p_) UniqueKey const name_ = { MAKE_UNIQUE_KEY( p_)} | 20 | #define DECLARE_CONST_UNIQUE_KEY( name_, p_) UniqueKey const name_ = { MAKE_UNIQUE_KEY( p_)} |