diff options
author | Benoit Germain <benoit.germain@ubisoft.com> | 2024-06-06 17:22:45 +0200 |
---|---|---|
committer | Benoit Germain <benoit.germain@ubisoft.com> | 2024-06-06 17:22:45 +0200 |
commit | 91a34bd09900967e8b9cccdbd6d94a9f8cc8506c (patch) | |
tree | 26ca2e83a6841361ac2d104c9d06bf78edd166e5 | |
parent | d9a149a230f9b320113020789beb78a883da3b40 (diff) | |
download | lanes-91a34bd09900967e8b9cccdbd6d94a9f8cc8506c.tar.gz lanes-91a34bd09900967e8b9cccdbd6d94a9f8cc8506c.tar.bz2 lanes-91a34bd09900967e8b9cccdbd6d94a9f8cc8506c.zip |
lanes.linda("auto")
-rw-r--r-- | docs/index.html | 5 | ||||
-rw-r--r-- | src/linda.cpp | 3 | ||||
-rw-r--r-- | src/lindafactory.cpp | 16 | ||||
-rw-r--r-- | tests/basic.lua | 7 |
4 files changed, 26 insertions, 5 deletions
diff --git a/docs/index.html b/docs/index.html index 1b24422..e17c7db 100644 --- a/docs/index.html +++ b/docs/index.html | |||
@@ -1217,6 +1217,11 @@ | |||
1217 | </pre></td></tr></table> | 1217 | </pre></td></tr></table> |
1218 | 1218 | ||
1219 | <p> | 1219 | <p> |
1220 | Converting the Linda to a string will yield the provided name prefixed by <tt>"Linda: "</tt>.<br/> | ||
1221 | If <tt>opt_name</tt> is omitted, it will evaluate to an hexadecimal number uniquely representing that linda.<br/> | ||
1222 | If <tt>opt_name</tt> is <tt>"auto"</tt>, Lanes will try to construct a name from the source location that called <tt>lanes.linda()</tt>. If that fails, the linda name will be <tt>"<unresolved>"</tt>. | ||
1223 | </p> | ||
1224 | <p> | ||
1220 | Timeouts are given in seconds (>= 0, millisecond accuracy) or <tt>nil</tt>. Timeout can be omitted only if the first key is not a number (then it's equivalent to an infinite duration). | 1225 | Timeouts are given in seconds (>= 0, millisecond accuracy) or <tt>nil</tt>. Timeout can be omitted only if the first key is not a number (then it's equivalent to an infinite duration). |
1221 | </p> | 1226 | </p> |
1222 | 1227 | ||
diff --git a/src/linda.cpp b/src/linda.cpp index 33d9f0b..8b6df8e 100644 --- a/src/linda.cpp +++ b/src/linda.cpp | |||
@@ -88,7 +88,8 @@ template <bool OPT> | |||
88 | if (!_lindaName.empty()) { | 88 | if (!_lindaName.empty()) { |
89 | std::ignore = luaG_pushstringview(L_, _lindaName); | 89 | std::ignore = luaG_pushstringview(L_, _lindaName); |
90 | } else { | 90 | } else { |
91 | lua_pushfstring(L_, "%p", _linda); | 91 | // obfuscate the pointer so that we can't read the value with our eyes out of a script |
92 | std::ignore = luaG_pushstringview(L_, "%p", std::bit_cast<uintptr_t>(_linda) ^ kConfigRegKey.storage); | ||
92 | } | 93 | } |
93 | lua_concat(L_, 2); | 94 | lua_concat(L_, 2); |
94 | return 1; | 95 | return 1; |
diff --git a/src/lindafactory.cpp b/src/lindafactory.cpp index d99d546..3f4b9b0 100644 --- a/src/lindafactory.cpp +++ b/src/lindafactory.cpp | |||
@@ -101,7 +101,7 @@ std::string_view LindaFactory::moduleName() const | |||
101 | 101 | ||
102 | // ################################################################################################# | 102 | // ################################################################################################# |
103 | 103 | ||
104 | DeepPrelude* LindaFactory::newDeepObjectInternal(lua_State* L_) const | 104 | DeepPrelude* LindaFactory::newDeepObjectInternal(lua_State* const L_) const |
105 | { | 105 | { |
106 | std::string_view _linda_name{}; | 106 | std::string_view _linda_name{}; |
107 | LindaGroup _linda_group{ 0 }; | 107 | LindaGroup _linda_group{ 0 }; |
@@ -124,6 +124,20 @@ DeepPrelude* LindaFactory::newDeepObjectInternal(lua_State* L_) const | |||
124 | break; | 124 | break; |
125 | } | 125 | } |
126 | 126 | ||
127 | // store in the linda the location of the script that created it | ||
128 | if (_linda_name == "auto") { | ||
129 | lua_Debug _ar; | ||
130 | if (lua_getstack(L_, 1, &_ar) == 1) { // 1 because we want the name of the function that called lanes.linda (where we currently are) | ||
131 | lua_getinfo(L_, "Sln", &_ar); | ||
132 | _linda_name = luaG_pushstringview(L_, "%s:%d", _ar.short_src, _ar.currentline); | ||
133 | } else { | ||
134 | _linda_name = luaG_pushstringview(L_, "<unresolved>"); | ||
135 | } | ||
136 | // since the name is not empty, it is at slot 1, and we can replace "auto" with the result, just in case | ||
137 | LUA_ASSERT(L_, luaG_tostringview(L_, 1) == "auto"); | ||
138 | lua_replace(L_, 1); | ||
139 | } | ||
140 | |||
127 | // The deep data is allocated separately of Lua stack; we might no longer be around when last reference to it is being released. | 141 | // The deep data is allocated separately of Lua stack; we might no longer be around when last reference to it is being released. |
128 | // One can use any memory allocation scheme. Just don't use L's allocF because we don't know which state will get the honor of GCing the linda | 142 | // One can use any memory allocation scheme. Just don't use L's allocF because we don't know which state will get the honor of GCing the linda |
129 | Universe* const _U{ Universe::Get(L_) }; | 143 | Universe* const _U{ Universe::Get(L_) }; |
diff --git a/tests/basic.lua b/tests/basic.lua index 8522895..59b5940 100644 --- a/tests/basic.lua +++ b/tests/basic.lua | |||
@@ -15,7 +15,7 @@ local require_assert_result_1, require_assert_result_2 = require "assert" -- | |||
15 | print("require_assert_result:", require_assert_result_1, require_assert_result_2) | 15 | print("require_assert_result:", require_assert_result_1, require_assert_result_2) |
16 | 16 | ||
17 | local lanes_gen= assert(lanes.gen) | 17 | local lanes_gen= assert(lanes.gen) |
18 | local lanes_linda= assert(lanes.linda) | 18 | local lanes_linda = assert(lanes.linda) |
19 | 19 | ||
20 | local tostring= assert(tostring) | 20 | local tostring= assert(tostring) |
21 | 21 | ||
@@ -160,7 +160,7 @@ PRINT(" "..st) | |||
160 | assert(st == "cancelled", "st is '" .. st .. "' instead of 'cancelled'") | 160 | assert(st == "cancelled", "st is '" .. st .. "' instead of 'cancelled'") |
161 | 161 | ||
162 | -- cancellation of lanes waiting on a linda | 162 | -- cancellation of lanes waiting on a linda |
163 | local limited = lanes.linda("limited") | 163 | local limited = lanes_linda("limited") |
164 | assert.fails(function() limited:limit("key", -1) end) | 164 | assert.fails(function() limited:limit("key", -1) end) |
165 | assert.failsnot(function() limited:limit("key", 1) end) | 165 | assert.failsnot(function() limited:limit("key", 1) end) |
166 | -- [[################################################ | 166 | -- [[################################################ |
@@ -422,6 +422,7 @@ local function chunk2(linda) | |||
422 | -- | 422 | -- |
423 | local info= debug.getinfo(1) -- 1 = us | 423 | local info= debug.getinfo(1) -- 1 = us |
424 | -- | 424 | -- |
425 | PRINT("linda named-> '" ..tostring(linda).."'") | ||
425 | PRINT "debug.getinfo->" | 426 | PRINT "debug.getinfo->" |
426 | for k,v in pairs(info) do PRINT(k,v) end | 427 | for k,v in pairs(info) do PRINT(k,v) end |
427 | 428 | ||
@@ -448,7 +449,7 @@ local function chunk2(linda) | |||
448 | linda:send("up", function() return ":)" end, "ok2") | 449 | linda:send("up", function() return ":)" end, "ok2") |
449 | end | 450 | end |
450 | 451 | ||
451 | local linda= lanes.linda("linda") | 452 | local linda = lanes_linda("auto") |
452 | local t2= lanes_gen("debug,string,io", {gc_cb = gc_cb}, chunk2)(linda) -- prepare & launch | 453 | local t2= lanes_gen("debug,string,io", {gc_cb = gc_cb}, chunk2)(linda) -- prepare & launch |
453 | linda:send("down", function(linda) linda:send("up", "ready!") end, | 454 | linda:send("down", function(linda) linda:send("up", "ready!") end, |
454 | "ok") | 455 | "ok") |