aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Germain <bnt.germain@gmail.com>2021-07-08 14:55:04 +0200
committerBenoit Germain <bnt.germain@gmail.com>2021-07-08 14:55:04 +0200
commit663a44a7fea7602b894160ec0608bca378c97d10 (patch)
tree0b1ea725bcaf2ca788608e5db6931bb1c8ce1f9c
parent19c4381fd37be09fe6ce3b81d8d7bd12668fc7b8 (diff)
downloadlanes-663a44a7fea7602b894160ec0608bca378c97d10.tar.gz
lanes-663a44a7fea7602b894160ec0608bca378c97d10.tar.bz2
lanes-663a44a7fea7602b894160ec0608bca378c97d10.zip
fix function transfer with lua_dump for Lua 5.4 failing for functions big enough to necessitate a buffer reallocation
-rw-r--r--CHANGES4
-rw-r--r--docs/index.html2
-rw-r--r--lanes-3.15.1-0.rockspec66
-rw-r--r--src/lanes.h2
-rw-r--r--src/tools.c40
5 files changed, 98 insertions, 16 deletions
diff --git a/CHANGES b/CHANGES
index 792a52b..c21a3ed 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,9 @@
1CHANGES: 1CHANGES:
2 2
3CHANGE 149: BGe 8-Jul-21
4 * bumped version to 3.15.1
5 * fix function transfer with lua_dump for Lua 5.4 failing for functions big enough to necessitate a buffer reallocation
6
3CHANGE 148: BGe 23-Jun-21 7CHANGE 148: BGe 23-Jun-21
4 * __lanesclone now receives the original as light userdata the first time it is called -> BREAKS CUSTOM DEEP USERDATA API 8 * __lanesclone now receives the original as light userdata the first time it is called -> BREAKS CUSTOM DEEP USERDATA API
5 9
diff --git a/docs/index.html b/docs/index.html
index 76752f5..82b1f24 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -70,7 +70,7 @@
70 </p> 70 </p>
71 71
72 <p> 72 <p>
73 This document was revised on 23-Jun-21, and applies to version <tt>3.15.0</tt>. 73 This document was revised on 8-Jul-21, and applies to version <tt>3.15.1</tt>.
74 </p> 74 </p>
75 </font> 75 </font>
76 </center> 76 </center>
diff --git a/lanes-3.15.1-0.rockspec b/lanes-3.15.1-0.rockspec
new file mode 100644
index 0000000..0ad4fd6
--- /dev/null
+++ b/lanes-3.15.1-0.rockspec
@@ -0,0 +1,66 @@
1--
2-- Lanes rockspec
3--
4-- Ref:
5-- <http://luarocks.org/en/Rockspec_format>
6--
7
8package = "Lanes"
9
10version = "3.15.1-0"
11
12source= {
13 url= "git://github.com/LuaLanes/lanes.git",
14 branch= "v3.15.1"
15}
16
17description = {
18 summary= "Multithreading support for Lua",
19 detailed= [[
20 Lua Lanes is a portable, message passing multithreading library
21 providing the possibility to run multiple Lua states in parallel.
22 ]],
23 license= "MIT/X11",
24 homepage="https://github.com/LuaLanes/lanes",
25 maintainer="Benoit Germain <bnt.germain@gmail.com>"
26}
27
28-- Q: What is the difference of "windows" and "win32"? Seems there is none;
29-- so should we list either one or both?
30--
31supported_platforms= { "win32",
32 "macosx",
33 "linux",
34 "freebsd", -- TBD: not tested
35 "msys", -- TBD: not supported by LuaRocks 1.0 (or is it?)
36}
37
38dependencies= {
39 "lua >= 5.1", -- builds with either 5.1, 5.2, 5.3 and 5.4
40}
41
42build = {
43 type = "builtin",
44 platforms =
45 {
46 linux =
47 {
48 modules =
49 {
50 ["lanes.core"] =
51 {
52 libraries = "pthread"
53 },
54 }
55 }
56 },
57 modules =
58 {
59 ["lanes.core"] =
60 {
61 sources = { "src/compat.c", "src/deep.c", "src/lanes.c", "src/linda.c", "src/keeper.c", "src/tools.c", "src/state.c", "src/threading.c", "src/universe.c"},
62 incdirs = { "src"},
63 },
64 lanes = "src/lanes.lua"
65 }
66}
diff --git a/src/lanes.h b/src/lanes.h
index 1a38ba5..41a6b73 100644
--- a/src/lanes.h
+++ b/src/lanes.h
@@ -12,7 +12,7 @@
12 12
13#define LANES_VERSION_MAJOR 3 13#define LANES_VERSION_MAJOR 3
14#define LANES_VERSION_MINOR 15 14#define LANES_VERSION_MINOR 15
15#define LANES_VERSION_PATCH 0 15#define LANES_VERSION_PATCH 1
16 16
17#define LANES_MIN_VERSION_REQUIRED(MAJOR, MINOR, PATCH) ((LANES_VERSION_MAJOR>MAJOR) || (LANES_VERSION_MAJOR==MAJOR && (LANES_VERSION_MINOR>MINOR || (LANES_VERSION_MINOR==MINOR && LANES_VERSION_PATCH>=PATCH)))) 17#define LANES_MIN_VERSION_REQUIRED(MAJOR, MINOR, PATCH) ((LANES_VERSION_MAJOR>MAJOR) || (LANES_VERSION_MAJOR==MAJOR && (LANES_VERSION_MINOR>MINOR || (LANES_VERSION_MINOR==MINOR && LANES_VERSION_PATCH>=PATCH))))
18#define LANES_VERSION_LESS_THAN(MAJOR, MINOR, PATCH) ((LANES_VERSION_MAJOR<MAJOR) || (LANES_VERSION_MAJOR==MAJOR && (LANES_VERSION_MINOR<MINOR || (LANES_VERSION_MINOR==MINOR && LANES_VERSION_PATCH<PATCH)))) 18#define LANES_VERSION_LESS_THAN(MAJOR, MINOR, PATCH) ((LANES_VERSION_MAJOR<MAJOR) || (LANES_VERSION_MAJOR==MAJOR && (LANES_VERSION_MINOR<MINOR || (LANES_VERSION_MINOR==MINOR && LANES_VERSION_PATCH<PATCH))))
diff --git a/src/tools.c b/src/tools.c
index 18015c1..1436e8d 100644
--- a/src/tools.c
+++ b/src/tools.c
@@ -297,7 +297,8 @@ static char const* luaG_pushFQN( lua_State* L, int t, int last, size_t* length)
297 int i = 1; 297 int i = 1;
298 luaL_Buffer b; 298 luaL_Buffer b;
299 STACK_CHECK( L, 0); 299 STACK_CHECK( L, 0);
300 luaL_buffinit( L, &b); 300 // Lua 5.4 pushes &b as light userdata on the stack. be aware of it...
301 luaL_buffinit( L, &b); // ... {} ... &b?
301 for( ; i < last; ++ i) 302 for( ; i < last; ++ i)
302 { 303 {
303 lua_rawgeti( L, t, i); 304 lua_rawgeti( L, t, i);
@@ -309,7 +310,8 @@ static char const* luaG_pushFQN( lua_State* L, int t, int last, size_t* length)
309 lua_rawgeti( L, t, i); 310 lua_rawgeti( L, t, i);
310 luaL_addvalue( &b); 311 luaL_addvalue( &b);
311 } 312 }
312 luaL_pushresult( &b); 313 // &b is popped at that point (-> replaced by the result)
314 luaL_pushresult( &b); // ... {} ... "<result>"
313 STACK_END( L, 1); 315 STACK_END( L, 1);
314 return lua_tolstring( L, -1, length); 316 return lua_tolstring( L, -1, length);
315} 317}
@@ -631,14 +633,6 @@ static lua_Integer get_mt_id( Universe* U, lua_State* L, int i)
631 return id; 633 return id;
632} 634}
633 635
634
635static int buf_writer( lua_State *L, const void* b, size_t n, void* B ) {
636 (void)L;
637 luaL_addlstring((luaL_Buffer*) B, (const char *)b, n);
638 return 0;
639}
640
641
642// function sentinel used to transfer native functions from/to keeper states 636// function sentinel used to transfer native functions from/to keeper states
643static int func_lookup_sentinel( lua_State* L) 637static int func_lookup_sentinel( lua_State* L)
644{ 638{
@@ -1138,14 +1132,32 @@ static char const* vt_names[] =
1138}; 1132};
1139#endif // USE_DEBUG_SPEW 1133#endif // USE_DEBUG_SPEW
1140 1134
1135// Lua 5.4.3 style of dumping (see lstrlib.c)
1136// we have to do it that way because we can't unbalance the stack between buffer operations
1137// namely, this means we can't push a function on top of the stack *after* we initialize the buffer!
1138// luckily, this also works with earlier Lua versions
1139static int buf_writer( lua_State* L, void const* b, size_t size, void* ud)
1140{
1141 luaL_Buffer* B = (luaL_Buffer*) ud;
1142 if( !B->L)
1143 {
1144 luaL_buffinit( L, B);
1145 }
1146 luaL_addlstring( B, (char const*) b, size);
1147 return 0;
1148}
1149
1141static void copy_func( Universe* U, lua_State* L2, uint_t L2_cache_i, lua_State* L, uint_t i, LookupMode mode_, char const* upName_) 1150static void copy_func( Universe* U, lua_State* L2, uint_t L2_cache_i, lua_State* L, uint_t i, LookupMode mode_, char const* upName_)
1142{ 1151{
1143 int n, needToPush; 1152 int n, needToPush;
1144 luaL_Buffer b; 1153 luaL_Buffer B;
1154 B.L = NULL;
1155
1145 ASSERT_L( L2_cache_i != 0); // ... {cache} ... p 1156 ASSERT_L( L2_cache_i != 0); // ... {cache} ... p
1146 STACK_GROW( L, 2); 1157 STACK_GROW( L, 2);
1147 STACK_CHECK( L, 0); 1158 STACK_CHECK( L, 0);
1148 1159
1160
1149 // 'lua_dump()' needs the function at top of stack 1161 // 'lua_dump()' needs the function at top of stack
1150 // if already on top of the stack, no need to push again 1162 // if already on top of the stack, no need to push again
1151 needToPush = (i != (uint_t)lua_gettop( L)); 1163 needToPush = (i != (uint_t)lua_gettop( L));
@@ -1154,18 +1166,18 @@ static void copy_func( Universe* U, lua_State* L2, uint_t L2_cache_i, lua_State*
1154 lua_pushvalue( L, i); // ... f 1166 lua_pushvalue( L, i); // ... f
1155 } 1167 }
1156 1168
1157 luaL_buffinit( L, &b);
1158 // 1169 //
1159 // "value returned is the error code returned by the last call 1170 // "value returned is the error code returned by the last call
1160 // to the writer" (and we only return 0) 1171 // to the writer" (and we only return 0)
1161 // not sure this could ever fail but for memory shortage reasons 1172 // not sure this could ever fail but for memory shortage reasons
1162 if( lua504_dump( L, buf_writer, &b, 0) != 0) 1173 // last parameter is Lua 5.4-specific (no stripping)
1174 if( lua504_dump( L, buf_writer, &B, 0) != 0)
1163 { 1175 {
1164 luaL_error( L, "internal error: function dump failed."); 1176 luaL_error( L, "internal error: function dump failed.");
1165 } 1177 }
1166 1178
1167 // pushes dumped string on 'L' 1179 // pushes dumped string on 'L'
1168 luaL_pushresult( &b); // ... f b 1180 luaL_pushresult( &B); // ... f b
1169 1181
1170 // if not pushed, no need to pop 1182 // if not pushed, no need to pop
1171 if( needToPush) 1183 if( needToPush)