aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBenoit Germain <benoit.germain@ubisoft.com>2024-05-13 18:00:21 +0200
committerBenoit Germain <benoit.germain@ubisoft.com>2024-05-13 18:15:46 +0200
commit2e27d4153943145f9102d5d56782ad6e20b76182 (patch)
tree6b4fb894b4475b3d74bc55e7b7daa5e6761a93c8 /src
parent2e61dc33af885974a2a3a3f8a504061abe91bd71 (diff)
downloadlanes-2e27d4153943145f9102d5d56782ad6e20b76182.tar.gz
lanes-2e27d4153943145f9102d5d56782ad6e20b76182.tar.bz2
lanes-2e27d4153943145f9102d5d56782ad6e20b76182.zip
Progressively applying the coding rules
Diffstat (limited to 'src')
-rw-r--r--src/keeper.cpp10
-rw-r--r--src/keeper.h2
-rw-r--r--src/lanes.cpp662
-rw-r--r--src/lanesconf.h2
-rw-r--r--src/linda.cpp464
-rw-r--r--src/lindafactory.cpp40
-rw-r--r--src/macros_and_utils.h2
-rw-r--r--src/state.cpp133
-rw-r--r--src/tools.cpp124
-rw-r--r--src/universe.cpp66
10 files changed, 751 insertions, 754 deletions
diff --git a/src/keeper.cpp b/src/keeper.cpp
index 39d2e85..dcfa2ec 100644
--- a/src/keeper.cpp
+++ b/src/keeper.cpp
@@ -738,9 +738,9 @@ void keeper_toggle_nil_sentinels(lua_State* L_, int start_, LookupMode const mod
738 * 738 *
739 * Returns: number of return values (pushed to 'L'), unset in case of error 739 * Returns: number of return values (pushed to 'L'), unset in case of error
740 */ 740 */
741KeeperCallResult keeper_call(Universe* U_, KeeperState K_, keeper_api_t func_, lua_State* L_, void* linda_, int starting_index_) 741KeeperCallResult keeper_call(KeeperState K_, keeper_api_t func_, lua_State* L_, Linda* linda_, int starting_index_)
742{ 742{
743 KeeperCallResult _result{}; 743 KeeperCallResult _result;
744 int const _args{ starting_index_ ? (lua_gettop(L_) - starting_index_ + 1) : 0 }; // L: ... args... K_: 744 int const _args{ starting_index_ ? (lua_gettop(L_) - starting_index_ + 1) : 0 }; // L: ... args... K_:
745 int const _top_K{ lua_gettop(K_) }; 745 int const _top_K{ lua_gettop(K_) };
746 // if we didn't do anything wrong, the keeper stack should be clean 746 // if we didn't do anything wrong, the keeper stack should be clean
@@ -751,7 +751,7 @@ KeeperCallResult keeper_call(Universe* U_, KeeperState K_, keeper_api_t func_, l
751 lua_pushlightuserdata(K_, linda_); // L: ... args... K_: func_ linda 751 lua_pushlightuserdata(K_, linda_); // L: ... args... K_: func_ linda
752 if ( 752 if (
753 (_args == 0) || 753 (_args == 0) ||
754 (InterCopyContext{ U_, DestState{ K_ }, SourceState{ L_ }, {}, {}, {}, LookupMode::ToKeeper, {} }.inter_copy(_args) == InterCopyResult::Success) 754 (InterCopyContext{ linda_->U, DestState{ K_ }, SourceState{ L_ }, {}, {}, {}, LookupMode::ToKeeper, {} }.inter_copy(_args) == InterCopyResult::Success)
755 ) { // L: ... args... K_: func_ linda args... 755 ) { // L: ... args... K_: func_ linda args...
756 lua_call(K_, 1 + _args, LUA_MULTRET); // L: ... args... K_: result... 756 lua_call(K_, 1 + _args, LUA_MULTRET); // L: ... args... K_: result...
757 int const retvals{ lua_gettop(K_) - _top_K }; 757 int const retvals{ lua_gettop(K_) - _top_K };
@@ -761,7 +761,7 @@ KeeperCallResult keeper_call(Universe* U_, KeeperState K_, keeper_api_t func_, l
761 // when attempting to grab the mutex again (WINVER <= 0x400 does this, but locks just fine, I don't know about pthread) 761 // when attempting to grab the mutex again (WINVER <= 0x400 does this, but locks just fine, I don't know about pthread)
762 if ( 762 if (
763 (retvals == 0) || 763 (retvals == 0) ||
764 (InterCopyContext{ U_, DestState{ L_ }, SourceState{ K_ }, {}, {}, {}, LookupMode::FromKeeper, {} }.inter_move(retvals) == InterCopyResult::Success) 764 (InterCopyContext{ linda_->U, DestState{ L_ }, SourceState{ K_ }, {}, {}, {}, LookupMode::FromKeeper, {} }.inter_move(retvals) == InterCopyResult::Success)
765 ) { // L: ... args... result... K_: result... 765 ) { // L: ... args... result... K_: result...
766 _result.emplace(retvals); 766 _result.emplace(retvals);
767 } 767 }
@@ -772,7 +772,7 @@ KeeperCallResult keeper_call(Universe* U_, KeeperState K_, keeper_api_t func_, l
772 // don't do this for this particular function, as it is only called during Linda destruction, and we don't want to raise an error, ever 772 // don't do this for this particular function, as it is only called during Linda destruction, and we don't want to raise an error, ever
773 if (func_ != KEEPER_API(clear)) [[unlikely]] { 773 if (func_ != KEEPER_API(clear)) [[unlikely]] {
774 // since keeper state GC is stopped, let's run a step once in a while if required 774 // since keeper state GC is stopped, let's run a step once in a while if required
775 int const _gc_threshold{ U_->keepers->gc_threshold }; 775 int const _gc_threshold{ linda_->U->keepers->gc_threshold };
776 if (_gc_threshold == 0) [[unlikely]] { 776 if (_gc_threshold == 0) [[unlikely]] {
777 lua_gc(K_, LUA_GCSTEP, 0); 777 lua_gc(K_, LUA_GCSTEP, 0);
778 } else if (_gc_threshold > 0) [[likely]] { 778 } else if (_gc_threshold > 0) [[likely]] {
diff --git a/src/keeper.h b/src/keeper.h
index 8f30720..ebe2946 100644
--- a/src/keeper.h
+++ b/src/keeper.h
@@ -58,4 +58,4 @@ using keeper_api_t = lua_CFunction;
58[[nodiscard]] int keepercall_count(lua_State* L_); 58[[nodiscard]] int keepercall_count(lua_State* L_);
59 59
60using KeeperCallResult = Unique<std::optional<int>>; 60using KeeperCallResult = Unique<std::optional<int>>;
61[[nodiscard]] KeeperCallResult keeper_call(Universe* U_, KeeperState K_, keeper_api_t func_, lua_State* L_, void* linda_, int starting_index_); 61[[nodiscard]] KeeperCallResult keeper_call(KeeperState K_, keeper_api_t func_, lua_State* L_, Linda* linda_, int starting_index_);
diff --git a/src/lanes.cpp b/src/lanes.cpp
index ee40ffa..f0ec84c 100644
--- a/src/lanes.cpp
+++ b/src/lanes.cpp
@@ -116,7 +116,7 @@ THE SOFTWARE.
116 */ 116 */
117static void tracking_add(Lane* lane_) 117static void tracking_add(Lane* lane_)
118{ 118{
119 std::lock_guard<std::mutex> guard{ lane_->U->trackingMutex }; 119 std::lock_guard<std::mutex> _guard{ lane_->U->trackingMutex };
120 assert(lane_->tracking_next == nullptr); 120 assert(lane_->tracking_next == nullptr);
121 121
122 lane_->tracking_next = lane_->U->trackingFirst; 122 lane_->tracking_next = lane_->U->trackingFirst;
@@ -130,27 +130,27 @@ static void tracking_add(Lane* lane_)
130 */ 130 */
131[[nodiscard]] static bool tracking_remove(Lane* lane_) 131[[nodiscard]] static bool tracking_remove(Lane* lane_)
132{ 132{
133 bool found{ false }; 133 bool _found{ false };
134 std::lock_guard<std::mutex> guard{ lane_->U->trackingMutex }; 134 std::lock_guard<std::mutex> _guard{ lane_->U->trackingMutex };
135 // Make sure (within the MUTEX) that we actually are in the chain 135 // Make sure (within the MUTEX) that we actually are in the chain
136 // still (at process exit they will remove us from chain and then 136 // still (at process exit they will remove us from chain and then
137 // cancel/kill). 137 // cancel/kill).
138 // 138 //
139 if (lane_->tracking_next != nullptr) { 139 if (lane_->tracking_next != nullptr) {
140 Lane** ref = (Lane**) &lane_->U->trackingFirst; 140 Lane** _ref = (Lane**) &lane_->U->trackingFirst;
141 141
142 while (*ref != TRACKING_END) { 142 while (*_ref != TRACKING_END) {
143 if (*ref == lane_) { 143 if (*_ref == lane_) {
144 *ref = lane_->tracking_next; 144 *_ref = lane_->tracking_next;
145 lane_->tracking_next = nullptr; 145 lane_->tracking_next = nullptr;
146 found = true; 146 _found = true;
147 break; 147 break;
148 } 148 }
149 ref = (Lane**) &((*ref)->tracking_next); 149 _ref = (Lane**) &((*_ref)->tracking_next);
150 } 150 }
151 assert(found); 151 assert(_found);
152 } 152 }
153 return found; 153 return _found;
154} 154}
155 155
156#endif // HAVE_LANE_TRACKING() 156#endif // HAVE_LANE_TRACKING()
@@ -172,15 +172,15 @@ Lane::Lane(Universe* U_, lua_State* L_)
172 172
173bool Lane::waitForCompletion(std::chrono::time_point<std::chrono::steady_clock> until_) 173bool Lane::waitForCompletion(std::chrono::time_point<std::chrono::steady_clock> until_)
174{ 174{
175 std::unique_lock lock{ doneMutex }; 175 std::unique_lock _guard{ doneMutex };
176 // std::stop_token token{ thread.get_stop_token() }; 176 // std::stop_token token{ thread.get_stop_token() };
177 // return doneCondVar.wait_until(lock, token, secs_, [this](){ return status >= Lane::Done; }); 177 // return doneCondVar.wait_until(lock, token, secs_, [this](){ return status >= Lane::Done; });
178 return doneCondVar.wait_until(lock, until_, [this]() { return status >= Lane::Done; }); 178 return doneCondVar.wait_until(_guard, until_, [this]() { return status >= Lane::Done; });
179} 179}
180 180
181// ################################################################################################# 181// #################################################################################################
182 182
183static void lane_main(Lane* lane); 183static void lane_main(Lane* lane_);
184void Lane::startThread(int priority_) 184void Lane::startThread(int priority_)
185{ 185{
186 thread = std::jthread([this]() { lane_main(this); }); 186 thread = std::jthread([this]() { lane_main(this); });
@@ -267,9 +267,9 @@ LUAG_FUNC(set_finalizer)
267 // Get the current finalizer table (if any), create one if it doesn't exist 267 // Get the current finalizer table (if any), create one if it doesn't exist
268 std::ignore = kFinalizerRegKey.getSubTable(L_, 1, 0); // L_: finalizer {finalisers} 268 std::ignore = kFinalizerRegKey.getSubTable(L_, 1, 0); // L_: finalizer {finalisers}
269 // must cast to int, not lua_Integer, because LuaJIT signature of lua_rawseti is not the same as PUC-Lua. 269 // must cast to int, not lua_Integer, because LuaJIT signature of lua_rawseti is not the same as PUC-Lua.
270 int const idx{ static_cast<int>(lua_rawlen(L_, -1) + 1) }; 270 int const _idx{ static_cast<int>(lua_rawlen(L_, -1) + 1) };
271 lua_pushvalue(L_, 1); // L_: finalizer {finalisers} finalizer 271 lua_pushvalue(L_, 1); // L_: finalizer {finalisers} finalizer
272 lua_rawseti(L_, -2, idx); // L_: finalizer {finalisers} 272 lua_rawseti(L_, -2, _idx); // L_: finalizer {finalisers}
273 // no need to adjust the stack, Lua does this for us 273 // no need to adjust the stack, Lua does this for us
274 return 0; 274 return 0;
275} 275}
@@ -337,28 +337,28 @@ static void push_stack_trace(lua_State* L_, int rc_, int stk_base_)
337 337
338 STACK_GROW(L_, 5); 338 STACK_GROW(L_, 5);
339 339
340 int const finalizers_index{ lua_gettop(L_) }; 340 int const _finalizers_index{ lua_gettop(L_) };
341 int const err_handler_index{ ERROR_FULL_STACK ? (lua_pushcfunction(L_, lane_error), lua_gettop(L_)) : 0 }; 341 int const _err_handler_index{ ERROR_FULL_STACK ? (lua_pushcfunction(L_, lane_error), lua_gettop(L_)) : 0 };
342 342
343 int rc{ LUA_OK }; 343 int rc{ LUA_OK };
344 for (int n = static_cast<int>(lua_rawlen(L_, finalizers_index)); n > 0; --n) { 344 for (int n = static_cast<int>(lua_rawlen(L_, _finalizers_index)); n > 0; --n) {
345 int args = 0; 345 int args = 0;
346 lua_pushinteger(L_, n); // L_: ... finalizers lane_error n 346 lua_pushinteger(L_, n); // L_: ... finalizers lane_error n
347 lua_rawget(L_, finalizers_index); // L_: ... finalizers lane_error finalizer 347 lua_rawget(L_, _finalizers_index); // L_: ... finalizers lane_error finalizer
348 LUA_ASSERT(L_, lua_isfunction(L_, -1)); 348 LUA_ASSERT(L_, lua_isfunction(L_, -1));
349 if (lua_rc_ != LUA_OK) { // we have an error message and an optional stack trace at the bottom of the stack 349 if (lua_rc_ != LUA_OK) { // we have an error message and an optional stack trace at the bottom of the stack
350 LUA_ASSERT(L_, finalizers_index == 2 || finalizers_index == 3); 350 LUA_ASSERT(L_, _finalizers_index == 2 || _finalizers_index == 3);
351 // char const* err_msg = lua_tostring(L_, 1); 351 // char const* err_msg = lua_tostring(L_, 1);
352 lua_pushvalue(L_, 1); // L_: ... finalizers lane_error finalizer err_msg 352 lua_pushvalue(L_, 1); // L_: ... finalizers lane_error finalizer err_msg
353 // note we don't always have a stack trace for example when kCancelError, or when we got an error that doesn't call our handler, such as LUA_ERRMEM 353 // note we don't always have a stack trace for example when kCancelError, or when we got an error that doesn't call our handler, such as LUA_ERRMEM
354 if (finalizers_index == 3) { 354 if (_finalizers_index == 3) {
355 lua_pushvalue(L_, 2); // L_: ... finalizers lane_error finalizer err_msg stack_trace 355 lua_pushvalue(L_, 2); // L_: ... finalizers lane_error finalizer err_msg stack_trace
356 } 356 }
357 args = finalizers_index - 1; 357 args = _finalizers_index - 1;
358 } 358 }
359 359
360 // if no error from the main body, finalizer doesn't receive any argument, else it gets the error message and optional stack trace 360 // if no error from the main body, finalizer doesn't receive any argument, else it gets the error message and optional stack trace
361 rc = lua_pcall(L_, args, 0, err_handler_index); // L_: ... finalizers lane_error err_msg2? 361 rc = lua_pcall(L_, args, 0, _err_handler_index); // L_: ... finalizers lane_error err_msg2?
362 if (rc != LUA_OK) { 362 if (rc != LUA_OK) {
363 push_stack_trace(L_, rc, lua_gettop(L_)); // L_: ... finalizers lane_error err_msg2? trace 363 push_stack_trace(L_, rc, lua_gettop(L_)); // L_: ... finalizers lane_error err_msg2? trace
364 // If one finalizer fails, don't run the others. Return this 364 // If one finalizer fails, don't run the others. Return this
@@ -371,7 +371,7 @@ static void push_stack_trace(lua_State* L_, int rc_, int stk_base_)
371 371
372 if (rc != LUA_OK) { 372 if (rc != LUA_OK) {
373 // ERROR_FULL_STACK accounts for the presence of lane_error on the stack 373 // ERROR_FULL_STACK accounts for the presence of lane_error on the stack
374 int const nb_err_slots{ lua_gettop(L_) - finalizers_index - ERROR_FULL_STACK }; 374 int const nb_err_slots{ lua_gettop(L_) - _finalizers_index - ERROR_FULL_STACK };
375 // a finalizer generated an error, this is what we leave of the stack 375 // a finalizer generated an error, this is what we leave of the stack
376 for (int n = nb_err_slots; n > 0; --n) { 376 for (int n = nb_err_slots; n > 0; --n) {
377 lua_replace(L_, n); 377 lua_replace(L_, n);
@@ -379,7 +379,7 @@ static void push_stack_trace(lua_State* L_, int rc_, int stk_base_)
379 // leave on the stack only the error and optional stack trace produced by the error in the finalizer 379 // leave on the stack only the error and optional stack trace produced by the error in the finalizer
380 lua_settop(L_, nb_err_slots); // L_: ... lane_error trace 380 lua_settop(L_, nb_err_slots); // L_: ... lane_error trace
381 } else { // no error from the finalizers, make sure only the original return values from the lane body remain on the stack 381 } else { // no error from the finalizers, make sure only the original return values from the lane body remain on the stack
382 lua_settop(L_, finalizers_index - 1); 382 lua_settop(L_, _finalizers_index - 1);
383 } 383 }
384 384
385 return rc; 385 return rc;
@@ -395,7 +395,7 @@ static void push_stack_trace(lua_State* L_, int rc_, int stk_base_)
395 */ 395 */
396static void selfdestruct_add(Lane* lane_) 396static void selfdestruct_add(Lane* lane_)
397{ 397{
398 std::lock_guard<std::mutex> guard{ lane_->U->selfdestructMutex }; 398 std::lock_guard<std::mutex> _guard{ lane_->U->selfdestructMutex };
399 assert(lane_->selfdestruct_next == nullptr); 399 assert(lane_->selfdestruct_next == nullptr);
400 400
401 lane_->selfdestruct_next = lane_->U->selfdestructFirst; 401 lane_->selfdestruct_next = lane_->U->selfdestructFirst;
@@ -407,29 +407,29 @@ static void selfdestruct_add(Lane* lane_)
407// A free-running lane has ended; remove it from selfdestruct chain 407// A free-running lane has ended; remove it from selfdestruct chain
408[[nodiscard]] static bool selfdestruct_remove(Lane* lane_) 408[[nodiscard]] static bool selfdestruct_remove(Lane* lane_)
409{ 409{
410 bool found{ false }; 410 bool _found{ false };
411 std::lock_guard<std::mutex> guard{ lane_->U->selfdestructMutex }; 411 std::lock_guard<std::mutex> _guard{ lane_->U->selfdestructMutex };
412 // Make sure (within the MUTEX) that we actually are in the chain 412 // Make sure (within the MUTEX) that we actually are in the chain
413 // still (at process exit they will remove us from chain and then 413 // still (at process exit they will remove us from chain and then
414 // cancel/kill). 414 // cancel/kill).
415 // 415 //
416 if (lane_->selfdestruct_next != nullptr) { 416 if (lane_->selfdestruct_next != nullptr) {
417 Lane* volatile* ref = static_cast<Lane* volatile*>(&lane_->U->selfdestructFirst); 417 Lane* volatile* _ref = static_cast<Lane* volatile*>(&lane_->U->selfdestructFirst);
418 418
419 while (*ref != SELFDESTRUCT_END) { 419 while (*_ref != SELFDESTRUCT_END) {
420 if (*ref == lane_) { 420 if (*_ref == lane_) {
421 *ref = lane_->selfdestruct_next; 421 *_ref = lane_->selfdestruct_next;
422 lane_->selfdestruct_next = nullptr; 422 lane_->selfdestruct_next = nullptr;
423 // the terminal shutdown should wait until the lane is done with its lua_close() 423 // the terminal shutdown should wait until the lane is done with its lua_close()
424 lane_->U->selfdestructingCount.fetch_add(1, std::memory_order_release); 424 lane_->U->selfdestructingCount.fetch_add(1, std::memory_order_release);
425 found = true; 425 _found = true;
426 break; 426 break;
427 } 427 }
428 ref = static_cast<Lane* volatile*>(&((*ref)->selfdestruct_next)); 428 _ref = static_cast<Lane* volatile*>(&((*_ref)->selfdestruct_next));
429 } 429 }
430 assert(found); 430 assert(_found);
431 } 431 }
432 return found; 432 return _found;
433} 433}
434 434
435// ################################################################################################# 435// #################################################################################################
@@ -442,11 +442,11 @@ static void selfdestruct_add(Lane* lane_)
442// 442//
443LUAG_FUNC(set_singlethreaded) 443LUAG_FUNC(set_singlethreaded)
444{ 444{
445 [[maybe_unused]] lua_Integer const cores{ luaL_optinteger(L_, 1, 1) }; 445 [[maybe_unused]] lua_Integer const _cores{ luaL_optinteger(L_, 1, 1) };
446 446
447#ifdef PLATFORM_OSX 447#ifdef PLATFORM_OSX
448#ifdef _UTILBINDTHREADTOCPU 448#ifdef _UTILBINDTHREADTOCPU
449 if (cores > 1) { 449 if (_cores > 1) {
450 raise_luaL_error(L_, "Limiting to N>1 cores not possible"); 450 raise_luaL_error(L_, "Limiting to N>1 cores not possible");
451 } 451 }
452 // requires 'chudInitialize()' 452 // requires 'chudInitialize()'
@@ -486,15 +486,15 @@ static constexpr RegistryUniqueKey kExtendedStackTraceRegKey{ 0x38147AD48FB426E2
486LUAG_FUNC(set_error_reporting) 486LUAG_FUNC(set_error_reporting)
487{ 487{
488 luaL_checktype(L_, 1, LUA_TSTRING); 488 luaL_checktype(L_, 1, LUA_TSTRING);
489 char const* mode{ lua_tostring(L_, 1) }; 489 char const* _mode{ lua_tostring(L_, 1) };
490 lua_pushliteral(L_, "extended"); 490 lua_pushliteral(L_, "extended");
491 bool const extended{ strcmp(mode, "extended") == 0 }; 491 bool const _extended{ strcmp(_mode, "extended") == 0 };
492 bool const basic{ strcmp(mode, "basic") == 0 }; 492 bool const _basic{ strcmp(_mode, "basic") == 0 };
493 if (!extended && !basic) { 493 if (!_extended && !_basic) {
494 raise_luaL_error(L_, "unsupported error reporting model %s", mode); 494 raise_luaL_error(L_, "unsupported error reporting model %s", _mode);
495 } 495 }
496 496
497 kExtendedStackTraceRegKey.setValue(L_, [extended](lua_State* L_) { lua_pushboolean(L_, extended ? 1 : 0); }); 497 kExtendedStackTraceRegKey.setValue(L_, [extended = _extended](lua_State* L_) { lua_pushboolean(L_, extended ? 1 : 0); });
498 return 0; 498 return 0;
499} 499}
500 500
@@ -512,7 +512,7 @@ LUAG_FUNC(set_error_reporting)
512 } 512 }
513 513
514 STACK_GROW(L_, 3); 514 STACK_GROW(L_, 3);
515 bool const extended{ kExtendedStackTraceRegKey.readBoolValue(L_) }; 515 bool const _extended{ kExtendedStackTraceRegKey.readBoolValue(L_) };
516 STACK_CHECK(L_, 1); 516 STACK_CHECK(L_, 1);
517 517
518 // Place stack trace at 'registry[kStackTraceRegKey]' for the 'lua_pcall()' 518 // Place stack trace at 'registry[kStackTraceRegKey]' for the 'lua_pcall()'
@@ -531,32 +531,32 @@ LUAG_FUNC(set_error_reporting)
531 // and we don't get '.currentline' for that. It's okay - just keep level 531 // and we don't get '.currentline' for that. It's okay - just keep level
532 // and table index growing separate. --AKa 22-Jan-2009 532 // and table index growing separate. --AKa 22-Jan-2009
533 // 533 //
534 lua_Debug ar; 534 lua_Debug _ar;
535 for (int n = 1; lua_getstack(L_, n, &ar); ++n) { 535 for (int _n = 1; lua_getstack(L_, _n, &_ar); ++_n) {
536 lua_getinfo(L_, extended ? "Sln" : "Sl", &ar); 536 lua_getinfo(L_, _extended ? "Sln" : "Sl", &_ar);
537 if (extended) { 537 if (_extended) {
538 lua_newtable(L_); // L_: some_error {} {} 538 lua_newtable(L_); // L_: some_error {} {}
539 539
540 lua_pushstring(L_, ar.source); // L_: some_error {} {} source 540 lua_pushstring(L_, _ar.source); // L_: some_error {} {} source
541 lua_setfield(L_, -2, "source"); // L_: some_error {} {} 541 lua_setfield(L_, -2, "source"); // L_: some_error {} {}
542 542
543 lua_pushinteger(L_, ar.currentline); // L_: some_error {} {} currentline 543 lua_pushinteger(L_, _ar.currentline); // L_: some_error {} {} currentline
544 lua_setfield(L_, -2, "currentline"); // L_: some_error {} {} 544 lua_setfield(L_, -2, "currentline"); // L_: some_error {} {}
545 545
546 lua_pushstring(L_, ar.name); // L_: some_error {} {} name 546 lua_pushstring(L_, _ar.name); // L_: some_error {} {} name
547 lua_setfield(L_, -2, "name"); // L_: some_error {} {} 547 lua_setfield(L_, -2, "name"); // L_: some_error {} {}
548 548
549 lua_pushstring(L_, ar.namewhat); // L_: some_error {} {} namewhat 549 lua_pushstring(L_, _ar.namewhat); // L_: some_error {} {} namewhat
550 lua_setfield(L_, -2, "namewhat"); // L_: some_error {} {} 550 lua_setfield(L_, -2, "namewhat"); // L_: some_error {} {}
551 551
552 lua_pushstring(L_, ar.what); // L_: some_error {} {} what 552 lua_pushstring(L_, _ar.what); // L_: some_error {} {} what
553 lua_setfield(L_, -2, "what"); // L_: some_error {} {} 553 lua_setfield(L_, -2, "what"); // L_: some_error {} {}
554 } else if (ar.currentline > 0) { 554 } else if (_ar.currentline > 0) {
555 lua_pushfstring(L_, "%s:%d", ar.short_src, ar.currentline); // L_: some_error {} "blah:blah" 555 lua_pushfstring(L_, "%s:%d", _ar.short_src, _ar.currentline); // L_: some_error {} "blah:blah"
556 } else { 556 } else {
557 lua_pushfstring(L_, "%s:?", ar.short_src); // L_: some_error {} "blah" 557 lua_pushfstring(L_, "%s:?", _ar.short_src); // L_: some_error {} "blah"
558 } 558 }
559 lua_rawseti(L_, -2, (lua_Integer) n); // L_: some_error {} 559 lua_rawseti(L_, -2, static_cast<lua_Integer>(_n)); // L_: some_error {}
560 } 560 }
561 561
562 // store the stack trace table in the registry 562 // store the stack trace table in the registry
@@ -572,12 +572,12 @@ LUAG_FUNC(set_error_reporting)
572void Lane::changeDebugName(int nameIdx_) 572void Lane::changeDebugName(int nameIdx_)
573{ 573{
574 // xxh64 of string "debugName" generated at https://www.pelock.com/products/hash-calculator 574 // xxh64 of string "debugName" generated at https://www.pelock.com/products/hash-calculator
575 static constexpr RegistryUniqueKey hidden_regkey{ 0xA194E2645C57F6DDull }; 575 static constexpr RegistryUniqueKey kRegKey{ 0xA194E2645C57F6DDull };
576 nameIdx_ = lua_absindex(L, nameIdx_); 576 nameIdx_ = lua_absindex(L, nameIdx_);
577 luaL_checktype(L, nameIdx_, LUA_TSTRING); // L: ... "name" ... 577 luaL_checktype(L, nameIdx_, LUA_TSTRING); // L: ... "name" ...
578 STACK_CHECK_START_REL(L, 0); 578 STACK_CHECK_START_REL(L, 0);
579 // store a hidden reference in the registry to make sure the string is kept around even if a lane decides to manually change the "decoda_name" global... 579 // store a hidden reference in the registry to make sure the string is kept around even if a lane decides to manually change the "decoda_name" global...
580 hidden_regkey.setValue(L, [nameIdx = nameIdx_](lua_State* L_) { lua_pushvalue(L_, nameIdx); });// L: ... "name" ... 580 kRegKey.setValue(L, [nameIdx = nameIdx_](lua_State* L_) { lua_pushvalue(L_, nameIdx); }); // L: ... "name" ...
581 // keep a direct pointer on the string 581 // keep a direct pointer on the string
582 debugName = lua_tostring(L, nameIdx_); 582 debugName = lua_tostring(L, nameIdx_);
583 // to see VM name in Decoda debugger Virtual Machine window 583 // to see VM name in Decoda debugger Virtual Machine window
@@ -594,11 +594,11 @@ void Lane::changeDebugName(int nameIdx_)
594LUAG_FUNC(set_debug_threadname) 594LUAG_FUNC(set_debug_threadname)
595{ 595{
596 // C s_lane structure is a light userdata upvalue 596 // C s_lane structure is a light userdata upvalue
597 Lane* const lane{ lua_tolightuserdata<Lane>(L_, lua_upvalueindex(1)) }; 597 Lane* const _lane{ lua_tolightuserdata<Lane>(L_, lua_upvalueindex(1)) };
598 LUA_ASSERT(L_, L_ == lane->L); // this function is exported in a lane's state, therefore it is callable only from inside the Lane's state 598 LUA_ASSERT(L_, L_ == _lane->L); // this function is exported in a lane's state, therefore it is callable only from inside the Lane's state
599 lua_settop(L_, 1); 599 lua_settop(L_, 1);
600 STACK_CHECK_START_REL(L_, 0); 600 STACK_CHECK_START_REL(L_, 0);
601 lane->changeDebugName(-1); 601 _lane->changeDebugName(-1);
602 STACK_CHECK(L_, 0); 602 STACK_CHECK(L_, 0);
603 return 0; 603 return 0;
604} 604}
@@ -607,9 +607,9 @@ LUAG_FUNC(set_debug_threadname)
607 607
608LUAG_FUNC(get_debug_threadname) 608LUAG_FUNC(get_debug_threadname)
609{ 609{
610 Lane* const lane{ ToLane(L_, 1) }; 610 Lane* const _lane{ ToLane(L_, 1) };
611 luaL_argcheck(L_, lua_gettop(L_) == 1, 2, "too many arguments"); 611 luaL_argcheck(L_, lua_gettop(L_) == 1, 2, "too many arguments");
612 lua_pushstring(L_, lane->debugName); 612 lua_pushstring(L_, _lane->debugName);
613 return 1; 613 return 1;
614} 614}
615 615
@@ -617,14 +617,14 @@ LUAG_FUNC(get_debug_threadname)
617 617
618LUAG_FUNC(set_thread_priority) 618LUAG_FUNC(set_thread_priority)
619{ 619{
620 lua_Integer const prio{ luaL_checkinteger(L_, 1) }; 620 lua_Integer const _prio{ luaL_checkinteger(L_, 1) };
621 // public Lanes API accepts a generic range -3/+3 621 // public Lanes API accepts a generic range -3/+3
622 // that will be remapped into the platform-specific scheduler priority scheme 622 // that will be remapped into the platform-specific scheduler priority scheme
623 // On some platforms, -3 is equivalent to -2 and +3 to +2 623 // On some platforms, -3 is equivalent to -2 and +3 to +2
624 if (prio < kThreadPrioMin || prio > kThreadPrioMax) { 624 if (_prio < kThreadPrioMin || _prio > kThreadPrioMax) {
625 raise_luaL_error(L_, "priority out of range: %d..+%d (%d)", kThreadPrioMin, kThreadPrioMax, prio); 625 raise_luaL_error(L_, "priority out of range: %d..+%d (%d)", kThreadPrioMin, kThreadPrioMax, _prio);
626 } 626 }
627 THREAD_SET_PRIORITY(static_cast<int>(prio), universe_get(L_)->sudo); 627 THREAD_SET_PRIORITY(static_cast<int>(_prio), universe_get(L_)->sudo);
628 return 0; 628 return 0;
629} 629}
630 630
@@ -632,11 +632,11 @@ LUAG_FUNC(set_thread_priority)
632 632
633LUAG_FUNC(set_thread_affinity) 633LUAG_FUNC(set_thread_affinity)
634{ 634{
635 lua_Integer const affinity{ luaL_checkinteger(L_, 1) }; 635 lua_Integer const _affinity{ luaL_checkinteger(L_, 1) };
636 if (affinity <= 0) { 636 if (_affinity <= 0) {
637 raise_luaL_error(L_, "invalid affinity (%d)", affinity); 637 raise_luaL_error(L_, "invalid affinity (%d)", _affinity);
638 } 638 }
639 THREAD_SET_AFFINITY(static_cast<unsigned int>(affinity)); 639 THREAD_SET_AFFINITY(static_cast<unsigned int>(_affinity));
640 return 0; 640 return 0;
641} 641}
642 642
@@ -662,9 +662,9 @@ static struct errcode_name s_errcodes[] = {
662}; 662};
663static char const* get_errcode_name(int _code) 663static char const* get_errcode_name(int _code)
664{ 664{
665 for (int i{ 0 }; i < 7; ++i) { 665 for (errcode_name const& _entry : s_errcodes) {
666 if (s_errcodes[i].code == _code) { 666 if (_entry.code == _code) {
667 return s_errcodes[i].name; 667 return _entry.name;
668 } 668 }
669 } 669 }
670 return "<nullptr>"; 670 return "<nullptr>";
@@ -675,61 +675,61 @@ static char const* get_errcode_name(int _code)
675 675
676static void lane_main(Lane* lane_) 676static void lane_main(Lane* lane_)
677{ 677{
678 lua_State* const L{ lane_->L }; 678 lua_State* const _L{ lane_->L };
679 // wait until the launching thread has finished preparing L 679 // wait until the launching thread has finished preparing L
680 lane_->ready.wait(); 680 lane_->ready.wait();
681 int rc{ LUA_ERRRUN }; 681 int _rc{ LUA_ERRRUN };
682 if (lane_->status == Lane::Pending) { // nothing wrong happened during preparation, we can work 682 if (lane_->status == Lane::Pending) { // nothing wrong happened during preparation, we can work
683 // At this point, the lane function and arguments are on the stack 683 // At this point, the lane function and arguments are on the stack
684 int const nargs{ lua_gettop(L) - 1 }; 684 int const nargs{ lua_gettop(_L) - 1 };
685 DEBUGSPEW_CODE(Universe* U = universe_get(L)); 685 DEBUGSPEW_CODE(Universe* U = universe_get(_L));
686 lane_->status = Lane::Running; // Pending -> Running 686 lane_->status = Lane::Running; // Pending -> Running
687 687
688 // Tie "set_finalizer()" to the state 688 // Tie "set_finalizer()" to the state
689 lua_pushcfunction(L, LG_set_finalizer); 689 lua_pushcfunction(_L, LG_set_finalizer);
690 populate_func_lookup_table(L, -1, "set_finalizer"); 690 populate_func_lookup_table(_L, -1, "set_finalizer");
691 lua_setglobal(L, "set_finalizer"); 691 lua_setglobal(_L, "set_finalizer");
692 692
693 // Tie "set_debug_threadname()" to the state 693 // Tie "set_debug_threadname()" to the state
694 // But don't register it in the lookup database because of the Lane pointer upvalue 694 // But don't register it in the lookup database because of the Lane pointer upvalue
695 lua_pushlightuserdata(L, lane_); 695 lua_pushlightuserdata(_L, lane_);
696 lua_pushcclosure(L, LG_set_debug_threadname, 1); 696 lua_pushcclosure(_L, LG_set_debug_threadname, 1);
697 lua_setglobal(L, "set_debug_threadname"); 697 lua_setglobal(_L, "set_debug_threadname");
698 698
699 // Tie "cancel_test()" to the state 699 // Tie "cancel_test()" to the state
700 lua_pushcfunction(L, LG_cancel_test); 700 lua_pushcfunction(_L, LG_cancel_test);
701 populate_func_lookup_table(L, -1, "cancel_test"); 701 populate_func_lookup_table(_L, -1, "cancel_test");
702 lua_setglobal(L, "cancel_test"); 702 lua_setglobal(_L, "cancel_test");
703 703
704 // this could be done in lane_new before the lane body function is pushed on the stack to avoid unnecessary stack slot shifting around 704 // this could be done in lane_new before the lane body function is pushed on the stack to avoid unnecessary stack slot shifting around
705#if ERROR_FULL_STACK 705#if ERROR_FULL_STACK
706 // Tie "set_error_reporting()" to the state 706 // Tie "set_error_reporting()" to the state
707 lua_pushcfunction(L, LG_set_error_reporting); 707 lua_pushcfunction(_L, LG_set_error_reporting);
708 populate_func_lookup_table(L, -1, "set_error_reporting"); 708 populate_func_lookup_table(_L, -1, "set_error_reporting");
709 lua_setglobal(L, "set_error_reporting"); 709 lua_setglobal(_L, "set_error_reporting");
710 710
711 STACK_GROW(L, 1); 711 STACK_GROW(_L, 1);
712 lua_pushcfunction(L, lane_error); // L: func args handler 712 lua_pushcfunction(_L, lane_error); // L: func args handler
713 lua_insert(L, 1); // L: handler func args 713 lua_insert(_L, 1); // L: handler func args
714#endif // L: ERROR_FULL_STACK 714#endif // L: ERROR_FULL_STACK
715 715
716 rc = lua_pcall(L, nargs, LUA_MULTRET, ERROR_FULL_STACK); // L: retvals|err 716 _rc = lua_pcall(_L, nargs, LUA_MULTRET, ERROR_FULL_STACK); // L: retvals|err
717 717
718#if ERROR_FULL_STACK 718#if ERROR_FULL_STACK
719 lua_remove(L, 1); // L: retvals|error 719 lua_remove(_L, 1); // L: retvals|error
720#endif // ERROR_FULL_STACK 720#endif // ERROR_FULL_STACK
721 721
722 // in case of error and if it exists, fetch stack trace from registry and push it 722 // in case of error and if it exists, fetch stack trace from registry and push it
723 push_stack_trace(L, rc, 1); // L: retvals|error [trace] 723 push_stack_trace(_L, _rc, 1); // L: retvals|error [trace]
724 724
725 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "Lane %p body: %s (%s)\n" INDENT_END(U), L, get_errcode_name(rc), kCancelError.equals(L, 1) ? "cancelled" : lua_typename(L, lua_type(L, 1)))); 725 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "Lane %p body: %s (%s)\n" INDENT_END(U), _L, get_errcode_name(_rc), kCancelError.equals(_L, 1) ? "cancelled" : lua_typename(_L, lua_type(_L, 1))));
726 // Call finalizers, if the script has set them up. 726 // Call finalizers, if the script has set them up.
727 // 727 //
728 int rc2{ run_finalizers(L, rc) }; 728 int _rc2{ run_finalizers(_L, _rc) };
729 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "Lane %p finalizer: %s\n" INDENT_END(U), L, get_errcode_name(rc2))); 729 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "Lane %p finalizer: %s\n" INDENT_END(U), _L, get_errcode_name(_rc2)));
730 if (rc2 != LUA_OK) { // Error within a finalizer! 730 if (_rc2 != LUA_OK) { // Error within a finalizer!
731 // the finalizer generated an error, and left its own error message [and stack trace] on the stack 731 // the finalizer generated an error, and left its own error message [and stack trace] on the stack
732 rc = rc2; // we're overruling the earlier script error or normal return 732 _rc = _rc2; // we're overruling the earlier script error or normal return
733 } 733 }
734 lane_->waiting_on = nullptr; // just in case 734 lane_->waiting_on = nullptr; // just in case
735 if (selfdestruct_remove(lane_)) { // check and remove (under lock!) 735 if (selfdestruct_remove(lane_)) { // check and remove (under lock!)
@@ -750,12 +750,12 @@ static void lane_main(Lane* lane_)
750 if (lane_) { 750 if (lane_) {
751 // leave results (1..top) or error message + stack trace (1..2) on the stack - master will copy them 751 // leave results (1..top) or error message + stack trace (1..2) on the stack - master will copy them
752 752
753 Lane::Status const st = (rc == LUA_OK) ? Lane::Done : kCancelError.equals(L, 1) ? Lane::Cancelled : Lane::Error; 753 Lane::Status const _st = (_rc == LUA_OK) ? Lane::Done : kCancelError.equals(_L, 1) ? Lane::Cancelled : Lane::Error;
754 754
755 { 755 {
756 // 'doneMutex' protects the -> Done|Error|Cancelled state change 756 // 'doneMutex' protects the -> Done|Error|Cancelled state change
757 std::lock_guard lock{ lane_->doneMutex }; 757 std::lock_guard lock{ lane_->doneMutex };
758 lane_->status = st; 758 lane_->status = _st;
759 lane_->doneCondVar.notify_one(); // wake up master (while 'lane_->doneMutex' is on) 759 lane_->doneCondVar.notify_one(); // wake up master (while 'lane_->doneMutex' is on)
760 } 760 }
761 } 761 }
@@ -769,17 +769,17 @@ static void lane_main(Lane* lane_)
769// upvalue[1]: _G.require 769// upvalue[1]: _G.require
770LUAG_FUNC(require) 770LUAG_FUNC(require)
771{ 771{
772 char const* name = lua_tostring(L_, 1); // L_: "name" ... 772 char const* _name{ lua_tostring(L_, 1) }; // L_: "name" ...
773 int const nargs{ lua_gettop(L_) }; 773 int const _nargs{ lua_gettop(L_) };
774 DEBUGSPEW_CODE(Universe* U = universe_get(L_)); 774 DEBUGSPEW_CODE(Universe * _U{ universe_get(L_) });
775 STACK_CHECK_START_REL(L_, 0); 775 STACK_CHECK_START_REL(L_, 0);
776 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lanes.require %s BEGIN\n" INDENT_END(U), name)); 776 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lanes.require %s BEGIN\n" INDENT_END(_U), _name));
777 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ U }); 777 DEBUGSPEW_CODE(DebugSpewIndentScope _scope{ _U });
778 lua_pushvalue(L_, lua_upvalueindex(1)); // L_: "name" ... require 778 lua_pushvalue(L_, lua_upvalueindex(1)); // L_: "name" ... require
779 lua_insert(L_, 1); // L_: require "name" ... 779 lua_insert(L_, 1); // L_: require "name" ...
780 lua_call(L_, nargs, 1); // L_: module 780 lua_call(L_, _nargs, 1); // L_: module
781 populate_func_lookup_table(L_, -1, name); 781 populate_func_lookup_table(L_, -1, _name);
782 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lanes.require %s END\n" INDENT_END(U), name)); 782 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lanes.require %s END\n" INDENT_END(_U), _name));
783 STACK_CHECK(L_, 0); 783 STACK_CHECK(L_, 0);
784 return 1; 784 return 1;
785} 785}
@@ -791,17 +791,17 @@ LUAG_FUNC(require)
791// lanes.register( "modname", module) 791// lanes.register( "modname", module)
792LUAG_FUNC(register) 792LUAG_FUNC(register)
793{ 793{
794 char const* name = luaL_checkstring(L_, 1); 794 char const* _name{ luaL_checkstring(L_, 1) };
795 LuaType const mod_type{ lua_type_as_enum(L_, 2) }; 795 LuaType const _mod_type{ lua_type_as_enum(L_, 2) };
796 // ignore extra parameters, just in case 796 // ignore extra parameters, just in case
797 lua_settop(L_, 2); 797 lua_settop(L_, 2);
798 luaL_argcheck(L_, (mod_type == LuaType::TABLE) || (mod_type == LuaType::FUNCTION), 2, "unexpected module type"); 798 luaL_argcheck(L_, (_mod_type == LuaType::TABLE) || (_mod_type == LuaType::FUNCTION), 2, "unexpected module type");
799 DEBUGSPEW_CODE(Universe* U = universe_get(L_)); 799 DEBUGSPEW_CODE(Universe* U = universe_get(L_));
800 STACK_CHECK_START_REL(L_, 0); // "name" mod_table 800 STACK_CHECK_START_REL(L_, 0); // "name" mod_table
801 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lanes.register %s BEGIN\n" INDENT_END(U), name)); 801 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lanes.register %s BEGIN\n" INDENT_END(U), _name));
802 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ U }); 802 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ U });
803 populate_func_lookup_table(L_, -1, name); 803 populate_func_lookup_table(L_, -1, _name);
804 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lanes.register %s END\n" INDENT_END(U), name)); 804 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lanes.register %s END\n" INDENT_END(U), _name));
805 STACK_CHECK(L_, 0); 805 STACK_CHECK(L_, 0);
806 return 0; 806 return 0;
807} 807}
@@ -827,37 +827,37 @@ static constexpr UniqueKey kLaneGC{ 0x5D6122141727F960ull };
827LUAG_FUNC(lane_new) 827LUAG_FUNC(lane_new)
828{ 828{
829 // first 8 args: func libs priority globals package required gc_cb name 829 // first 8 args: func libs priority globals package required gc_cb name
830 char const* const libs_str{ lua_tostring(L_, 2) }; 830 char const* const _libs_str{ lua_tostring(L_, 2) };
831 bool const have_priority{ !lua_isnoneornil(L_, 3) }; 831 bool const _have_priority{ !lua_isnoneornil(L_, 3) };
832 int const priority{ have_priority ? static_cast<int>(lua_tointeger(L_, 3)) : kThreadPrioDefault }; 832 int const _priority{ _have_priority ? static_cast<int>(lua_tointeger(L_, 3)) : kThreadPrioDefault };
833 int const globals_idx{ lua_isnoneornil(L_, 4) ? 0 : 4 }; 833 int const _globals_idx{ lua_isnoneornil(L_, 4) ? 0 : 4 };
834 int const package_idx{ lua_isnoneornil(L_, 5) ? 0 : 5 }; 834 int const _package_idx{ lua_isnoneornil(L_, 5) ? 0 : 5 };
835 int const required_idx{ lua_isnoneornil(L_, 6) ? 0 : 6 }; 835 int const _required_idx{ lua_isnoneornil(L_, 6) ? 0 : 6 };
836 int const gc_cb_idx{ lua_isnoneornil(L_, 7) ? 0 : 7 }; 836 int const _gc_cb_idx{ lua_isnoneornil(L_, 7) ? 0 : 7 };
837 int const name_idx{ lua_isnoneornil(L_, 8) ? 0 : 8 }; 837 int const _name_idx{ lua_isnoneornil(L_, 8) ? 0 : 8 };
838 838
839 static constexpr int kFixedArgsIdx{ 8 }; 839 static constexpr int kFixedArgsIdx{ 8 };
840 int const nargs{ lua_gettop(L_) - kFixedArgsIdx }; 840 int const _nargs{ lua_gettop(L_) - kFixedArgsIdx };
841 Universe* const U{ universe_get(L_) }; 841 Universe* const _U{ universe_get(L_) };
842 LUA_ASSERT(L_, nargs >= 0); 842 LUA_ASSERT(L_, _nargs >= 0);
843 843
844 // public Lanes API accepts a generic range -3/+3 844 // public Lanes API accepts a generic range -3/+3
845 // that will be remapped into the platform-specific scheduler priority scheme 845 // that will be remapped into the platform-specific scheduler priority scheme
846 // On some platforms, -3 is equivalent to -2 and +3 to +2 846 // On some platforms, -3 is equivalent to -2 and +3 to +2
847 if (have_priority && (priority < kThreadPrioMin || priority > kThreadPrioMax)) { 847 if (_have_priority && (_priority < kThreadPrioMin || _priority > kThreadPrioMax)) {
848 raise_luaL_error(L_, "Priority out of range: %d..+%d (%d)", kThreadPrioMin, kThreadPrioMax, priority); 848 raise_luaL_error(L_, "Priority out of range: %d..+%d (%d)", kThreadPrioMin, kThreadPrioMax, _priority);
849 } 849 }
850 850
851 /* --- Create and prepare the sub state --- */ 851 /* --- Create and prepare the sub state --- */
852 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: setup\n" INDENT_END(U))); 852 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: setup\n" INDENT_END(_U)));
853 853
854 // populate with selected libraries at the same time. 854 // populate with selected libraries at the same time.
855 lua_State* const L2{ luaG_newstate(U, SourceState{ L_ }, libs_str) }; // L_: [8 args] ... L2: 855 lua_State* const _L2{ luaG_newstate(_U, SourceState{ L_ }, _libs_str) }; // L_: [8 args] ... L2:
856 STACK_CHECK_START_REL(L2, 0); 856 STACK_CHECK_START_REL(_L2, 0);
857 857
858 // 'lane' is allocated from heap, not Lua, since its life span may surpass the handle's (if free running thread) 858 // 'lane' is allocated from heap, not Lua, since its life span may surpass the handle's (if free running thread)
859 Lane* const lane{ new (U) Lane{ U, L2 } }; 859 Lane* const _lane{ new (_U) Lane{ _U, _L2 } };
860 if (lane == nullptr) { 860 if (_lane == nullptr) {
861 raise_luaL_error(L_, "could not create lane: out of memory"); 861 raise_luaL_error(L_, "could not create lane: out of memory");
862 } 862 }
863 863
@@ -959,135 +959,135 @@ LUAG_FUNC(lane_new)
959 m_lane->ready.count_down(); 959 m_lane->ready.count_down();
960 m_lane = nullptr; 960 m_lane = nullptr;
961 } 961 }
962 } onExit{ L_, lane, gc_cb_idx, name_idx DEBUGSPEW_COMMA_PARAM(U) }; 962 } onExit{ L_, _lane, _gc_cb_idx, _name_idx DEBUGSPEW_COMMA_PARAM(_U) };
963 // launch the thread early, it will sync with a std::latch to parallelize OS thread warmup and L2 preparation 963 // launch the thread early, it will sync with a std::latch to parallelize OS thread warmup and L2 preparation
964 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: launching thread\n" INDENT_END(U))); 964 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: launching thread\n" INDENT_END(_U)));
965 lane->startThread(priority); 965 _lane->startThread(_priority);
966 966
967 STACK_GROW(L2, nargs + 3); 967 STACK_GROW(_L2, _nargs + 3);
968 STACK_GROW(L_, 3); 968 STACK_GROW(L_, 3);
969 STACK_CHECK_START_REL(L_, 0); 969 STACK_CHECK_START_REL(L_, 0);
970 970
971 // package 971 // package
972 if (package_idx != 0) { 972 if (_package_idx != 0) {
973 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: update 'package'\n" INDENT_END(U))); 973 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: update 'package'\n" INDENT_END(_U)));
974 // when copying with mode LookupMode::LaneBody, should raise an error in case of problem, not leave it one the stack 974 // when copying with mode LookupMode::LaneBody, should raise an error in case of problem, not leave it one the stack
975 InterCopyContext c{ U, DestState{ L2 }, SourceState{ L_ }, {}, SourceIndex{ package_idx }, {}, {}, {} }; 975 InterCopyContext c{ _U, DestState{ _L2 }, SourceState{ L_ }, {}, SourceIndex{ _package_idx }, {}, {}, {} };
976 [[maybe_unused]] InterCopyResult const ret{ c.inter_copy_package() }; 976 [[maybe_unused]] InterCopyResult const ret{ c.inter_copy_package() };
977 LUA_ASSERT(L_, ret == InterCopyResult::Success); // either all went well, or we should not even get here 977 LUA_ASSERT(L_, ret == InterCopyResult::Success); // either all went well, or we should not even get here
978 } 978 }
979 979
980 // modules to require in the target lane *before* the function is transfered! 980 // modules to require in the target lane *before* the function is transfered!
981 if (required_idx != 0) { 981 if (_required_idx != 0) {
982 int nbRequired = 1; 982 int _nbRequired{ 1 };
983 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: require 'required' list\n" INDENT_END(U))); 983 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: require 'required' list\n" INDENT_END(_U)));
984 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ U }); 984 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ _U });
985 // should not happen, was checked in lanes.lua before calling lane_new() 985 // should not happen, was checked in lanes.lua before calling lane_new()
986 if (lua_type(L_, required_idx) != LUA_TTABLE) { 986 if (lua_type(L_, _required_idx) != LUA_TTABLE) {
987 raise_luaL_error(L_, "expected required module list as a table, got %s", luaL_typename(L_, required_idx)); 987 raise_luaL_error(L_, "expected required module list as a table, got %s", luaL_typename(L_, _required_idx));
988 } 988 }
989 989
990 lua_pushnil(L_); // L_: [8 args] args... nil L2: 990 lua_pushnil(L_); // L_: [8 args] args... nil L2:
991 while (lua_next(L_, required_idx) != 0) { // L_: [8 args] args... n "modname" L2: 991 while (lua_next(L_, _required_idx) != 0) { // L_: [8 args] args... n "modname" L2:
992 if (lua_type(L_, -1) != LUA_TSTRING || lua_type(L_, -2) != LUA_TNUMBER || lua_tonumber(L_, -2) != nbRequired) { 992 if (lua_type(L_, -1) != LUA_TSTRING || lua_type(L_, -2) != LUA_TNUMBER || lua_tonumber(L_, -2) != _nbRequired) {
993 raise_luaL_error(L_, "required module list should be a list of strings"); 993 raise_luaL_error(L_, "required module list should be a list of strings");
994 } else { 994 } else {
995 // require the module in the target state, and populate the lookup table there too 995 // require the module in the target state, and populate the lookup table there too
996 size_t len; 996 size_t len;
997 char const* name = lua_tolstring(L_, -1, &len); 997 char const* name = lua_tolstring(L_, -1, &len);
998 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: require '%s'\n" INDENT_END(U), name)); 998 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: require '%s'\n" INDENT_END(_U), name));
999 999
1000 // require the module in the target lane 1000 // require the module in the target lane
1001 lua_getglobal(L2, "require"); // L_: [8 args] args... n "modname" L2: require()? 1001 lua_getglobal(_L2, "require"); // L_: [8 args] args... n "modname" L2: require()?
1002 if (lua_isnil(L2, -1)) { 1002 if (lua_isnil(_L2, -1)) {
1003 lua_pop(L2, 1); // L_: [8 args] args... n "modname" L2: 1003 lua_pop(_L2, 1); // L_: [8 args] args... n "modname" L2:
1004 raise_luaL_error(L_, "cannot pre-require modules without loading 'package' library first"); 1004 raise_luaL_error(L_, "cannot pre-require modules without loading 'package' library first");
1005 } else { 1005 } else {
1006 lua_pushlstring(L2, name, len); // L_: [8 args] args... n "modname" L2: require() name 1006 lua_pushlstring(_L2, name, len); // L_: [8 args] args... n "modname" L2: require() name
1007 if (lua_pcall(L2, 1, 1, 0) != LUA_OK) { // L_: [8 args] args... n "modname" L2: ret/errcode 1007 if (lua_pcall(_L2, 1, 1, 0) != LUA_OK) { // L_: [8 args] args... n "modname" L2: ret/errcode
1008 // propagate error to main state if any 1008 // propagate error to main state if any
1009 InterCopyContext c{ U, DestState{ L_ }, SourceState{ L2 }, {}, {}, {}, {}, {} }; 1009 InterCopyContext _c{ _U, DestState{ L_ }, SourceState{ _L2 }, {}, {}, {}, {}, {} };
1010 std::ignore = c.inter_move(1); // L_: [8 args] args... n "modname" error L2: 1010 std::ignore = _c.inter_move(1); // L_: [8 args] args... n "modname" error L2:
1011 raise_lua_error(L_); 1011 raise_lua_error(L_);
1012 } 1012 }
1013 // here the module was successfully required // L_: [8 args] args... n "modname" L2: ret 1013 // here the module was successfully required // L_: [8 args] args... n "modname" L2: ret
1014 // after requiring the module, register the functions it exported in our name<->function database 1014 // after requiring the module, register the functions it exported in our name<->function database
1015 populate_func_lookup_table(L2, -1, name); 1015 populate_func_lookup_table(_L2, -1, name);
1016 lua_pop(L2, 1); // L_: [8 args] args... n "modname" L2: 1016 lua_pop(_L2, 1); // L_: [8 args] args... n "modname" L2:
1017 } 1017 }
1018 } 1018 }
1019 lua_pop(L_, 1); // L_: func libs priority globals package required gc_cb [... args ...] n 1019 lua_pop(L_, 1); // L_: func libs priority globals package required gc_cb [... args ...] n
1020 ++nbRequired; 1020 ++_nbRequired;
1021 } // L_: [8 args] args... 1021 } // L_: [8 args] args...
1022 } 1022 }
1023 STACK_CHECK(L_, 0); 1023 STACK_CHECK(L_, 0);
1024 STACK_CHECK(L2, 0); // L_: [8 args] args... L2: 1024 STACK_CHECK(_L2, 0); // L_: [8 args] args... L2:
1025 1025
1026 // Appending the specified globals to the global environment 1026 // Appending the specified globals to the global environment
1027 // *after* stdlibs have been loaded and modules required, in case we transfer references to native functions they exposed... 1027 // *after* stdlibs have been loaded and modules required, in case we transfer references to native functions they exposed...
1028 // 1028 //
1029 if (globals_idx != 0) { 1029 if (_globals_idx != 0) {
1030 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: transfer globals\n" INDENT_END(U))); 1030 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: transfer globals\n" INDENT_END(_U)));
1031 if (!lua_istable(L_, globals_idx)) { 1031 if (!lua_istable(L_, _globals_idx)) {
1032 raise_luaL_error(L_, "Expected table, got %s", luaL_typename(L_, globals_idx)); 1032 raise_luaL_error(L_, "Expected table, got %s", luaL_typename(L_, _globals_idx));
1033 } 1033 }
1034 1034
1035 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ U }); 1035 DEBUGSPEW_CODE(DebugSpewIndentScope _scope{ _U });
1036 lua_pushnil(L_); // L_: [8 args] args... nil L2: 1036 lua_pushnil(L_); // L_: [8 args] args... nil L2:
1037 // Lua 5.2 wants us to push the globals table on the stack 1037 // Lua 5.2 wants us to push the globals table on the stack
1038 InterCopyContext c{ U, DestState{ L2 }, SourceState{ L_ }, {}, {}, {}, {}, {} }; 1038 InterCopyContext _c{ _U, DestState{ _L2 }, SourceState{ L_ }, {}, {}, {}, {}, {} };
1039 lua_pushglobaltable(L2); // L_: [8 args] args... nil L2: _G 1039 lua_pushglobaltable(_L2); // L_: [8 args] args... nil L2: _G
1040 while (lua_next(L_, globals_idx)) { // L_: [8 args] args... k v L2: _G 1040 while (lua_next(L_, _globals_idx)) { // L_: [8 args] args... k v L2: _G
1041 std::ignore = c.inter_copy(2); // L_: [8 args] args... k v L2: _G k v 1041 std::ignore = _c.inter_copy(2); // L_: [8 args] args... k v L2: _G k v
1042 // assign it in L2's globals table 1042 // assign it in L2's globals table
1043 lua_rawset(L2, -3); // L_: [8 args] args... k v L2: _G 1043 lua_rawset(_L2, -3); // L_: [8 args] args... k v L2: _G
1044 lua_pop(L_, 1); // L_: [8 args] args... k 1044 lua_pop(L_, 1); // L_: [8 args] args... k
1045 } // L_: [8 args] args... 1045 } // L_: [8 args] args...
1046 lua_pop(L2, 1); // L_: [8 args] args... L2: 1046 lua_pop(_L2, 1); // L_: [8 args] args... L2:
1047 } 1047 }
1048 STACK_CHECK(L_, 0); 1048 STACK_CHECK(L_, 0);
1049 STACK_CHECK(L2, 0); 1049 STACK_CHECK(_L2, 0);
1050 1050
1051 // Lane main function 1051 // Lane main function
1052 LuaType const func_type{ lua_type_as_enum(L_, 1) }; 1052 LuaType const _func_type{ lua_type_as_enum(L_, 1) };
1053 if (func_type == LuaType::FUNCTION) { 1053 if (_func_type == LuaType::FUNCTION) {
1054 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: transfer lane body\n" INDENT_END(U))); 1054 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: transfer lane body\n" INDENT_END(_U)));
1055 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ U }); 1055 DEBUGSPEW_CODE(DebugSpewIndentScope _scope{ _U });
1056 lua_pushvalue(L_, 1); // L_: [8 args] args... func L2: 1056 lua_pushvalue(L_, 1); // L_: [8 args] args... func L2:
1057 InterCopyContext c{ U, DestState{ L2 }, SourceState{ L_ }, {}, {}, {}, {}, {} }; 1057 InterCopyContext _c{ _U, DestState{ _L2 }, SourceState{ L_ }, {}, {}, {}, {}, {} };
1058 InterCopyResult const res{ c.inter_move(1) }; // L_: [8 args] args... L2: func 1058 InterCopyResult const _res{ _c.inter_move(1) }; // L_: [8 args] args... L2: func
1059 if (res != InterCopyResult::Success) { 1059 if (_res != InterCopyResult::Success) {
1060 raise_luaL_error(L_, "tried to copy unsupported types"); 1060 raise_luaL_error(L_, "tried to copy unsupported types");
1061 } 1061 }
1062 } else if (func_type == LuaType::STRING) { 1062 } else if (_func_type == LuaType::STRING) {
1063 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: compile lane body\n" INDENT_END(U))); 1063 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: compile lane body\n" INDENT_END(_U)));
1064 // compile the string 1064 // compile the string
1065 if (luaL_loadstring(L2, lua_tostring(L_, 1)) != 0) { // L_: [8 args] args... L2: func 1065 if (luaL_loadstring(_L2, lua_tostring(L_, 1)) != 0) { // L_: [8 args] args... L2: func
1066 raise_luaL_error(L_, "error when parsing lane function code"); 1066 raise_luaL_error(L_, "error when parsing lane function code");
1067 } 1067 }
1068 } else { 1068 } else {
1069 raise_luaL_error(L_, "Expected function, got %s", lua_typename(L_, func_type)); 1069 raise_luaL_error(L_, "Expected function, got %s", lua_typename(L_, _func_type));
1070 } 1070 }
1071 STACK_CHECK(L_, 0); 1071 STACK_CHECK(L_, 0);
1072 STACK_CHECK(L2, 1); 1072 STACK_CHECK(_L2, 1);
1073 LUA_ASSERT(L_, lua_isfunction(L2, 1)); 1073 LUA_ASSERT(L_, lua_isfunction(_L2, 1));
1074 1074
1075 // revive arguments 1075 // revive arguments
1076 if (nargs > 0) { 1076 if (_nargs > 0) {
1077 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: transfer lane arguments\n" INDENT_END(U))); 1077 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "lane_new: transfer lane arguments\n" INDENT_END(_U)));
1078 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ U }); 1078 DEBUGSPEW_CODE(DebugSpewIndentScope _scope{ _U });
1079 InterCopyContext c{ U, DestState{ L2 }, SourceState{ L_ }, {}, {}, {}, {}, {} }; 1079 InterCopyContext _c{ _U, DestState{ _L2 }, SourceState{ L_ }, {}, {}, {}, {}, {} };
1080 InterCopyResult const res{ c.inter_move(nargs) }; // L_: [8 args] L2: func args... 1080 InterCopyResult const res{ _c.inter_move(_nargs) }; // L_: [8 args] L2: func args...
1081 if (res != InterCopyResult::Success) { 1081 if (res != InterCopyResult::Success) {
1082 raise_luaL_error(L_, "tried to copy unsupported types"); 1082 raise_luaL_error(L_, "tried to copy unsupported types");
1083 } 1083 }
1084 } 1084 }
1085 STACK_CHECK(L_, -nargs); 1085 STACK_CHECK(L_, -_nargs);
1086 LUA_ASSERT(L_, lua_gettop(L_) == kFixedArgsIdx); 1086 LUA_ASSERT(L_, lua_gettop(L_) == kFixedArgsIdx);
1087 1087
1088 // Store 'lane' in the lane's registry, for 'cancel_test()' (we do cancel tests at pending send/receive). 1088 // Store 'lane' in the lane's registry, for 'cancel_test()' (we do cancel tests at pending send/receive).
1089 kLanePointerRegKey.setValue(L2, [lane](lua_State* L_) { lua_pushlightuserdata(L_, lane); }); // L_: [8 args] L2: func args... 1089 kLanePointerRegKey.setValue(_L2, [lane = _lane](lua_State* L_) { lua_pushlightuserdata(L_, lane); });// L_: [8 args] L2: func args...
1090 STACK_CHECK(L2, 1 + nargs); 1090 STACK_CHECK(_L2, 1 + _nargs);
1091 1091
1092 STACK_CHECK_RESET_REL(L_, 0); 1092 STACK_CHECK_RESET_REL(L_, 0);
1093 // all went well, the lane's thread can start working 1093 // all went well, the lane's thread can start working
@@ -1112,8 +1112,8 @@ LUAG_FUNC(lane_new)
1112// 1112//
1113[[nodiscard]] static int lane_gc(lua_State* L_) 1113[[nodiscard]] static int lane_gc(lua_State* L_)
1114{ 1114{
1115 bool have_gc_cb{ false }; 1115 bool _have_gc_cb{ false };
1116 Lane* const lane{ ToLane(L_, 1) }; // L_: ud 1116 Lane* const _lane{ ToLane(L_, 1) }; // L_: ud
1117 1117
1118 // if there a gc callback? 1118 // if there a gc callback?
1119 lua_getiuservalue(L_, 1, 1); // L_: ud uservalue 1119 lua_getiuservalue(L_, 1, 1); // L_: ud uservalue
@@ -1121,35 +1121,35 @@ LUAG_FUNC(lane_new)
1121 lua_rawget(L_, -2); // L_: ud uservalue gc_cb|nil 1121 lua_rawget(L_, -2); // L_: ud uservalue gc_cb|nil
1122 if (!lua_isnil(L_, -1)) { 1122 if (!lua_isnil(L_, -1)) {
1123 lua_remove(L_, -2); // L_: ud gc_cb|nil 1123 lua_remove(L_, -2); // L_: ud gc_cb|nil
1124 lua_pushstring(L_, lane->debugName); // L_: ud gc_cb name 1124 lua_pushstring(L_, _lane->debugName); // L_: ud gc_cb name
1125 have_gc_cb = true; 1125 _have_gc_cb = true;
1126 } else { 1126 } else {
1127 lua_pop(L_, 2); // L_: ud 1127 lua_pop(L_, 2); // L_: ud
1128 } 1128 }
1129 1129
1130 // We can read 'lane->status' without locks, but not wait for it 1130 // We can read 'lane->status' without locks, but not wait for it
1131 if (lane->status < Lane::Done) { 1131 if (_lane->status < Lane::Done) {
1132 // still running: will have to be cleaned up later 1132 // still running: will have to be cleaned up later
1133 selfdestruct_add(lane); 1133 selfdestruct_add(_lane);
1134 assert(lane->selfdestruct_next); 1134 assert(_lane->selfdestruct_next);
1135 if (have_gc_cb) { 1135 if (_have_gc_cb) {
1136 lua_pushliteral(L_, "selfdestruct"); // L_: ud gc_cb name status 1136 lua_pushliteral(L_, "selfdestruct"); // L_: ud gc_cb name status
1137 lua_call(L_, 2, 0); // L_: ud 1137 lua_call(L_, 2, 0); // L_: ud
1138 } 1138 }
1139 return 0; 1139 return 0;
1140 } else if (lane->L) { 1140 } else if (_lane->L) {
1141 // no longer accessing the Lua VM: we can close right now 1141 // no longer accessing the Lua VM: we can close right now
1142 lua_close(lane->L); 1142 lua_close(_lane->L);
1143 lane->L = nullptr; 1143 _lane->L = nullptr;
1144 // just in case, but s will be freed soon so... 1144 // just in case, but s will be freed soon so...
1145 lane->debugName = "<gc>"; 1145 _lane->debugName = "<gc>";
1146 } 1146 }
1147 1147
1148 // Clean up after a (finished) thread 1148 // Clean up after a (finished) thread
1149 delete lane; 1149 delete _lane;
1150 1150
1151 // do this after lane cleanup in case the callback triggers an error 1151 // do this after lane cleanup in case the callback triggers an error
1152 if (have_gc_cb) { 1152 if (_have_gc_cb) {
1153 lua_pushliteral(L_, "closed"); // L_: ud gc_cb name status 1153 lua_pushliteral(L_, "closed"); // L_: ud gc_cb name status
1154 lua_call(L_, 2, 0); // L_: ud 1154 lua_call(L_, 2, 0); // L_: ud
1155 } 1155 }
@@ -1170,7 +1170,7 @@ LUAG_FUNC(lane_new)
1170// 1170//
1171[[nodiscard]] static char const* thread_status_string(Lane::Status status_) 1171[[nodiscard]] static char const* thread_status_string(Lane::Status status_)
1172{ 1172{
1173 char const* const str{ 1173 char const* const _str{
1174 (status_ == Lane::Pending) ? "pending" : 1174 (status_ == Lane::Pending) ? "pending" :
1175 (status_ == Lane::Running) ? "running" : // like in 'co.status()' 1175 (status_ == Lane::Running) ? "running" : // like in 'co.status()'
1176 (status_ == Lane::Waiting) ? "waiting" : 1176 (status_ == Lane::Waiting) ? "waiting" :
@@ -1179,17 +1179,17 @@ LUAG_FUNC(lane_new)
1179 (status_ == Lane::Cancelled) ? "cancelled" : 1179 (status_ == Lane::Cancelled) ? "cancelled" :
1180 nullptr 1180 nullptr
1181 }; 1181 };
1182 return str; 1182 return _str;
1183} 1183}
1184 1184
1185// ################################################################################################# 1185// #################################################################################################
1186 1186
1187void Lane::pushThreadStatus(lua_State* L_) 1187void Lane::pushThreadStatus(lua_State* L_)
1188{ 1188{
1189 char const* const str{ thread_status_string(status) }; 1189 char const* const _str{ thread_status_string(status) };
1190 LUA_ASSERT(L_, str); 1190 LUA_ASSERT(L_, _str);
1191 1191
1192 lua_pushstring(L_, str); 1192 lua_pushstring(L_, _str);
1193} 1193}
1194 1194
1195// ################################################################################################# 1195// #################################################################################################
@@ -1204,14 +1204,14 @@ void Lane::pushThreadStatus(lua_State* L_)
1204// 1204//
1205LUAG_FUNC(thread_join) 1205LUAG_FUNC(thread_join)
1206{ 1206{
1207 Lane* const lane{ ToLane(L_, 1) }; 1207 Lane* const _lane{ ToLane(L_, 1) };
1208 lua_State* const L2{ lane->L }; 1208 lua_State* const _L2{ _lane->L };
1209 1209
1210 std::chrono::time_point<std::chrono::steady_clock> until{ std::chrono::time_point<std::chrono::steady_clock>::max() }; 1210 std::chrono::time_point<std::chrono::steady_clock> _until{ std::chrono::time_point<std::chrono::steady_clock>::max() };
1211 if (lua_type(L_, 2) == LUA_TNUMBER) { // we don't want to use lua_isnumber() because of autocoercion 1211 if (lua_type(L_, 2) == LUA_TNUMBER) { // we don't want to use lua_isnumber() because of autocoercion
1212 lua_Duration const duration{ lua_tonumber(L_, 2) }; 1212 lua_Duration const duration{ lua_tonumber(L_, 2) };
1213 if (duration.count() >= 0.0) { 1213 if (duration.count() >= 0.0) {
1214 until = std::chrono::steady_clock::now() + std::chrono::duration_cast<std::chrono::steady_clock::duration>(duration); 1214 _until = std::chrono::steady_clock::now() + std::chrono::duration_cast<std::chrono::steady_clock::duration>(duration);
1215 } else { 1215 } else {
1216 raise_luaL_argerror(L_, 2, "duration cannot be < 0"); 1216 raise_luaL_argerror(L_, 2, "duration cannot be < 0");
1217 } 1217 }
@@ -1220,9 +1220,9 @@ LUAG_FUNC(thread_join)
1220 raise_luaL_argerror(L_, 2, "incorrect duration type"); 1220 raise_luaL_argerror(L_, 2, "incorrect duration type");
1221 } 1221 }
1222 1222
1223 bool const done{ !lane->thread.joinable() || lane->waitForCompletion(until) }; 1223 bool const done{ !_lane->thread.joinable() || _lane->waitForCompletion(_until) };
1224 lua_settop(L_, 1); // L_: lane 1224 lua_settop(L_, 1); // L_: lane
1225 if (!done || !L2) { 1225 if (!done || !_L2) {
1226 lua_pushnil(L_); // L_: lane nil 1226 lua_pushnil(L_); // L_: lane nil
1227 lua_pushliteral(L_, "timeout"); // L_: lane nil "timeout" 1227 lua_pushliteral(L_, "timeout"); // L_: lane nil "timeout"
1228 return 2; 1228 return 2;
@@ -1231,51 +1231,51 @@ LUAG_FUNC(thread_join)
1231 STACK_CHECK_START_REL(L_, 0); // L_: lane 1231 STACK_CHECK_START_REL(L_, 0); // L_: lane
1232 // Thread is Done/Error/Cancelled; all ours now 1232 // Thread is Done/Error/Cancelled; all ours now
1233 1233
1234 int ret{ 0 }; 1234 int _ret{ 0 };
1235 // debugName is a pointer to string possibly interned in the lane's state, that no longer exists when the state is closed 1235 // debugName is a pointer to string possibly interned in the lane's state, that no longer exists when the state is closed
1236 // so store it in the userdata uservalue at a key that can't possibly collide 1236 // so store it in the userdata uservalue at a key that can't possibly collide
1237 lane->securizeDebugName(L_); 1237 _lane->securizeDebugName(L_);
1238 switch (lane->status) { 1238 switch (_lane->status) {
1239 case Lane::Done: 1239 case Lane::Done:
1240 { 1240 {
1241 int const n{ lua_gettop(L2) }; // whole L2 stack 1241 int const _n{ lua_gettop(_L2) }; // whole L2 stack
1242 if ( 1242 if (
1243 (n > 0) && 1243 (_n > 0) &&
1244 (InterCopyContext{ lane->U, DestState{ L_ }, SourceState{ L2 }, {}, {}, {}, {}, {} }.inter_move(n) != InterCopyResult::Success) 1244 (InterCopyContext{ _lane->U, DestState{ L_ }, SourceState{ _L2 }, {}, {}, {}, {}, {} }.inter_move(_n) != InterCopyResult::Success)
1245 ) { // L_: lane results L2: 1245 ) { // L_: lane results L2:
1246 raise_luaL_error(L_, "tried to copy unsupported types"); 1246 raise_luaL_error(L_, "tried to copy unsupported types");
1247 } 1247 }
1248 ret = n; 1248 _ret = _n;
1249 } 1249 }
1250 break; 1250 break;
1251 1251
1252 case Lane::Error: 1252 case Lane::Error:
1253 { 1253 {
1254 int const n{ lua_gettop(L2) }; // L_: lane L2: "err" [trace] 1254 int const _n{ lua_gettop(_L2) }; // L_: lane L2: "err" [trace]
1255 STACK_GROW(L_, 3); 1255 STACK_GROW(L_, 3);
1256 lua_pushnil(L_); // L_: lane nil 1256 lua_pushnil(L_); // L_: lane nil
1257 // even when ERROR_FULL_STACK, if the error is not LUA_ERRRUN, the handler wasn't called, and we only have 1 error message on the stack ... 1257 // even when ERROR_FULL_STACK, if the error is not LUA_ERRRUN, the handler wasn't called, and we only have 1 error message on the stack ...
1258 InterCopyContext c{ lane->U, DestState{ L_ }, SourceState{ L2 }, {}, {}, {}, {}, {} }; 1258 InterCopyContext _c{ _lane->U, DestState{ L_ }, SourceState{ _L2 }, {}, {}, {}, {}, {} };
1259 if (c.inter_move(n) != InterCopyResult::Success) { // L_: lane nil "err" [trace] L2: 1259 if (_c.inter_move(_n) != InterCopyResult::Success) { // L_: lane nil "err" [trace] L2:
1260 raise_luaL_error(L_, "tried to copy unsupported types: %s", lua_tostring(L_, -n)); 1260 raise_luaL_error(L_, "tried to copy unsupported types: %s", lua_tostring(L_, -_n));
1261 } 1261 }
1262 ret = 1 + n; 1262 _ret = 1 + _n;
1263 } 1263 }
1264 break; 1264 break;
1265 1265
1266 case Lane::Cancelled: 1266 case Lane::Cancelled:
1267 ret = 0; 1267 _ret = 0;
1268 break; 1268 break;
1269 1269
1270 default: 1270 default:
1271 DEBUGSPEW_CODE(fprintf(stderr, "Status: %d\n", lane->status)); 1271 DEBUGSPEW_CODE(fprintf(stderr, "Status: %d\n", _lane->status));
1272 LUA_ASSERT(L_, false); 1272 LUA_ASSERT(L_, false);
1273 ret = 0; 1273 _ret = 0;
1274 } 1274 }
1275 lua_close(L2); 1275 lua_close(_L2);
1276 lane->L = nullptr; 1276 _lane->L = nullptr;
1277 STACK_CHECK(L_, ret); 1277 STACK_CHECK(L_, _ret);
1278 return ret; 1278 return _ret;
1279} 1279}
1280 1280
1281// ################################################################################################# 1281// #################################################################################################
@@ -1291,7 +1291,7 @@ LUAG_FUNC(thread_index)
1291{ 1291{
1292 static constexpr int kSelf{ 1 }; 1292 static constexpr int kSelf{ 1 };
1293 static constexpr int kKey{ 2 }; 1293 static constexpr int kKey{ 2 };
1294 Lane* const lane{ ToLane(L_, kSelf) }; 1294 Lane* const _lane{ ToLane(L_, kSelf) };
1295 LUA_ASSERT(L_, lua_gettop(L_) == 2); 1295 LUA_ASSERT(L_, lua_gettop(L_) == 2);
1296 1296
1297 STACK_GROW(L_, 8); // up to 8 positions are needed in case of error propagation 1297 STACK_GROW(L_, 8); // up to 8 positions are needed in case of error propagation
@@ -1314,9 +1314,9 @@ LUAG_FUNC(thread_index)
1314 // check if we already fetched the values from the thread or not 1314 // check if we already fetched the values from the thread or not
1315 lua_pushinteger(L_, 0); 1315 lua_pushinteger(L_, 0);
1316 lua_rawget(L_, kUsr); 1316 lua_rawget(L_, kUsr);
1317 bool const fetched{ !lua_isnil(L_, -1) }; 1317 bool const _fetched{ !lua_isnil(L_, -1) };
1318 lua_pop(L_, 1); // back to our 2 args + uservalue on the stack 1318 lua_pop(L_, 1); // back to our 2 args + uservalue on the stack
1319 if (!fetched) { 1319 if (!_fetched) {
1320 lua_pushinteger(L_, 0); 1320 lua_pushinteger(L_, 0);
1321 lua_pushboolean(L_, 1); 1321 lua_pushboolean(L_, 1);
1322 lua_rawset(L_, kUsr); 1322 lua_rawset(L_, kUsr);
@@ -1324,22 +1324,22 @@ LUAG_FUNC(thread_index)
1324 lua_pushcfunction(L_, LG_thread_join); 1324 lua_pushcfunction(L_, LG_thread_join);
1325 lua_pushvalue(L_, kSelf); 1325 lua_pushvalue(L_, kSelf);
1326 lua_call(L_, 1, LUA_MULTRET); // all return values are on the stack, at slots 4+ 1326 lua_call(L_, 1, LUA_MULTRET); // all return values are on the stack, at slots 4+
1327 switch (lane->status) { 1327 switch (_lane->status) {
1328 default: 1328 default:
1329 // this is an internal error, we probably never get here 1329 // this is an internal error, we probably never get here
1330 lua_settop(L_, 0); 1330 lua_settop(L_, 0);
1331 lua_pushliteral(L_, "Unexpected status: "); 1331 lua_pushliteral(L_, "Unexpected status: ");
1332 lua_pushstring(L_, thread_status_string(lane->status)); 1332 lua_pushstring(L_, thread_status_string(_lane->status));
1333 lua_concat(L_, 2); 1333 lua_concat(L_, 2);
1334 raise_lua_error(L_); 1334 raise_lua_error(L_);
1335 [[fallthrough]]; // fall through if we are killed, as we got nil, "killed" on the stack 1335 [[fallthrough]]; // fall through if we are killed, as we got nil, "killed" on the stack
1336 1336
1337 case Lane::Done: // got regular return values 1337 case Lane::Done: // got regular return values
1338 { 1338 {
1339 int const nvalues{ lua_gettop(L_) - 3 }; 1339 int const _nvalues{ lua_gettop(L_) - 3 };
1340 for (int i = nvalues; i > 0; --i) { 1340 for (int _i = _nvalues; _i > 0; --_i) {
1341 // pop the last element of the stack, to store it in the uservalue at its proper index 1341 // pop the last element of the stack, to store it in the uservalue at its proper index
1342 lua_rawseti(L_, kUsr, i); 1342 lua_rawseti(L_, kUsr, _i);
1343 } 1343 }
1344 } 1344 }
1345 break; 1345 break;
@@ -1361,8 +1361,8 @@ LUAG_FUNC(thread_index)
1361 } 1361 }
1362 } 1362 }
1363 lua_settop(L_, 3); // L_: self KEY ENV 1363 lua_settop(L_, 3); // L_: self KEY ENV
1364 int const key{ static_cast<int>(lua_tointeger(L_, kKey)) }; 1364 int const _key{ static_cast<int>(lua_tointeger(L_, kKey)) };
1365 if (key != -1) { 1365 if (_key != -1) {
1366 lua_pushnumber(L_, -1); // L_: self KEY ENV -1 1366 lua_pushnumber(L_, -1); // L_: self KEY ENV -1
1367 lua_rawget(L_, kUsr); // L_: self KEY ENV "error"|nil 1367 lua_rawget(L_, kUsr); // L_: self KEY ENV "error"|nil
1368 if (!lua_isnil(L_, -1)) { // L_: an error was stored 1368 if (!lua_isnil(L_, -1)) { // L_: an error was stored
@@ -1388,15 +1388,15 @@ LUAG_FUNC(thread_index)
1388 lua_pop(L_, 1); // L_: self KEY ENV 1388 lua_pop(L_, 1); // L_: self KEY ENV
1389 } 1389 }
1390 } 1390 }
1391 lua_rawgeti(L_, kUsr, key); 1391 lua_rawgeti(L_, kUsr, _key);
1392 } 1392 }
1393 return 1; 1393 return 1;
1394 } 1394 }
1395 if (lua_type(L_, kKey) == LUA_TSTRING) { 1395 if (lua_type(L_, kKey) == LUA_TSTRING) {
1396 char const* const keystr{ lua_tostring(L_, kKey) }; 1396 char const* const _keystr{ lua_tostring(L_, kKey) };
1397 lua_settop(L_, 2); // keep only our original arguments on the stack 1397 lua_settop(L_, 2); // keep only our original arguments on the stack
1398 if (strcmp(keystr, "status") == 0) { 1398 if (strcmp(_keystr, "status") == 0) {
1399 lane->pushThreadStatus(L_); // push the string representing the status 1399 _lane->pushThreadStatus(L_); // push the string representing the status
1400 return 1; 1400 return 1;
1401 } 1401 }
1402 // return self.metatable[key] 1402 // return self.metatable[key]
@@ -1405,7 +1405,7 @@ LUAG_FUNC(thread_index)
1405 lua_rawget(L_, -2); // L_: mt value 1405 lua_rawget(L_, -2); // L_: mt value
1406 // only "cancel" and "join" are registered as functions, any other string will raise an error 1406 // only "cancel" and "join" are registered as functions, any other string will raise an error
1407 if (!lua_iscfunction(L_, -1)) { 1407 if (!lua_iscfunction(L_, -1)) {
1408 raise_luaL_error(L_, "can't index a lane with '%s'", keystr); 1408 raise_luaL_error(L_, "can't index a lane with '%s'", _keystr);
1409 } 1409 }
1410 return 1; 1410 return 1;
1411 } 1411 }
@@ -1428,27 +1428,27 @@ LUAG_FUNC(thread_index)
1428// Return a list of all known lanes 1428// Return a list of all known lanes
1429LUAG_FUNC(threads) 1429LUAG_FUNC(threads)
1430{ 1430{
1431 int const top{ lua_gettop(L_) }; 1431 int const _top{ lua_gettop(L_) };
1432 Universe* const U{ universe_get(L_) }; 1432 Universe* const _U{ universe_get(L_) };
1433 1433
1434 // List _all_ still running threads 1434 // List _all_ still running threads
1435 std::lock_guard<std::mutex> guard{ U->trackingMutex }; 1435 std::lock_guard<std::mutex> _guard{ _U->trackingMutex };
1436 if (U->trackingFirst && U->trackingFirst != TRACKING_END) { 1436 if (_U->trackingFirst && _U->trackingFirst != TRACKING_END) {
1437 Lane* lane{ U->trackingFirst }; 1437 Lane* _lane{ _U->trackingFirst };
1438 int index{ 0 }; 1438 int _index{ 0 };
1439 lua_newtable(L_); // L_: {} 1439 lua_newtable(L_); // L_: {}
1440 while (lane != TRACKING_END) { 1440 while (_lane != TRACKING_END) {
1441 // insert a { name='<name>', status='<status>' } tuple, so that several lanes with the same name can't clobber each other 1441 // insert a { name='<name>', status='<status>' } tuple, so that several lanes with the same name can't clobber each other
1442 lua_createtable(L_, 0, 2); // L_: {} {} 1442 lua_createtable(L_, 0, 2); // L_: {} {}
1443 lua_pushstring(L_, lane->debugName); // L_: {} {} "name" 1443 lua_pushstring(L_, _lane->debugName); // L_: {} {} "name"
1444 lua_setfield(L_, -2, "name"); // L_: {} {} 1444 lua_setfield(L_, -2, "name"); // L_: {} {}
1445 lane->pushThreadStatus(L_); // L_: {} {} "status" 1445 _lane->pushThreadStatus(L_); // L_: {} {} "status"
1446 lua_setfield(L_, -2, "status"); // L_: {} {} 1446 lua_setfield(L_, -2, "status"); // L_: {} {}
1447 lua_rawseti(L_, -2, ++index); // L_: {} 1447 lua_rawseti(L_, -2, ++_index); // L_: {}
1448 lane = lane->tracking_next; 1448 _lane = _lane->tracking_next;
1449 } 1449 }
1450 } 1450 }
1451 return lua_gettop(L_) - top; // L_: 0 or 1 1451 return lua_gettop(L_) - _top; // L_: 0 or 1
1452} 1452}
1453#endif // HAVE_LANE_TRACKING() 1453#endif // HAVE_LANE_TRACKING()
1454 1454
@@ -1464,8 +1464,8 @@ LUAG_FUNC(threads)
1464 */ 1464 */
1465LUAG_FUNC(now_secs) 1465LUAG_FUNC(now_secs)
1466{ 1466{
1467 auto const now{ std::chrono::system_clock::now() }; 1467 auto const _now{ std::chrono::system_clock::now() };
1468 lua_Duration duration{ now.time_since_epoch() }; 1468 lua_Duration duration{ _now.time_since_epoch() };
1469 1469
1470 lua_pushnumber(L_, duration.count()); 1470 lua_pushnumber(L_, duration.count());
1471 return 1; 1471 return 1;
@@ -1487,38 +1487,38 @@ LUAG_FUNC(wakeup_conv)
1487 // .isdst (daylight saving on/off) 1487 // .isdst (daylight saving on/off)
1488 1488
1489 STACK_CHECK_START_REL(L_, 0); 1489 STACK_CHECK_START_REL(L_, 0);
1490 auto readInteger = [L = L_](char const* name_) { 1490 auto _readInteger = [L = L_](char const* name_) {
1491 lua_getfield(L, 1, name_); 1491 lua_getfield(L, 1, name_);
1492 lua_Integer const val{ lua_tointeger(L, -1) }; 1492 lua_Integer const val{ lua_tointeger(L, -1) };
1493 lua_pop(L, 1); 1493 lua_pop(L, 1);
1494 return static_cast<int>(val); 1494 return static_cast<int>(val);
1495 }; 1495 };
1496 int const year{ readInteger("year") }; 1496 int const _year{ _readInteger("year") };
1497 int const month{ readInteger("month") }; 1497 int const _month{ _readInteger("month") };
1498 int const day{ readInteger("day") }; 1498 int const _day{ _readInteger("day") };
1499 int const hour{ readInteger("hour") }; 1499 int const _hour{ _readInteger("hour") };
1500 int const min{ readInteger("min") }; 1500 int const _min{ _readInteger("min") };
1501 int const sec{ readInteger("sec") }; 1501 int const _sec{ _readInteger("sec") };
1502 STACK_CHECK(L_, 0); 1502 STACK_CHECK(L_, 0);
1503 1503
1504 // If Lua table has '.isdst' we trust that. If it does not, we'll let 1504 // If Lua table has '.isdst' we trust that. If it does not, we'll let
1505 // 'mktime' decide on whether the time is within DST or not (value -1). 1505 // 'mktime' decide on whether the time is within DST or not (value -1).
1506 // 1506 //
1507 lua_getfield(L_, 1, "isdst"); 1507 lua_getfield(L_, 1, "isdst");
1508 int const isdst{ lua_isboolean(L_, -1) ? lua_toboolean(L_, -1) : -1 }; 1508 int const _isdst{ lua_isboolean(L_, -1) ? lua_toboolean(L_, -1) : -1 };
1509 lua_pop(L_, 1); 1509 lua_pop(L_, 1);
1510 STACK_CHECK(L_, 0); 1510 STACK_CHECK(L_, 0);
1511 1511
1512 std::tm t{}; 1512 std::tm _t{};
1513 t.tm_year = year - 1900; 1513 _t.tm_year = _year - 1900;
1514 t.tm_mon = month - 1; // 0..11 1514 _t.tm_mon = _month - 1; // 0..11
1515 t.tm_mday = day; // 1..31 1515 _t.tm_mday = _day; // 1..31
1516 t.tm_hour = hour; // 0..23 1516 _t.tm_hour = _hour; // 0..23
1517 t.tm_min = min; // 0..59 1517 _t.tm_min = _min; // 0..59
1518 t.tm_sec = sec; // 0..60 1518 _t.tm_sec = _sec; // 0..60
1519 t.tm_isdst = isdst; // 0/1/negative 1519 _t.tm_isdst = _isdst; // 0/1/negative
1520 1520
1521 lua_pushnumber(L_, static_cast<lua_Number>(std::mktime(&t))); // resolution: 1 second 1521 lua_pushnumber(L_, static_cast<lua_Number>(std::mktime(&_t))); // resolution: 1 second
1522 return 1; 1522 return 1;
1523} 1523}
1524 1524
@@ -1527,7 +1527,7 @@ LUAG_FUNC(wakeup_conv)
1527// ################################################################################################# 1527// #################################################################################################
1528 1528
1529// same as PUC-Lua l_alloc 1529// same as PUC-Lua l_alloc
1530extern "C" [[nodiscard]] static void* libc_lua_Alloc([[maybe_unused]] void* ud, [[maybe_unused]] void* ptr_, [[maybe_unused]] size_t osize_, size_t nsize_) 1530extern "C" [[nodiscard]] static void* libc_lua_Alloc([[maybe_unused]] void* ud_, [[maybe_unused]] void* ptr_, [[maybe_unused]] size_t osize_, size_t nsize_)
1531{ 1531{
1532 if (nsize_ == 0) { 1532 if (nsize_ == 0) {
1533 free(ptr_); 1533 free(ptr_);
@@ -1541,9 +1541,9 @@ extern "C" [[nodiscard]] static void* libc_lua_Alloc([[maybe_unused]] void* ud,
1541 1541
1542[[nodiscard]] static int luaG_provide_protected_allocator(lua_State* L_) 1542[[nodiscard]] static int luaG_provide_protected_allocator(lua_State* L_)
1543{ 1543{
1544 Universe* const U{ universe_get(L_) }; 1544 Universe* const _U{ universe_get(L_) };
1545 // push a new full userdata on the stack, giving access to the universe's protected allocator 1545 // push a new full userdata on the stack, giving access to the universe's protected allocator
1546 [[maybe_unused]] AllocatorDefinition* const def{ new (L_) AllocatorDefinition{ U->protectedAllocator.makeDefinition() } }; 1546 [[maybe_unused]] AllocatorDefinition* const def{ new (L_) AllocatorDefinition{ _U->protectedAllocator.makeDefinition() } };
1547 return 1; 1547 return 1;
1548} 1548}
1549 1549
@@ -1585,8 +1585,8 @@ static void initialize_allocator_function(Universe* U_, lua_State* L_)
1585 1585
1586 lua_getfield(L_, -1, "internal_allocator"); // L_: settings "libc"|"allocator" 1586 lua_getfield(L_, -1, "internal_allocator"); // L_: settings "libc"|"allocator"
1587 { 1587 {
1588 char const* allocator = lua_tostring(L_, -1); 1588 char const* const _allocator{ lua_tostring(L_, -1) };
1589 if (strcmp(allocator, "libc") == 0) { 1589 if (strcmp(_allocator, "libc") == 0) {
1590 U_->internalAllocator = AllocatorDefinition{ libc_lua_Alloc, nullptr }; 1590 U_->internalAllocator = AllocatorDefinition{ libc_lua_Alloc, nullptr };
1591 } else if (U_->provideAllocator == luaG_provide_protected_allocator) { 1591 } else if (U_->provideAllocator == luaG_provide_protected_allocator) {
1592 // user wants mutex protection on the state's allocator. Use protection for our own allocations too, just in case. 1592 // user wants mutex protection on the state's allocator. Use protection for our own allocations too, just in case.
@@ -1639,20 +1639,20 @@ LUAG_FUNC(configure)
1639 }); 1639 });
1640 } 1640 }
1641 1641
1642 Universe* U = universe_get(L_); 1642 Universe* _U{ universe_get(L_) };
1643 bool const from_master_state{ U == nullptr }; 1643 bool const _from_master_state{ _U == nullptr };
1644 char const* name = luaL_checkstring(L_, lua_upvalueindex(1)); 1644 char const* const _name{ luaL_checkstring(L_, lua_upvalueindex(1)) };
1645 LUA_ASSERT(L_, lua_type(L_, 1) == LUA_TTABLE); 1645 LUA_ASSERT(L_, lua_type(L_, 1) == LUA_TTABLE);
1646 1646
1647 STACK_GROW(L_, 4); 1647 STACK_GROW(L_, 4);
1648 STACK_CHECK_START_ABS(L_, 1); // L_: settings 1648 STACK_CHECK_START_ABS(L_, 1); // L_: settings
1649 1649
1650 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "%p: lanes.configure() BEGIN\n" INDENT_END(U), L_)); 1650 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "%p: lanes.configure() BEGIN\n" INDENT_END(_U), L_));
1651 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ U }); 1651 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ _U });
1652 1652
1653 if (U == nullptr) { 1653 if (_U == nullptr) {
1654 U = universe_create(L_); // L_: settings universe 1654 _U = universe_create(L_); // L_: settings universe
1655 DEBUGSPEW_CODE(DebugSpewIndentScope scope2{ U }); 1655 DEBUGSPEW_CODE(DebugSpewIndentScope _scope2{ _U });
1656 lua_createtable(L_, 0, 1); // L_: settings universe {mt} 1656 lua_createtable(L_, 0, 1); // L_: settings universe {mt}
1657 lua_getfield(L_, 1, "shutdown_timeout"); // L_: settings universe {mt} shutdown_timeout 1657 lua_getfield(L_, 1, "shutdown_timeout"); // L_: settings universe {mt} shutdown_timeout
1658 lua_getfield(L_, 1, "shutdown_mode"); // L_: settings universe {mt} shutdown_timeout shutdown_mode 1658 lua_getfield(L_, 1, "shutdown_mode"); // L_: settings universe {mt} shutdown_timeout shutdown_mode
@@ -1661,21 +1661,21 @@ LUAG_FUNC(configure)
1661 lua_setmetatable(L_, -2); // L_: settings universe 1661 lua_setmetatable(L_, -2); // L_: settings universe
1662 lua_pop(L_, 1); // L_: settings 1662 lua_pop(L_, 1); // L_: settings
1663 lua_getfield(L_, 1, "verbose_errors"); // L_: settings verbose_errors 1663 lua_getfield(L_, 1, "verbose_errors"); // L_: settings verbose_errors
1664 U->verboseErrors = lua_toboolean(L_, -1) ? true : false; 1664 _U->verboseErrors = lua_toboolean(L_, -1) ? true : false;
1665 lua_pop(L_, 1); // L_: settings 1665 lua_pop(L_, 1); // L_: settings
1666 lua_getfield(L_, 1, "demote_full_userdata"); // L_: settings demote_full_userdata 1666 lua_getfield(L_, 1, "demote_full_userdata"); // L_: settings demote_full_userdata
1667 U->demoteFullUserdata = lua_toboolean(L_, -1) ? true : false; 1667 _U->demoteFullUserdata = lua_toboolean(L_, -1) ? true : false;
1668 lua_pop(L_, 1); // L_: settings 1668 lua_pop(L_, 1); // L_: settings
1669#if HAVE_LANE_TRACKING() 1669#if HAVE_LANE_TRACKING()
1670 lua_getfield(L_, 1, "track_lanes"); // L_: settings track_lanes 1670 lua_getfield(L_, 1, "track_lanes"); // L_: settings track_lanes
1671 U->trackingFirst = lua_toboolean(L_, -1) ? TRACKING_END : nullptr; 1671 _U->trackingFirst = lua_toboolean(L_, -1) ? TRACKING_END : nullptr;
1672 lua_pop(L_, 1); // L_: settings 1672 lua_pop(L_, 1); // L_: settings
1673#endif // HAVE_LANE_TRACKING() 1673#endif // HAVE_LANE_TRACKING()
1674 // Linked chains handling 1674 // Linked chains handling
1675 U->selfdestructFirst = SELFDESTRUCT_END; 1675 _U->selfdestructFirst = SELFDESTRUCT_END;
1676 initialize_allocator_function(U, L_); 1676 initialize_allocator_function(_U, L_);
1677 initializeOnStateCreate(U, L_); 1677 initializeOnStateCreate(_U, L_);
1678 init_keepers(U, L_); 1678 init_keepers(_U, L_);
1679 STACK_CHECK(L_, 1); 1679 STACK_CHECK(L_, 1);
1680 1680
1681 // Initialize 'timerLinda'; a common Linda object shared by all states 1681 // Initialize 'timerLinda'; a common Linda object shared by all states
@@ -1685,15 +1685,15 @@ LUAG_FUNC(configure)
1685 STACK_CHECK(L_, 2); 1685 STACK_CHECK(L_, 2);
1686 1686
1687 // Proxy userdata contents is only a 'DeepPrelude*' pointer 1687 // Proxy userdata contents is only a 'DeepPrelude*' pointer
1688 U->timerLinda = *lua_tofulluserdata<DeepPrelude*>(L_, -1); 1688 _U->timerLinda = *lua_tofulluserdata<DeepPrelude*>(L_, -1);
1689 // increment refcount so that this linda remains alive as long as the universe exists. 1689 // increment refcount so that this linda remains alive as long as the universe exists.
1690 U->timerLinda->refcount.fetch_add(1, std::memory_order_relaxed); 1690 _U->timerLinda->refcount.fetch_add(1, std::memory_order_relaxed);
1691 lua_pop(L_, 1); // L_: settings 1691 lua_pop(L_, 1); // L_: settings
1692 } 1692 }
1693 STACK_CHECK(L_, 1); 1693 STACK_CHECK(L_, 1);
1694 1694
1695 // Serialize calls to 'require' from now on, also in the primary state 1695 // Serialize calls to 'require' from now on, also in the primary state
1696 serialize_require(DEBUGSPEW_PARAM_COMMA(U) L_); 1696 serialize_require(DEBUGSPEW_PARAM_COMMA(_U) L_);
1697 1697
1698 // Retrieve main module interface table 1698 // Retrieve main module interface table
1699 lua_pushvalue(L_, lua_upvalueindex(2)); // L_: settings M 1699 lua_pushvalue(L_, lua_upvalueindex(2)); // L_: settings M
@@ -1704,7 +1704,7 @@ LUAG_FUNC(configure)
1704 luaG_registerlibfuncs(L_, global::sLanesFunctions); 1704 luaG_registerlibfuncs(L_, global::sLanesFunctions);
1705#if HAVE_LANE_TRACKING() 1705#if HAVE_LANE_TRACKING()
1706 // register core.threads() only if settings say it should be available 1706 // register core.threads() only if settings say it should be available
1707 if (U->trackingFirst != nullptr) { 1707 if (_U->trackingFirst != nullptr) {
1708 lua_pushcfunction(L_, LG_threads); // L_: settings M LG_threads() 1708 lua_pushcfunction(L_, LG_threads); // L_: settings M LG_threads()
1709 lua_setfield(L_, -2, "threads"); // L_: settings M 1709 lua_setfield(L_, -2, "threads"); // L_: settings M
1710 } 1710 }
@@ -1712,11 +1712,11 @@ LUAG_FUNC(configure)
1712 STACK_CHECK(L_, 2); 1712 STACK_CHECK(L_, 2);
1713 1713
1714 { 1714 {
1715 char const* errmsg{ 1715 char const* _errmsg{
1716 DeepFactory::PushDeepProxy(DestState{ L_ }, U->timerLinda, 0, LookupMode::LaneBody) 1716 DeepFactory::PushDeepProxy(DestState{ L_ }, _U->timerLinda, 0, LookupMode::LaneBody)
1717 }; // L_: settings M timerLinda 1717 }; // L_: settings M timerLinda
1718 if (errmsg != nullptr) { 1718 if (_errmsg != nullptr) {
1719 raise_luaL_error(L_, errmsg); 1719 raise_luaL_error(L_, _errmsg);
1720 } 1720 }
1721 lua_setfield(L_, -2, "timer_gateway"); // L_: settings M 1721 lua_setfield(L_, -2, "timer_gateway"); // L_: settings M
1722 } 1722 }
@@ -1780,12 +1780,12 @@ LUAG_FUNC(configure)
1780 // register all native functions found in that module in the transferable functions database 1780 // register all native functions found in that module in the transferable functions database
1781 // we process it before _G because we don't want to find the module when scanning _G (this would generate longer names) 1781 // we process it before _G because we don't want to find the module when scanning _G (this would generate longer names)
1782 // for example in package.loaded["lanes.core"].* 1782 // for example in package.loaded["lanes.core"].*
1783 populate_func_lookup_table(L_, -1, name); 1783 populate_func_lookup_table(L_, -1, _name);
1784 STACK_CHECK(L_, 2); 1784 STACK_CHECK(L_, 2);
1785 1785
1786 // record all existing C/JIT-fast functions 1786 // record all existing C/JIT-fast functions
1787 // Lua 5.2 no longer has LUA_GLOBALSINDEX: we must push globals table on the stack 1787 // Lua 5.2 no longer has LUA_GLOBALSINDEX: we must push globals table on the stack
1788 if (from_master_state) { 1788 if (_from_master_state) {
1789 // don't do this when called during the initialization of a new lane, 1789 // don't do this when called during the initialization of a new lane,
1790 // because we will do it after on_state_create() is called, 1790 // because we will do it after on_state_create() is called,
1791 // and we don't want to skip _G because of caching in case globals are created then 1791 // and we don't want to skip _G because of caching in case globals are created then
@@ -1798,7 +1798,7 @@ LUAG_FUNC(configure)
1798 // set _R[kConfigRegKey] = settings 1798 // set _R[kConfigRegKey] = settings
1799 kConfigRegKey.setValue(L_, [](lua_State* L_) { lua_pushvalue(L_, -2); }); 1799 kConfigRegKey.setValue(L_, [](lua_State* L_) { lua_pushvalue(L_, -2); });
1800 STACK_CHECK(L_, 1); 1800 STACK_CHECK(L_, 1);
1801 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "%p: lanes.configure() END\n" INDENT_END(U), L_)); 1801 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "%p: lanes.configure() END\n" INDENT_END(_U), L_));
1802 // Return the settings table 1802 // Return the settings table
1803 return 1; 1803 return 1;
1804} 1804}
@@ -1809,9 +1809,9 @@ LUAG_FUNC(configure)
1809#include <signal.h> 1809#include <signal.h>
1810#include <conio.h> 1810#include <conio.h>
1811 1811
1812void signal_handler(int signal) 1812void signal_handler(int signal_)
1813{ 1813{
1814 if (signal == SIGABRT) { 1814 if (signal_ == SIGABRT) {
1815 _cprintf("caught abnormal termination!"); 1815 _cprintf("caught abnormal termination!");
1816 abort(); 1816 abort();
1817 } 1817 }
@@ -1830,18 +1830,18 @@ static void EnableCrashingOnCrashes(void)
1830 typedef BOOL(WINAPI * tSetPolicy)(DWORD dwFlags); 1830 typedef BOOL(WINAPI * tSetPolicy)(DWORD dwFlags);
1831 const DWORD EXCEPTION_SWALLOWING = 0x1; 1831 const DWORD EXCEPTION_SWALLOWING = 0x1;
1832 1832
1833 HMODULE kernel32 = LoadLibraryA("kernel32.dll"); 1833 HMODULE _kernel32 = LoadLibraryA("kernel32.dll");
1834 if (kernel32) { 1834 if (_kernel32) {
1835 tGetPolicy pGetPolicy = (tGetPolicy) GetProcAddress(kernel32, "GetProcessUserModeExceptionPolicy"); 1835 tGetPolicy pGetPolicy = (tGetPolicy) GetProcAddress(_kernel32, "GetProcessUserModeExceptionPolicy");
1836 tSetPolicy pSetPolicy = (tSetPolicy) GetProcAddress(kernel32, "SetProcessUserModeExceptionPolicy"); 1836 tSetPolicy pSetPolicy = (tSetPolicy) GetProcAddress(_kernel32, "SetProcessUserModeExceptionPolicy");
1837 if (pGetPolicy && pSetPolicy) { 1837 if (pGetPolicy && pSetPolicy) {
1838 DWORD dwFlags; 1838 DWORD _dwFlags;
1839 if (pGetPolicy(&dwFlags)) { 1839 if (pGetPolicy(&_dwFlags)) {
1840 // Turn off the filter 1840 // Turn off the filter
1841 pSetPolicy(dwFlags & ~EXCEPTION_SWALLOWING); 1841 pSetPolicy(_dwFlags & ~EXCEPTION_SWALLOWING);
1842 } 1842 }
1843 } 1843 }
1844 FreeLibrary(kernel32); 1844 FreeLibrary(_kernel32);
1845 } 1845 }
1846 // typedef void (* SignalHandlerPointer)( int); 1846 // typedef void (* SignalHandlerPointer)( int);
1847 /*SignalHandlerPointer previousHandler =*/signal(SIGABRT, signal_handler); 1847 /*SignalHandlerPointer previousHandler =*/signal(SIGABRT, signal_handler);
@@ -1902,8 +1902,8 @@ LANES_API int luaopen_lanes_core(lua_State* L_)
1902 1902
1903[[nodiscard]] static int default_luaopen_lanes(lua_State* L_) 1903[[nodiscard]] static int default_luaopen_lanes(lua_State* L_)
1904{ 1904{
1905 int const rc{ luaL_loadfile(L_, "lanes.lua") || lua_pcall(L_, 0, 1, 0) }; 1905 int const _rc{ luaL_loadfile(L_, "lanes.lua") || lua_pcall(L_, 0, 1, 0) };
1906 if (rc != LUA_OK) { 1906 if (_rc != LUA_OK) {
1907 raise_luaL_error(L_, "failed to initialize embedded Lanes"); 1907 raise_luaL_error(L_, "failed to initialize embedded Lanes");
1908 } 1908 }
1909 return 1; 1909 return 1;
diff --git a/src/lanesconf.h b/src/lanesconf.h
index 7b4ff93..aae4f5b 100644
--- a/src/lanesconf.h
+++ b/src/lanesconf.h
@@ -23,7 +23,7 @@
23// regular class member/method: no prefix, start with a lowercase letter 23// regular class member/method: no prefix, start with a lowercase letter
24// function argument: suffix _ 24// function argument: suffix _
25// static function variable: prefix s, followed by an uppercase letter 25// static function variable: prefix s, followed by an uppercase letter
26// function local variable: prefix l, followed by an uppercase letter 26// function local variable: prefix _, followed by an uppercase letter
27// named lambda capture: no prefix, start with a lowercase letter 27// named lambda capture: no prefix, start with a lowercase letter
28 28
29#if (defined PLATFORM_WIN32) || (defined PLATFORM_POCKETPC) 29#if (defined PLATFORM_WIN32) || (defined PLATFORM_POCKETPC)
diff --git a/src/linda.cpp b/src/linda.cpp
index 07911b3..fedcd01 100644
--- a/src/linda.cpp
+++ b/src/linda.cpp
@@ -59,8 +59,8 @@ Linda::Linda(Universe* U_, LindaGroup group_, char const* name_, size_t len_)
59Linda::~Linda() 59Linda::~Linda()
60{ 60{
61 if (std::holds_alternative<AllocatedName>(nameVariant)) { 61 if (std::holds_alternative<AllocatedName>(nameVariant)) {
62 AllocatedName& name = std::get<AllocatedName>(nameVariant); 62 AllocatedName& _name = std::get<AllocatedName>(nameVariant);
63 U->internalAllocator.free(name.name, name.len); 63 U->internalAllocator.free(_name.name, _name.len);
64 } 64 }
65} 65}
66 66
@@ -75,13 +75,13 @@ void Linda::setName(char const* name_, size_t len_)
75 ++len_; // don't forget terminating 0 75 ++len_; // don't forget terminating 0
76 if (len_ < kEmbeddedNameLength) { 76 if (len_ < kEmbeddedNameLength) {
77 nameVariant.emplace<EmbeddedName>(); 77 nameVariant.emplace<EmbeddedName>();
78 char* const name{ std::get<EmbeddedName>(nameVariant).data() }; 78 char* const _name{ std::get<EmbeddedName>(nameVariant).data() };
79 memcpy(name, name_, len_); 79 memcpy(_name, name_, len_);
80 } else { 80 } else {
81 AllocatedName& name = std::get<AllocatedName>(nameVariant); 81 AllocatedName& _name = std::get<AllocatedName>(nameVariant);
82 name.name = static_cast<char*>(U->internalAllocator.alloc(len_)); 82 _name.name = static_cast<char*>(U->internalAllocator.alloc(len_));
83 name.len = len_; 83 _name.len = len_;
84 memcpy(name.name, name_, len_); 84 memcpy(_name.name, name_, len_);
85 } 85 }
86} 86}
87 87
@@ -90,12 +90,12 @@ void Linda::setName(char const* name_, size_t len_)
90char const* Linda::getName() const 90char const* Linda::getName() const
91{ 91{
92 if (std::holds_alternative<AllocatedName>(nameVariant)) { 92 if (std::holds_alternative<AllocatedName>(nameVariant)) {
93 AllocatedName const& name = std::get<AllocatedName>(nameVariant); 93 AllocatedName const& _name = std::get<AllocatedName>(nameVariant);
94 return name.name; 94 return _name.name;
95 } 95 }
96 if (std::holds_alternative<EmbeddedName>(nameVariant)) { 96 if (std::holds_alternative<EmbeddedName>(nameVariant)) {
97 char const* const name{ std::get<EmbeddedName>(nameVariant).data() }; 97 char const* const _name{ std::get<EmbeddedName>(nameVariant).data() };
98 return name; 98 return _name;
99 } 99 }
100 return nullptr; 100 return nullptr;
101} 101}
@@ -105,20 +105,20 @@ char const* Linda::getName() const
105template <bool OPT> 105template <bool OPT>
106[[nodiscard]] static inline Linda* ToLinda(lua_State* L_, int idx_) 106[[nodiscard]] static inline Linda* ToLinda(lua_State* L_, int idx_)
107{ 107{
108 Linda* const linda{ static_cast<Linda*>(LindaFactory::Instance.toDeep(L_, idx_)) }; 108 Linda* const _linda{ static_cast<Linda*>(LindaFactory::Instance.toDeep(L_, idx_)) };
109 if constexpr (!OPT) { 109 if constexpr (!OPT) {
110 luaL_argcheck(L_, linda != nullptr, idx_, "expecting a linda object"); // doesn't return if linda is nullptr 110 luaL_argcheck(L_, _linda != nullptr, idx_, "expecting a linda object"); // doesn't return if linda is nullptr
111 LUA_ASSERT(L_, linda->U == universe_get(L_)); 111 LUA_ASSERT(L_, _linda->U == universe_get(L_));
112 } 112 }
113 return linda; 113 return _linda;
114} 114}
115 115
116// ################################################################################################# 116// #################################################################################################
117 117
118static void check_key_types(lua_State* L_, int start_, int end_) 118static void check_key_types(lua_State* L_, int start_, int end_)
119{ 119{
120 for (int i{ start_ }; i <= end_; ++i) { 120 for (int _i{ start_ }; _i <= end_; ++_i) {
121 LuaType const t{ lua_type_as_enum(L_, i) }; 121 LuaType const t{ lua_type_as_enum(L_, _i) };
122 switch (t) { 122 switch (t) {
123 case LuaType::BOOLEAN: 123 case LuaType::BOOLEAN:
124 case LuaType::NUMBER: 124 case LuaType::NUMBER:
@@ -128,14 +128,14 @@ static void check_key_types(lua_State* L_, int start_, int end_)
128 case LuaType::LIGHTUSERDATA: 128 case LuaType::LIGHTUSERDATA:
129 static constexpr std::array<std::reference_wrapper<UniqueKey const>, 3> kKeysToCheck{ kLindaBatched, kCancelError, kNilSentinel }; 129 static constexpr std::array<std::reference_wrapper<UniqueKey const>, 3> kKeysToCheck{ kLindaBatched, kCancelError, kNilSentinel };
130 for (UniqueKey const& key : kKeysToCheck) { 130 for (UniqueKey const& key : kKeysToCheck) {
131 if (key.equals(L_, i)) { 131 if (key.equals(L_, _i)) {
132 raise_luaL_error(L_, "argument #%d: can't use %s as a key", i, key.debugName); 132 raise_luaL_error(L_, "argument #%d: can't use %s as a key", _i, key.debugName);
133 break; 133 break;
134 } 134 }
135 } 135 }
136 break; 136 break;
137 } 137 }
138 raise_luaL_error(L_, "argument #%d: invalid key type (not a boolean, string, number or light userdata)", i); 138 raise_luaL_error(L_, "argument #%d: invalid key type (not a boolean, string, number or light userdata)", _i);
139 } 139 }
140} 140}
141 141
@@ -144,29 +144,29 @@ static void check_key_types(lua_State* L_, int start_, int end_)
144// used to perform all linda operations that access keepers 144// used to perform all linda operations that access keepers
145int Linda::ProtectedCall(lua_State* L_, lua_CFunction f_) 145int Linda::ProtectedCall(lua_State* L_, lua_CFunction f_)
146{ 146{
147 Linda* const linda{ ToLinda<false>(L_, 1) }; 147 Linda* const _linda{ ToLinda<false>(L_, 1) };
148 148
149 // acquire the keeper 149 // acquire the keeper
150 Keeper* const K{ linda->acquireKeeper() }; 150 Keeper* const _K{ _linda->acquireKeeper() };
151 lua_State* const KL{ K ? K->L : nullptr }; 151 lua_State* const _KL{ _K ? _K->L : nullptr };
152 if (KL == nullptr) 152 if (_KL == nullptr)
153 return 0; 153 return 0;
154 // if we didn't do anything wrong, the keeper stack should be clean 154 // if we didn't do anything wrong, the keeper stack should be clean
155 LUA_ASSERT(L_, lua_gettop(KL) == 0); 155 LUA_ASSERT(L_, lua_gettop(_KL) == 0);
156 156
157 // push the function to be called and move it before the arguments 157 // push the function to be called and move it before the arguments
158 lua_pushcfunction(L_, f_); 158 lua_pushcfunction(L_, f_);
159 lua_insert(L_, 1); 159 lua_insert(L_, 1);
160 // do a protected call 160 // do a protected call
161 int const rc{ lua_pcall(L_, lua_gettop(L_) - 1, LUA_MULTRET, 0) }; 161 int const _rc{ lua_pcall(L_, lua_gettop(L_) - 1, LUA_MULTRET, 0) };
162 // whatever happens, the keeper state stack must be empty when we are done 162 // whatever happens, the keeper state stack must be empty when we are done
163 lua_settop(KL, 0); 163 lua_settop(_KL, 0);
164 164
165 // release the keeper 165 // release the keeper
166 linda->releaseKeeper(K); 166 _linda->releaseKeeper(_K);
167 167
168 // if there was an error, forward it 168 // if there was an error, forward it
169 if (rc != LUA_OK) { 169 if (_rc != LUA_OK) {
170 raise_lua_error(L_); 170 raise_lua_error(L_);
171 } 171 }
172 // return whatever the actual operation provided 172 // return whatever the actual operation provided
@@ -186,108 +186,108 @@ int Linda::ProtectedCall(lua_State* L_, lua_CFunction f_)
186 */ 186 */
187LUAG_FUNC(linda_send) 187LUAG_FUNC(linda_send)
188{ 188{
189 auto send = [](lua_State* L_) { 189 auto _send = [](lua_State* L_) {
190 Linda* const linda{ ToLinda<false>(L_, 1) }; 190 Linda* const _linda{ ToLinda<false>(L_, 1) };
191 int key_i{ 2 }; // index of first key, if timeout not there 191 int _key_i{ 2 }; // index of first key, if timeout not there
192 192
193 std::chrono::time_point<std::chrono::steady_clock> until{ std::chrono::time_point<std::chrono::steady_clock>::max() }; 193 std::chrono::time_point<std::chrono::steady_clock> _until{ std::chrono::time_point<std::chrono::steady_clock>::max() };
194 if (lua_type(L_, 2) == LUA_TNUMBER) { // we don't want to use lua_isnumber() because of autocoercion 194 if (lua_type(L_, 2) == LUA_TNUMBER) { // we don't want to use lua_isnumber() because of autocoercion
195 lua_Duration const duration{ lua_tonumber(L_, 2) }; 195 lua_Duration const _duration{ lua_tonumber(L_, 2) };
196 if (duration.count() >= 0.0) { 196 if (_duration.count() >= 0.0) {
197 until = std::chrono::steady_clock::now() + std::chrono::duration_cast<std::chrono::steady_clock::duration>(duration); 197 _until = std::chrono::steady_clock::now() + std::chrono::duration_cast<std::chrono::steady_clock::duration>(_duration);
198 } else { 198 } else {
199 raise_luaL_argerror(L_, 2, "duration cannot be < 0"); 199 raise_luaL_argerror(L_, 2, "duration cannot be < 0");
200 } 200 }
201 ++key_i; 201 ++_key_i;
202 } else if (lua_isnil(L_, 2)) { // alternate explicit "infinite timeout" by passing nil before the key 202 } else if (lua_isnil(L_, 2)) { // alternate explicit "infinite timeout" by passing nil before the key
203 ++key_i; 203 ++_key_i;
204 } 204 }
205 205
206 // make sure the key is of a valid type 206 // make sure the key is of a valid type
207 check_key_types(L_, key_i, key_i); 207 check_key_types(L_, _key_i, _key_i);
208 208
209 STACK_GROW(L_, 1); 209 STACK_GROW(L_, 1);
210 210
211 // make sure there is something to send 211 // make sure there is something to send
212 if (lua_gettop(L_) == key_i) { 212 if (lua_gettop(L_) == _key_i) {
213 raise_luaL_error(L_, "no data to send"); 213 raise_luaL_error(L_, "no data to send");
214 } 214 }
215 215
216 // convert nils to some special non-nil sentinel in sent values 216 // convert nils to some special non-nil sentinel in sent values
217 keeper_toggle_nil_sentinels(L_, key_i + 1, LookupMode::ToKeeper); 217 keeper_toggle_nil_sentinels(L_, _key_i + 1, LookupMode::ToKeeper);
218 bool ret{ false }; 218 bool _ret{ false };
219 CancelRequest cancel{ CancelRequest::None }; 219 CancelRequest _cancel{ CancelRequest::None };
220 KeeperCallResult pushed; 220 KeeperCallResult _pushed;
221 { 221 {
222 Lane* const lane{ kLanePointerRegKey.readLightUserDataValue<Lane>(L_) }; 222 Lane* const _lane{ kLanePointerRegKey.readLightUserDataValue<Lane>(L_) };
223 Keeper* const K{ linda->whichKeeper() }; 223 Keeper* const _K{ _linda->whichKeeper() };
224 KeeperState const KL{ K ? K->L : nullptr }; 224 KeeperState const _KL{ _K ? _K->L : nullptr };
225 if (KL == nullptr) 225 if (_KL == nullptr)
226 return 0; 226 return 0;
227 227
228 STACK_CHECK_START_REL(KL, 0); 228 STACK_CHECK_START_REL(_KL, 0);
229 for (bool try_again{ true };;) { 229 for (bool _try_again{ true };;) {
230 if (lane != nullptr) { 230 if (_lane != nullptr) {
231 cancel = lane->cancelRequest; 231 _cancel = _lane->cancelRequest;
232 } 232 }
233 cancel = (cancel != CancelRequest::None) ? cancel : linda->cancelRequest; 233 _cancel = (_cancel != CancelRequest::None) ? _cancel : _linda->cancelRequest;
234 // if user wants to cancel, or looped because of a timeout, the call returns without sending anything 234 // if user wants to cancel, or looped because of a timeout, the call returns without sending anything
235 if (!try_again || cancel != CancelRequest::None) { 235 if (!_try_again || _cancel != CancelRequest::None) {
236 pushed.emplace(0); 236 _pushed.emplace(0);
237 break; 237 break;
238 } 238 }
239 239
240 STACK_CHECK(KL, 0); 240 STACK_CHECK(_KL, 0);
241 pushed = keeper_call(linda->U, KL, KEEPER_API(send), L_, linda, key_i); 241 _pushed = keeper_call(_KL, KEEPER_API(send), L_, _linda, _key_i);
242 if (!pushed.has_value()) { 242 if (!_pushed.has_value()) {
243 break; 243 break;
244 } 244 }
245 LUA_ASSERT(L_, pushed.value() == 1); 245 LUA_ASSERT(L_, _pushed.value() == 1);
246 246
247 ret = lua_toboolean(L_, -1) ? true : false; 247 _ret = lua_toboolean(L_, -1) ? true : false;
248 lua_pop(L_, 1); 248 lua_pop(L_, 1);
249 249
250 if (ret) { 250 if (_ret) {
251 // Wake up ALL waiting threads 251 // Wake up ALL waiting threads
252 linda->writeHappened.notify_all(); 252 _linda->writeHappened.notify_all();
253 break; 253 break;
254 } 254 }
255 255
256 // instant timout to bypass the wait syscall 256 // instant timout to bypass the wait syscall
257 if (std::chrono::steady_clock::now() >= until) { 257 if (std::chrono::steady_clock::now() >= _until) {
258 break; /* no wait; instant timeout */ 258 break; /* no wait; instant timeout */
259 } 259 }
260 260
261 // storage limit hit, wait until timeout or signalled that we should try again 261 // storage limit hit, wait until timeout or signalled that we should try again
262 { 262 {
263 Lane::Status prev_status{ Lane::Error }; // prevent 'might be used uninitialized' warnings 263 Lane::Status _prev_status{ Lane::Error }; // prevent 'might be used uninitialized' warnings
264 if (lane != nullptr) { 264 if (_lane != nullptr) {
265 // change status of lane to "waiting" 265 // change status of lane to "waiting"
266 prev_status = lane->status; // Running, most likely 266 _prev_status = _lane->status; // Running, most likely
267 LUA_ASSERT(L_, prev_status == Lane::Running); // but check, just in case 267 LUA_ASSERT(L_, _prev_status == Lane::Running); // but check, just in case
268 lane->status = Lane::Waiting; 268 _lane->status = Lane::Waiting;
269 LUA_ASSERT(L_, lane->waiting_on == nullptr); 269 LUA_ASSERT(L_, _lane->waiting_on == nullptr);
270 lane->waiting_on = &linda->readHappened; 270 _lane->waiting_on = &_linda->readHappened;
271 } 271 }
272 // could not send because no room: wait until some data was read before trying again, or until timeout is reached 272 // could not send because no room: wait until some data was read before trying again, or until timeout is reached
273 std::unique_lock<std::mutex> keeper_lock{ K->mutex, std::adopt_lock }; 273 std::unique_lock<std::mutex> _keeper_lock{ _K->mutex, std::adopt_lock };
274 std::cv_status const status{ linda->readHappened.wait_until(keeper_lock, until) }; 274 std::cv_status const status{ _linda->readHappened.wait_until(_keeper_lock, _until) };
275 keeper_lock.release(); // we don't want to release the lock! 275 _keeper_lock.release(); // we don't want to release the lock!
276 try_again = (status == std::cv_status::no_timeout); // detect spurious wakeups 276 _try_again = (status == std::cv_status::no_timeout); // detect spurious wakeups
277 if (lane != nullptr) { 277 if (_lane != nullptr) {
278 lane->waiting_on = nullptr; 278 _lane->waiting_on = nullptr;
279 lane->status = prev_status; 279 _lane->status = _prev_status;
280 } 280 }
281 } 281 }
282 } 282 }
283 STACK_CHECK(KL, 0); 283 STACK_CHECK(_KL, 0);
284 } 284 }
285 285
286 if (!pushed.has_value()) { 286 if (!_pushed.has_value()) {
287 raise_luaL_error(L_, "tried to copy unsupported types"); 287 raise_luaL_error(L_, "tried to copy unsupported types");
288 } 288 }
289 289
290 switch (cancel) { 290 switch (_cancel) {
291 case CancelRequest::Soft: 291 case CancelRequest::Soft:
292 // if user wants to soft-cancel, the call returns lanes.cancel_error 292 // if user wants to soft-cancel, the call returns lanes.cancel_error
293 kCancelError.pushKey(L_); 293 kCancelError.pushKey(L_);
@@ -298,11 +298,11 @@ LUAG_FUNC(linda_send)
298 raise_cancel_error(L_); // raises an error and doesn't return 298 raise_cancel_error(L_); // raises an error and doesn't return
299 299
300 default: 300 default:
301 lua_pushboolean(L_, ret); // true (success) or false (timeout) 301 lua_pushboolean(L_, _ret); // true (success) or false (timeout)
302 return 1; 302 return 1;
303 } 303 }
304 }; 304 };
305 return Linda::ProtectedCall(L_, send); 305 return Linda::ProtectedCall(L_, _send);
306} 306}
307 307
308// ################################################################################################# 308// #################################################################################################
@@ -320,122 +320,122 @@ LUAG_FUNC(linda_send)
320 */ 320 */
321LUAG_FUNC(linda_receive) 321LUAG_FUNC(linda_receive)
322{ 322{
323 auto receive = [](lua_State* L_) { 323 auto _receive = [](lua_State* L_) {
324 Linda* const linda{ ToLinda<false>(L_, 1) }; 324 Linda* const _linda{ ToLinda<false>(L_, 1) };
325 int key_i{ 2 }; // index of first key, if timeout not there 325 int _key_i{ 2 }; // index of first key, if timeout not there
326 326
327 std::chrono::time_point<std::chrono::steady_clock> until{ std::chrono::time_point<std::chrono::steady_clock>::max() }; 327 std::chrono::time_point<std::chrono::steady_clock> _until{ std::chrono::time_point<std::chrono::steady_clock>::max() };
328 if (lua_type(L_, 2) == LUA_TNUMBER) { // we don't want to use lua_isnumber() because of autocoercion 328 if (lua_type(L_, 2) == LUA_TNUMBER) { // we don't want to use lua_isnumber() because of autocoercion
329 lua_Duration const duration{ lua_tonumber(L_, 2) }; 329 lua_Duration const _duration{ lua_tonumber(L_, 2) };
330 if (duration.count() >= 0.0) { 330 if (_duration.count() >= 0.0) {
331 until = std::chrono::steady_clock::now() + std::chrono::duration_cast<std::chrono::steady_clock::duration>(duration); 331 _until = std::chrono::steady_clock::now() + std::chrono::duration_cast<std::chrono::steady_clock::duration>(_duration);
332 } else { 332 } else {
333 raise_luaL_argerror(L_, 2, "duration cannot be < 0"); 333 raise_luaL_argerror(L_, 2, "duration cannot be < 0");
334 } 334 }
335 ++key_i; 335 ++_key_i;
336 } else if (lua_isnil(L_, 2)) { // alternate explicit "infinite timeout" by passing nil before the key 336 } else if (lua_isnil(L_, 2)) { // alternate explicit "infinite timeout" by passing nil before the key
337 ++key_i; 337 ++_key_i;
338 } 338 }
339 339
340 keeper_api_t selected_keeper_receive{ nullptr }; 340 keeper_api_t _selected_keeper_receive{ nullptr };
341 int expected_pushed_min{ 0 }, expected_pushed_max{ 0 }; 341 int _expected_pushed_min{ 0 }, _expected_pushed_max{ 0 };
342 // are we in batched mode? 342 // are we in batched mode?
343 kLindaBatched.pushKey(L_); 343 kLindaBatched.pushKey(L_);
344 int const is_batched{ lua501_equal(L_, key_i, -1) }; 344 int const _is_batched{ lua501_equal(L_, _key_i, -1) };
345 lua_pop(L_, 1); 345 lua_pop(L_, 1);
346 if (is_batched) { 346 if (_is_batched) {
347 // no need to pass linda.batched in the keeper state 347 // no need to pass linda.batched in the keeper state
348 ++key_i; 348 ++_key_i;
349 // make sure the keys are of a valid type 349 // make sure the keys are of a valid type
350 check_key_types(L_, key_i, key_i); 350 check_key_types(L_, _key_i, _key_i);
351 // receive multiple values from a single slot 351 // receive multiple values from a single slot
352 selected_keeper_receive = KEEPER_API(receive_batched); 352 _selected_keeper_receive = KEEPER_API(receive_batched);
353 // we expect a user-defined amount of return value 353 // we expect a user-defined amount of return value
354 expected_pushed_min = (int) luaL_checkinteger(L_, key_i + 1); 354 _expected_pushed_min = (int) luaL_checkinteger(L_, _key_i + 1);
355 expected_pushed_max = (int) luaL_optinteger(L_, key_i + 2, expected_pushed_min); 355 _expected_pushed_max = (int) luaL_optinteger(L_, _key_i + 2, _expected_pushed_min);
356 // don't forget to count the key in addition to the values 356 // don't forget to count the key in addition to the values
357 ++expected_pushed_min; 357 ++_expected_pushed_min;
358 ++expected_pushed_max; 358 ++_expected_pushed_max;
359 if (expected_pushed_min > expected_pushed_max) { 359 if (_expected_pushed_min > _expected_pushed_max) {
360 raise_luaL_error(L_, "batched min/max error"); 360 raise_luaL_error(L_, "batched min/max error");
361 } 361 }
362 } else { 362 } else {
363 // make sure the keys are of a valid type 363 // make sure the keys are of a valid type
364 check_key_types(L_, key_i, lua_gettop(L_)); 364 check_key_types(L_, _key_i, lua_gettop(L_));
365 // receive a single value, checking multiple slots 365 // receive a single value, checking multiple slots
366 selected_keeper_receive = KEEPER_API(receive); 366 _selected_keeper_receive = KEEPER_API(receive);
367 // we expect a single (value, key) pair of returned values 367 // we expect a single (value, key) pair of returned values
368 expected_pushed_min = expected_pushed_max = 2; 368 _expected_pushed_min = _expected_pushed_max = 2;
369 } 369 }
370 370
371 Lane* const lane{ kLanePointerRegKey.readLightUserDataValue<Lane>(L_) }; 371 Lane* const _lane{ kLanePointerRegKey.readLightUserDataValue<Lane>(L_) };
372 Keeper* const K{ linda->whichKeeper() }; 372 Keeper* const _K{ _linda->whichKeeper() };
373 KeeperState const KL{ K ? K->L : nullptr }; 373 KeeperState const _KL{ _K ? _K->L : nullptr };
374 if (KL == nullptr) 374 if (_KL == nullptr)
375 return 0; 375 return 0;
376 376
377 CancelRequest cancel{ CancelRequest::None }; 377 CancelRequest _cancel{ CancelRequest::None };
378 KeeperCallResult pushed; 378 KeeperCallResult _pushed;
379 STACK_CHECK_START_REL(KL, 0); 379 STACK_CHECK_START_REL(_KL, 0);
380 for (bool try_again{ true };;) { 380 for (bool _try_again{ true };;) {
381 if (lane != nullptr) { 381 if (_lane != nullptr) {
382 cancel = lane->cancelRequest; 382 _cancel = _lane->cancelRequest;
383 } 383 }
384 cancel = (cancel != CancelRequest::None) ? cancel : linda->cancelRequest; 384 _cancel = (_cancel != CancelRequest::None) ? _cancel : _linda->cancelRequest;
385 // if user wants to cancel, or looped because of a timeout, the call returns without sending anything 385 // if user wants to cancel, or looped because of a timeout, the call returns without sending anything
386 if (!try_again || cancel != CancelRequest::None) { 386 if (!_try_again || _cancel != CancelRequest::None) {
387 pushed.emplace(0); 387 _pushed.emplace(0);
388 break; 388 break;
389 } 389 }
390 390
391 // all arguments of receive() but the first are passed to the keeper's receive function 391 // all arguments of receive() but the first are passed to the keeper's receive function
392 pushed = keeper_call(linda->U, KL, selected_keeper_receive, L_, linda, key_i); 392 _pushed = keeper_call(_KL, _selected_keeper_receive, L_, _linda, _key_i);
393 if (!pushed.has_value()) { 393 if (!_pushed.has_value()) {
394 break; 394 break;
395 } 395 }
396 if (pushed.value() > 0) { 396 if (_pushed.value() > 0) {
397 LUA_ASSERT(L_, pushed.value() >= expected_pushed_min && pushed.value() <= expected_pushed_max); 397 LUA_ASSERT(L_, _pushed.value() >= _expected_pushed_min && _pushed.value() <= _expected_pushed_max);
398 // replace sentinels with real nils 398 // replace sentinels with real nils
399 keeper_toggle_nil_sentinels(L_, lua_gettop(L_) - pushed.value(), LookupMode::FromKeeper); 399 keeper_toggle_nil_sentinels(L_, lua_gettop(L_) - _pushed.value(), LookupMode::FromKeeper);
400 // To be done from within the 'K' locking area 400 // To be done from within the 'K' locking area
401 // 401 //
402 linda->readHappened.notify_all(); 402 _linda->readHappened.notify_all();
403 break; 403 break;
404 } 404 }
405 405
406 if (std::chrono::steady_clock::now() >= until) { 406 if (std::chrono::steady_clock::now() >= _until) {
407 break; /* instant timeout */ 407 break; /* instant timeout */
408 } 408 }
409 409
410 // nothing received, wait until timeout or signalled that we should try again 410 // nothing received, wait until timeout or signalled that we should try again
411 { 411 {
412 Lane::Status prev_status{ Lane::Error }; // prevent 'might be used uninitialized' warnings 412 Lane::Status _prev_status{ Lane::Error }; // prevent 'might be used uninitialized' warnings
413 if (lane != nullptr) { 413 if (_lane != nullptr) {
414 // change status of lane to "waiting" 414 // change status of lane to "waiting"
415 prev_status = lane->status; // Running, most likely 415 _prev_status = _lane->status; // Running, most likely
416 LUA_ASSERT(L_, prev_status == Lane::Running); // but check, just in case 416 LUA_ASSERT(L_, _prev_status == Lane::Running); // but check, just in case
417 lane->status = Lane::Waiting; 417 _lane->status = Lane::Waiting;
418 LUA_ASSERT(L_, lane->waiting_on == nullptr); 418 LUA_ASSERT(L_, _lane->waiting_on == nullptr);
419 lane->waiting_on = &linda->writeHappened; 419 _lane->waiting_on = &_linda->writeHappened;
420 } 420 }
421 // not enough data to read: wakeup when data was sent, or when timeout is reached 421 // not enough data to read: wakeup when data was sent, or when timeout is reached
422 std::unique_lock<std::mutex> keeper_lock{ K->mutex, std::adopt_lock }; 422 std::unique_lock<std::mutex> _keeper_lock{ _K->mutex, std::adopt_lock };
423 std::cv_status const status{ linda->writeHappened.wait_until(keeper_lock, until) }; 423 std::cv_status const _status{ _linda->writeHappened.wait_until(_keeper_lock, _until) };
424 keeper_lock.release(); // we don't want to release the lock! 424 _keeper_lock.release(); // we don't want to release the lock!
425 try_again = (status == std::cv_status::no_timeout); // detect spurious wakeups 425 _try_again = (_status == std::cv_status::no_timeout); // detect spurious wakeups
426 if (lane != nullptr) { 426 if (_lane != nullptr) {
427 lane->waiting_on = nullptr; 427 _lane->waiting_on = nullptr;
428 lane->status = prev_status; 428 _lane->status = _prev_status;
429 } 429 }
430 } 430 }
431 } 431 }
432 STACK_CHECK(KL, 0); 432 STACK_CHECK(_KL, 0);
433 433
434 if (!pushed.has_value()) { 434 if (!_pushed.has_value()) {
435 raise_luaL_error(L_, "tried to copy unsupported types"); 435 raise_luaL_error(L_, "tried to copy unsupported types");
436 } 436 }
437 437
438 switch (cancel) { 438 switch (_cancel) {
439 case CancelRequest::Soft: 439 case CancelRequest::Soft:
440 // if user wants to soft-cancel, the call returns kCancelError 440 // if user wants to soft-cancel, the call returns kCancelError
441 kCancelError.pushKey(L_); 441 kCancelError.pushKey(L_);
@@ -446,10 +446,10 @@ LUAG_FUNC(linda_receive)
446 raise_cancel_error(L_); // raises an error and doesn't return 446 raise_cancel_error(L_); // raises an error and doesn't return
447 447
448 default: 448 default:
449 return pushed.value(); 449 return _pushed.value();
450 } 450 }
451 }; 451 };
452 return Linda::ProtectedCall(L_, receive); 452 return Linda::ProtectedCall(L_, _receive);
453} 453}
454 454
455// ################################################################################################# 455// #################################################################################################
@@ -465,40 +465,40 @@ LUAG_FUNC(linda_receive)
465LUAG_FUNC(linda_set) 465LUAG_FUNC(linda_set)
466{ 466{
467 auto set = [](lua_State* L_) { 467 auto set = [](lua_State* L_) {
468 Linda* const linda{ ToLinda<false>(L_, 1) }; 468 Linda* const _linda{ ToLinda<false>(L_, 1) };
469 bool const has_value{ lua_gettop(L_) > 2 }; 469 bool const _has_value{ lua_gettop(L_) > 2 };
470 // make sure the key is of a valid type (throws an error if not the case) 470 // make sure the key is of a valid type (throws an error if not the case)
471 check_key_types(L_, 2, 2); 471 check_key_types(L_, 2, 2);
472 472
473 Keeper* const K{ linda->whichKeeper() }; 473 Keeper* const _K{ _linda->whichKeeper() };
474 KeeperCallResult pushed; 474 KeeperCallResult _pushed;
475 if (linda->cancelRequest == CancelRequest::None) { 475 if (_linda->cancelRequest == CancelRequest::None) {
476 if (has_value) { 476 if (_has_value) {
477 // convert nils to some special non-nil sentinel in sent values 477 // convert nils to some special non-nil sentinel in sent values
478 keeper_toggle_nil_sentinels(L_, 3, LookupMode::ToKeeper); 478 keeper_toggle_nil_sentinels(L_, 3, LookupMode::ToKeeper);
479 } 479 }
480 pushed = keeper_call(linda->U, K->L, KEEPER_API(set), L_, linda, 2); 480 _pushed = keeper_call(_K->L, KEEPER_API(set), L_, _linda, 2);
481 if (pushed.has_value()) { // no error? 481 if (_pushed.has_value()) { // no error?
482 LUA_ASSERT(L_, pushed.value() == 0 || pushed.value() == 1); 482 LUA_ASSERT(L_, _pushed.value() == 0 || _pushed.value() == 1);
483 483
484 if (has_value) { 484 if (_has_value) {
485 // we put some data in the slot, tell readers that they should wake 485 // we put some data in the slot, tell readers that they should wake
486 linda->writeHappened.notify_all(); // To be done from within the 'K' locking area 486 _linda->writeHappened.notify_all(); // To be done from within the 'K' locking area
487 } 487 }
488 if (pushed.value() == 1) { 488 if (_pushed.value() == 1) {
489 // the key was full, but it is no longer the case, tell writers they should wake 489 // the key was full, but it is no longer the case, tell writers they should wake
490 LUA_ASSERT(L_, lua_type(L_, -1) == LUA_TBOOLEAN && lua_toboolean(L_, -1) == 1); 490 LUA_ASSERT(L_, lua_type(L_, -1) == LUA_TBOOLEAN && lua_toboolean(L_, -1) == 1);
491 linda->readHappened.notify_all(); // To be done from within the 'K' locking area 491 _linda->readHappened.notify_all(); // To be done from within the 'K' locking area
492 } 492 }
493 } 493 }
494 } else { // linda is cancelled 494 } else { // linda is cancelled
495 // do nothing and return lanes.cancel_error 495 // do nothing and return lanes.cancel_error
496 kCancelError.pushKey(L_); 496 kCancelError.pushKey(L_);
497 pushed.emplace(1); 497 _pushed.emplace(1);
498 } 498 }
499 499
500 // must trigger any error after keeper state has been released 500 // must trigger any error after keeper state has been released
501 return OptionalValue(pushed, L_, "tried to copy unsupported types"); 501 return OptionalValue(_pushed, L_, "tried to copy unsupported types");
502 }; 502 };
503 return Linda::ProtectedCall(L_, set); 503 return Linda::ProtectedCall(L_, set);
504} 504}
@@ -512,16 +512,16 @@ LUAG_FUNC(linda_set)
512 */ 512 */
513LUAG_FUNC(linda_count) 513LUAG_FUNC(linda_count)
514{ 514{
515 auto count = [](lua_State* L_) { 515 auto _count = [](lua_State* L_) {
516 Linda* const linda{ ToLinda<false>(L_, 1) }; 516 Linda* const _linda{ ToLinda<false>(L_, 1) };
517 // make sure the keys are of a valid type 517 // make sure the keys are of a valid type
518 check_key_types(L_, 2, lua_gettop(L_)); 518 check_key_types(L_, 2, lua_gettop(L_));
519 519
520 Keeper* const K{ linda->whichKeeper() }; 520 Keeper* const _K{ _linda->whichKeeper() };
521 KeeperCallResult const pushed{ keeper_call(linda->U, K->L, KEEPER_API(count), L_, linda, 2) }; 521 KeeperCallResult const _pushed{ keeper_call(_K->L, KEEPER_API(count), L_, _linda, 2) };
522 return OptionalValue(pushed, L_, "tried to count an invalid key"); 522 return OptionalValue(_pushed, L_, "tried to count an invalid key");
523 }; 523 };
524 return Linda::ProtectedCall(L_, count); 524 return Linda::ProtectedCall(L_, _count);
525} 525}
526 526
527// ################################################################################################# 527// #################################################################################################
@@ -534,27 +534,27 @@ LUAG_FUNC(linda_count)
534LUAG_FUNC(linda_get) 534LUAG_FUNC(linda_get)
535{ 535{
536 auto get = [](lua_State* L_) { 536 auto get = [](lua_State* L_) {
537 Linda* const linda{ ToLinda<false>(L_, 1) }; 537 Linda* const _linda{ ToLinda<false>(L_, 1) };
538 lua_Integer const count{ luaL_optinteger(L_, 3, 1) }; 538 lua_Integer const _count{ luaL_optinteger(L_, 3, 1) };
539 luaL_argcheck(L_, count >= 1, 3, "count should be >= 1"); 539 luaL_argcheck(L_, _count >= 1, 3, "count should be >= 1");
540 luaL_argcheck(L_, lua_gettop(L_) <= 3, 4, "too many arguments"); 540 luaL_argcheck(L_, lua_gettop(L_) <= 3, 4, "too many arguments");
541 // make sure the key is of a valid type (throws an error if not the case) 541 // make sure the key is of a valid type (throws an error if not the case)
542 check_key_types(L_, 2, 2); 542 check_key_types(L_, 2, 2);
543 543
544 KeeperCallResult pushed; 544 KeeperCallResult _pushed;
545 if (linda->cancelRequest == CancelRequest::None) { 545 if (_linda->cancelRequest == CancelRequest::None) {
546 Keeper* const K{ linda->whichKeeper() }; 546 Keeper* const _K{ _linda->whichKeeper() };
547 pushed = keeper_call(linda->U, K->L, KEEPER_API(get), L_, linda, 2); 547 _pushed = keeper_call(_K->L, KEEPER_API(get), L_, _linda, 2);
548 if (pushed.value_or(0) > 0) { 548 if (_pushed.value_or(0) > 0) {
549 keeper_toggle_nil_sentinels(L_, lua_gettop(L_) - pushed.value(), LookupMode::FromKeeper); 549 keeper_toggle_nil_sentinels(L_, lua_gettop(L_) - _pushed.value(), LookupMode::FromKeeper);
550 } 550 }
551 } else { // linda is cancelled 551 } else { // linda is cancelled
552 // do nothing and return lanes.cancel_error 552 // do nothing and return lanes.cancel_error
553 kCancelError.pushKey(L_); 553 kCancelError.pushKey(L_);
554 pushed.emplace(1); 554 _pushed.emplace(1);
555 } 555 }
556 // an error can be raised if we attempt to read an unregistered function 556 // an error can be raised if we attempt to read an unregistered function
557 return OptionalValue(pushed, L_, "tried to copy unsupported types"); 557 return OptionalValue(_pushed, L_, "tried to copy unsupported types");
558 }; 558 };
559 return Linda::ProtectedCall(L_, get); 559 return Linda::ProtectedCall(L_, get);
560} 560}
@@ -569,8 +569,8 @@ LUAG_FUNC(linda_get)
569 */ 569 */
570LUAG_FUNC(linda_limit) 570LUAG_FUNC(linda_limit)
571{ 571{
572 auto limit = [](lua_State* L_) { 572 auto _limit = [](lua_State* L_) {
573 Linda* const linda{ ToLinda<false>(L_, 1) }; 573 Linda* const _linda{ ToLinda<false>(L_, 1) };
574 // make sure we got 3 arguments: the linda, a key and a limit 574 // make sure we got 3 arguments: the linda, a key and a limit
575 luaL_argcheck(L_, lua_gettop(L_) == 3, 2, "wrong number of arguments"); 575 luaL_argcheck(L_, lua_gettop(L_) == 3, 2, "wrong number of arguments");
576 // make sure we got a numeric limit 576 // make sure we got a numeric limit
@@ -578,24 +578,24 @@ LUAG_FUNC(linda_limit)
578 // make sure the key is of a valid type 578 // make sure the key is of a valid type
579 check_key_types(L_, 2, 2); 579 check_key_types(L_, 2, 2);
580 580
581 KeeperCallResult pushed; 581 KeeperCallResult _pushed;
582 if (linda->cancelRequest == CancelRequest::None) { 582 if (_linda->cancelRequest == CancelRequest::None) {
583 Keeper* const K{ linda->whichKeeper() }; 583 Keeper* const _K{ _linda->whichKeeper() };
584 pushed = keeper_call(linda->U, K->L, KEEPER_API(limit), L_, linda, 2); 584 _pushed = keeper_call(_K->L, KEEPER_API(limit), L_, _linda, 2);
585 LUA_ASSERT(L_, pushed.has_value() && (pushed.value() == 0 || pushed.value() == 1)); // no error, optional boolean value saying if we should wake blocked writer threads 585 LUA_ASSERT(L_, _pushed.has_value() && (_pushed.value() == 0 || _pushed.value() == 1)); // no error, optional boolean value saying if we should wake blocked writer threads
586 if (pushed.value() == 1) { 586 if (_pushed.value() == 1) {
587 LUA_ASSERT(L_, lua_type(L_, -1) == LUA_TBOOLEAN && lua_toboolean(L_, -1) == 1); 587 LUA_ASSERT(L_, lua_type(L_, -1) == LUA_TBOOLEAN && lua_toboolean(L_, -1) == 1);
588 linda->readHappened.notify_all(); // To be done from within the 'K' locking area 588 _linda->readHappened.notify_all(); // To be done from within the 'K' locking area
589 } 589 }
590 } else { // linda is cancelled 590 } else { // linda is cancelled
591 // do nothing and return lanes.cancel_error 591 // do nothing and return lanes.cancel_error
592 kCancelError.pushKey(L_); 592 kCancelError.pushKey(L_);
593 pushed.emplace(1); 593 _pushed.emplace(1);
594 } 594 }
595 // propagate pushed boolean if any 595 // propagate pushed boolean if any
596 return pushed.value(); 596 return _pushed.value();
597 }; 597 };
598 return Linda::ProtectedCall(L_, limit); 598 return Linda::ProtectedCall(L_, _limit);
599} 599}
600 600
601// ################################################################################################# 601// #################################################################################################
@@ -607,23 +607,23 @@ LUAG_FUNC(linda_limit)
607 */ 607 */
608LUAG_FUNC(linda_cancel) 608LUAG_FUNC(linda_cancel)
609{ 609{
610 Linda* const linda{ ToLinda<false>(L_, 1) }; 610 Linda* const _linda{ ToLinda<false>(L_, 1) };
611 char const* who = luaL_optstring(L_, 2, "both"); 611 char const* _who{ luaL_optstring(L_, 2, "both") };
612 // make sure we got 3 arguments: the linda, a key and a limit 612 // make sure we got 3 arguments: the linda, a key and a limit
613 luaL_argcheck(L_, lua_gettop(L_) <= 2, 2, "wrong number of arguments"); 613 luaL_argcheck(L_, lua_gettop(L_) <= 2, 2, "wrong number of arguments");
614 614
615 linda->cancelRequest = CancelRequest::Soft; 615 _linda->cancelRequest = CancelRequest::Soft;
616 if (strcmp(who, "both") == 0) { // tell everyone writers to wake up 616 if (strcmp(_who, "both") == 0) { // tell everyone writers to wake up
617 linda->writeHappened.notify_all(); 617 _linda->writeHappened.notify_all();
618 linda->readHappened.notify_all(); 618 _linda->readHappened.notify_all();
619 } else if (strcmp(who, "none") == 0) { // reset flag 619 } else if (strcmp(_who, "none") == 0) { // reset flag
620 linda->cancelRequest = CancelRequest::None; 620 _linda->cancelRequest = CancelRequest::None;
621 } else if (strcmp(who, "read") == 0) { // tell blocked readers to wake up 621 } else if (strcmp(_who, "read") == 0) { // tell blocked readers to wake up
622 linda->writeHappened.notify_all(); 622 _linda->writeHappened.notify_all();
623 } else if (strcmp(who, "write") == 0) { // tell blocked writers to wake up 623 } else if (strcmp(_who, "write") == 0) { // tell blocked writers to wake up
624 linda->readHappened.notify_all(); 624 _linda->readHappened.notify_all();
625 } else { 625 } else {
626 raise_luaL_error(L_, "unknown wake hint '%s'", who); 626 raise_luaL_error(L_, "unknown wake hint '%s'", _who);
627 } 627 }
628 return 0; 628 return 0;
629} 629}
@@ -642,8 +642,8 @@ LUAG_FUNC(linda_cancel)
642 */ 642 */
643LUAG_FUNC(linda_deep) 643LUAG_FUNC(linda_deep)
644{ 644{
645 Linda* const linda{ ToLinda<false>(L_, 1) }; 645 Linda* const _linda{ ToLinda<false>(L_, 1) };
646 lua_pushlightuserdata(L_, linda); // just the address 646 lua_pushlightuserdata(L_, _linda); // just the address
647 return 1; 647 return 1;
648} 648}
649 649
@@ -660,15 +660,15 @@ LUAG_FUNC(linda_deep)
660template <bool OPT> 660template <bool OPT>
661[[nodiscard]] static int LindaToString(lua_State* L_, int idx_) 661[[nodiscard]] static int LindaToString(lua_State* L_, int idx_)
662{ 662{
663 Linda* const linda{ ToLinda<OPT>(L_, idx_) }; 663 Linda* const _linda{ ToLinda<OPT>(L_, idx_) };
664 if (linda != nullptr) { 664 if (_linda != nullptr) {
665 char text[128]; 665 char _text[128];
666 int len; 666 int _len;
667 if (linda->getName()) 667 if (_linda->getName())
668 len = sprintf(text, "Linda: %.*s", (int) sizeof(text) - 8, linda->getName()); 668 _len = sprintf(_text, "Linda: %.*s", (int) sizeof(_text) - 8, _linda->getName());
669 else 669 else
670 len = sprintf(text, "Linda: %p", linda); 670 _len = sprintf(_text, "Linda: %p", _linda);
671 lua_pushlstring(L_, text, len); 671 lua_pushlstring(L_, _text, _len);
672 return 1; 672 return 1;
673 } 673 }
674 return 0; 674 return 0;
@@ -692,17 +692,17 @@ LUAG_FUNC(linda_tostring)
692 */ 692 */
693LUAG_FUNC(linda_concat) 693LUAG_FUNC(linda_concat)
694{ // L_: linda1? linda2? 694{ // L_: linda1? linda2?
695 bool atLeastOneLinda{ false }; 695 bool _atLeastOneLinda{ false };
696 // Lua semantics enforce that one of the 2 arguments is a Linda, but not necessarily both. 696 // Lua semantics enforce that one of the 2 arguments is a Linda, but not necessarily both.
697 if (LindaToString<true>(L_, 1)) { 697 if (LindaToString<true>(L_, 1)) {
698 atLeastOneLinda = true; 698 _atLeastOneLinda = true;
699 lua_replace(L_, 1); 699 lua_replace(L_, 1);
700 } 700 }
701 if (LindaToString<true>(L_, 2)) { 701 if (LindaToString<true>(L_, 2)) {
702 atLeastOneLinda = true; 702 _atLeastOneLinda = true;
703 lua_replace(L_, 2); 703 lua_replace(L_, 2);
704 } 704 }
705 if (!atLeastOneLinda) { // should not be possible 705 if (!_atLeastOneLinda) { // should not be possible
706 raise_luaL_error(L_, "internal error: linda_concat called on non-Linda"); 706 raise_luaL_error(L_, "internal error: linda_concat called on non-Linda");
707 } 707 }
708 lua_concat(L_, 2); 708 lua_concat(L_, 2);
@@ -717,11 +717,11 @@ LUAG_FUNC(linda_concat)
717 */ 717 */
718LUAG_FUNC(linda_dump) 718LUAG_FUNC(linda_dump)
719{ 719{
720 auto dump = [](lua_State* L_) { 720 auto _dump = [](lua_State* L_) {
721 Linda* const linda{ ToLinda<false>(L_, 1) }; 721 Linda* const _linda{ ToLinda<false>(L_, 1) };
722 return keeper_push_linda_storage(*linda, DestState{ L_ }); 722 return keeper_push_linda_storage(*_linda, DestState{ L_ });
723 }; 723 };
724 return Linda::ProtectedCall(L_, dump); 724 return Linda::ProtectedCall(L_, _dump);
725} 725}
726 726
727// ################################################################################################# 727// #################################################################################################
@@ -732,13 +732,13 @@ LUAG_FUNC(linda_dump)
732 */ 732 */
733LUAG_FUNC(linda_towatch) 733LUAG_FUNC(linda_towatch)
734{ 734{
735 Linda* const linda{ ToLinda<false>(L_, 1) }; 735 Linda* const _linda{ ToLinda<false>(L_, 1) };
736 int pushed{ keeper_push_linda_storage(*linda, DestState{ L_ }) }; 736 int _pushed{ keeper_push_linda_storage(*_linda, DestState{ L_ }) };
737 if (pushed == 0) { 737 if (_pushed == 0) {
738 // if the linda is empty, don't return nil 738 // if the linda is empty, don't return nil
739 pushed = LindaToString<false>(L_, 1); 739 _pushed = LindaToString<false>(L_, 1);
740 } 740 }
741 return pushed; 741 return _pushed;
742} 742}
743 743
744// ################################################################################################# 744// #################################################################################################
@@ -773,12 +773,12 @@ namespace global {
773 */ 773 */
774LUAG_FUNC(linda) 774LUAG_FUNC(linda)
775{ 775{
776 int const top{ lua_gettop(L_) }; 776 int const _top{ lua_gettop(L_) };
777 luaL_argcheck(L_, top <= 2, top, "too many arguments"); 777 luaL_argcheck(L_, _top <= 2, _top, "too many arguments");
778 if (top == 1) { 778 if (_top == 1) {
779 LuaType const t{ lua_type_as_enum(L_, 1) }; 779 LuaType const _t{ lua_type_as_enum(L_, 1) };
780 luaL_argcheck(L_, t == LuaType::STRING || t == LuaType::NUMBER, 1, "wrong parameter (should be a string or a number)"); 780 luaL_argcheck(L_, _t == LuaType::STRING || _t == LuaType::NUMBER, 1, "wrong parameter (should be a string or a number)");
781 } else if (top == 2) { 781 } else if (_top == 2) {
782 luaL_checktype(L_, 1, LUA_TSTRING); 782 luaL_checktype(L_, 1, LUA_TSTRING);
783 luaL_checktype(L_, 2, LUA_TNUMBER); 783 luaL_checktype(L_, 2, LUA_TNUMBER);
784 } 784 }
diff --git a/src/lindafactory.cpp b/src/lindafactory.cpp
index 0ec5a0a..16c653f 100644
--- a/src/lindafactory.cpp
+++ b/src/lindafactory.cpp
@@ -68,25 +68,25 @@ void LindaFactory::createMetatable(lua_State* L_) const
68 68
69void LindaFactory::deleteDeepObjectInternal(lua_State* L_, DeepPrelude* o_) const 69void LindaFactory::deleteDeepObjectInternal(lua_State* L_, DeepPrelude* o_) const
70{ 70{
71 Linda* const linda{ static_cast<Linda*>(o_) }; 71 Linda* const _linda{ static_cast<Linda*>(o_) };
72 LUA_ASSERT(L_, linda); 72 LUA_ASSERT(L_, _linda);
73 Keeper* const myK{ linda->whichKeeper() }; 73 Keeper* const _myK{ _linda->whichKeeper() };
74 // if collected after the universe, keepers are already destroyed, and there is nothing to clear 74 // if collected after the universe, keepers are already destroyed, and there is nothing to clear
75 if (myK) { 75 if (_myK) {
76 // if collected from my own keeper, we can't acquire/release it 76 // if collected from my own keeper, we can't acquire/release it
77 // because we are already inside a protected area, and trying to do so would deadlock! 77 // because we are already inside a protected area, and trying to do so would deadlock!
78 bool const need_acquire_release{ myK->L != L_ }; 78 bool const _need_acquire_release{ _myK->L != L_ };
79 // Clean associated structures in the keeper state. 79 // Clean associated structures in the keeper state.
80 Keeper* const K{ need_acquire_release ? linda->acquireKeeper() : myK }; 80 Keeper* const _K{ _need_acquire_release ? _linda->acquireKeeper() : _myK };
81 // hopefully this won't ever raise an error as we would jump to the closest pcall site while forgetting to release the keeper mutex... 81 // hopefully this won't ever raise an error as we would jump to the closest pcall site while forgetting to release the keeper mutex...
82 [[maybe_unused]] KeeperCallResult const result{ keeper_call(linda->U, K->L, KEEPER_API(clear), L_, linda, 0) }; 82 [[maybe_unused]] KeeperCallResult const result{ keeper_call(_K->L, KEEPER_API(clear), L_, _linda, 0) };
83 LUA_ASSERT(L_, result.has_value() && result.value() == 0); 83 LUA_ASSERT(L_, result.has_value() && result.value() == 0);
84 if (need_acquire_release) { 84 if (_need_acquire_release) {
85 linda->releaseKeeper(K); 85 _linda->releaseKeeper(_K);
86 } 86 }
87 } 87 }
88 88
89 delete linda; // operator delete overload ensures things go as expected 89 delete _linda; // operator delete overload ensures things go as expected
90} 90}
91 91
92// ################################################################################################# 92// #################################################################################################
@@ -103,9 +103,9 @@ char const* LindaFactory::moduleName() const
103 103
104DeepPrelude* LindaFactory::newDeepObjectInternal(lua_State* L_) const 104DeepPrelude* LindaFactory::newDeepObjectInternal(lua_State* L_) const
105{ 105{
106 size_t name_len{ 0 }; 106 size_t _name_len{ 0 };
107 char const* linda_name{ nullptr }; 107 char const* _linda_name{ nullptr };
108 LindaGroup linda_group{ 0 }; 108 LindaGroup _linda_group{ 0 };
109 // should have a string and/or a number of the stack as parameters (name and group) 109 // should have a string and/or a number of the stack as parameters (name and group)
110 switch (lua_gettop(L_)) { 110 switch (lua_gettop(L_)) {
111 default: // 0 111 default: // 0
@@ -113,21 +113,21 @@ DeepPrelude* LindaFactory::newDeepObjectInternal(lua_State* L_) const
113 113
114 case 1: // 1 parameter, either a name or a group 114 case 1: // 1 parameter, either a name or a group
115 if (lua_type(L_, -1) == LUA_TSTRING) { 115 if (lua_type(L_, -1) == LUA_TSTRING) {
116 linda_name = lua_tolstring(L_, -1, &name_len); 116 _linda_name = lua_tolstring(L_, -1, &_name_len);
117 } else { 117 } else {
118 linda_group = LindaGroup{ static_cast<int>(lua_tointeger(L_, -1)) }; 118 _linda_group = LindaGroup{ static_cast<int>(lua_tointeger(L_, -1)) };
119 } 119 }
120 break; 120 break;
121 121
122 case 2: // 2 parameters, a name and group, in that order 122 case 2: // 2 parameters, a name and group, in that order
123 linda_name = lua_tolstring(L_, -2, &name_len); 123 _linda_name = lua_tolstring(L_, -2, &_name_len);
124 linda_group = LindaGroup{ static_cast<int>(lua_tointeger(L_, -1)) }; 124 _linda_group = LindaGroup{ static_cast<int>(lua_tointeger(L_, -1)) };
125 break; 125 break;
126 } 126 }
127 127
128 // The deep data is allocated separately of Lua stack; we might no longer be around when last reference to it is being released. 128 // The deep data is allocated separately of Lua stack; we might no longer be around when last reference to it is being released.
129 // 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 // 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
130 Universe* const U{ universe_get(L_) }; 130 Universe* const _U{ universe_get(L_) };
131 Linda* const linda{ new (U) Linda{ U, linda_group, linda_name, name_len } }; 131 Linda* const _linda{ new (_U) Linda{ _U, _linda_group, _linda_name, _name_len } };
132 return linda; 132 return _linda;
133} 133}
diff --git a/src/macros_and_utils.h b/src/macros_and_utils.h
index a8738a8..aa81db4 100644
--- a/src/macros_and_utils.h
+++ b/src/macros_and_utils.h
@@ -61,7 +61,7 @@ template <typename... ARGS>
61 61
62// ################################################################################################# 62// #################################################################################################
63 63
64#define USE_DEBUG_SPEW() 1 64#define USE_DEBUG_SPEW() 0
65#if USE_DEBUG_SPEW() 65#if USE_DEBUG_SPEW()
66#define INDENT_BEGIN "%.*s " 66#define INDENT_BEGIN "%.*s "
67#define INDENT_END(U_) , (U_ ? U_->debugspewIndentDepth.load(std::memory_order_relaxed) : 0), DebugSpewIndentScope::debugspew_indent 67#define INDENT_END(U_) , (U_ ? U_->debugspewIndentDepth.load(std::memory_order_relaxed) : 0), DebugSpewIndentScope::debugspew_indent
diff --git a/src/state.cpp b/src/state.cpp
index 7252885..563fbc2 100644
--- a/src/state.cpp
+++ b/src/state.cpp
@@ -53,9 +53,8 @@ THE SOFTWARE.
53// 53//
54[[nodiscard]] static int luaG_new_require(lua_State* L_) 54[[nodiscard]] static int luaG_new_require(lua_State* L_)
55{ 55{
56 int rc; 56 int const _args{ lua_gettop(L_) }; // L_: args
57 int const args = lua_gettop(L_); // L_: args 57 Universe* const _U{ universe_get(L_) };
58 Universe* U = universe_get(L_);
59 // char const* modname = luaL_checkstring(L_, 1); 58 // char const* modname = luaL_checkstring(L_, 1);
60 59
61 STACK_GROW(L_, 1); 60 STACK_GROW(L_, 1);
@@ -66,18 +65,18 @@ THE SOFTWARE.
66 // Using 'lua_pcall()' to catch errors; otherwise a failing 'require' would 65 // Using 'lua_pcall()' to catch errors; otherwise a failing 'require' would
67 // leave us locked, blocking any future 'require' calls from other lanes. 66 // leave us locked, blocking any future 'require' calls from other lanes.
68 67
69 U->requireMutex.lock(); 68 _U->requireMutex.lock();
70 // starting with Lua 5.4, require may return a second optional value, so we need LUA_MULTRET 69 // starting with Lua 5.4, require may return a second optional value, so we need LUA_MULTRET
71 rc = lua_pcall(L_, args, LUA_MULTRET, 0 /*errfunc*/); // L_: err|result(s) 70 int _rc{ lua_pcall(L_, _args, LUA_MULTRET, 0 /*errfunc*/) }; // L_: err|result(s)
72 U->requireMutex.unlock(); 71 _U->requireMutex.unlock();
73 72
74 // the required module (or an error message) is left on the stack as returned value by original require function 73 // the required module (or an error message) is left on the stack as returned value by original require function
75 74
76 if (rc != LUA_OK) { // LUA_ERRRUN / LUA_ERRMEM ? 75 if (_rc != LUA_OK) { // LUA_ERRRUN / LUA_ERRMEM ?
77 raise_lua_error(L_); 76 raise_lua_error(L_);
78 } 77 }
79 // should be 1 for Lua <= 5.3, 1 or 2 starting with Lua 5.4 78 // should be 1 for Lua <= 5.3, 1 or 2 starting with Lua 5.4
80 return lua_gettop(L_); // L_: result(s) 79 return lua_gettop(L_); // L_: result(s)
81} 80}
82 81
83// ################################################################################################# 82// #################################################################################################
@@ -149,9 +148,7 @@ namespace global
149 { LUA_JITLIBNAME, luaopen_jit }, 148 { LUA_JITLIBNAME, luaopen_jit },
150#endif // LUAJIT_FLAVOR() 149#endif // LUAJIT_FLAVOR()
151 150
152 { kLanesCoreLibName, require_lanes_core }, // So that we can open it like any base library (possible since we have access to the init function) 151 { kLanesCoreLibName, require_lanes_core } // So that we can open it like any base library (possible since we have access to the init function)
153 //
154 { nullptr, nullptr }
155 }; 152 };
156 153
157} // namespace global 154} // namespace global
@@ -160,18 +157,18 @@ namespace global
160 157
161static void open1lib(DEBUGSPEW_PARAM_COMMA(Universe* U_) lua_State* L_, char const* name_, size_t len_) 158static void open1lib(DEBUGSPEW_PARAM_COMMA(Universe* U_) lua_State* L_, char const* name_, size_t len_)
162{ 159{
163 for (int i{ 0 }; global::sLibs[i].name; ++i) { 160 for (luaL_Reg const& _entry : global::sLibs) {
164 if (strncmp(name_, global::sLibs[i].name, len_) == 0) { 161 if (strncmp(name_, _entry.name, len_) == 0) {
165 lua_CFunction const libfunc{ global::sLibs[i].func }; 162 lua_CFunction const _libfunc{ _entry.func };
166 if (!libfunc) { 163 if (!_libfunc) {
167 continue; 164 continue;
168 } 165 }
169 name_ = global::sLibs[i].name; // note that the provided name_ doesn't necessarily ends with '\0', hence len_ 166 name_ = _entry.name; // note that the provided name_ doesn't necessarily ends with '\0', hence len_
170 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "opening %.*s library\n" INDENT_END(U_), (int) len_, name_)); 167 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "opening %.*s library\n" INDENT_END(U_), (int) len_, name_));
171 STACK_CHECK_START_REL(L_, 0); 168 STACK_CHECK_START_REL(L_, 0);
172 // open the library as if through require(), and create a global as well if necessary (the library table is left on the stack) 169 // open the library as if through require(), and create a global as well if necessary (the library table is left on the stack)
173 bool const isLanesCore{ libfunc == require_lanes_core }; // don't want to create a global for "lanes.core" 170 bool const isLanesCore{ _libfunc == require_lanes_core }; // don't want to create a global for "lanes.core"
174 luaL_requiref(L_, name_, libfunc, !isLanesCore); // L_: {lib} 171 luaL_requiref(L_, name_, _libfunc, !isLanesCore); // L_: {lib}
175 // lanes.core doesn't declare a global, so scan it here and now 172 // lanes.core doesn't declare a global, so scan it here and now
176 if (isLanesCore) { 173 if (isLanesCore) {
177 populate_func_lookup_table(L_, -1, name_); 174 populate_func_lookup_table(L_, -1, name_);
@@ -196,7 +193,7 @@ static inline void open1lib(DEBUGSPEW_PARAM_COMMA(Universe* U_) lua_State* L_, c
196// just like lua_xmove, args are (from, to) 193// just like lua_xmove, args are (from, to)
197static void copy_one_time_settings(Universe* U_, SourceState L1_, DestState L2_) 194static void copy_one_time_settings(Universe* U_, SourceState L1_, DestState L2_)
198{ 195{
199 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ U_ }); 196 DEBUGSPEW_CODE(DebugSpewIndentScope _scope{ U_ });
200 197
201 STACK_GROW(L1_, 2); 198 STACK_GROW(L1_, 2);
202 STACK_CHECK_START_REL(L1_, 0); 199 STACK_CHECK_START_REL(L1_, 0);
@@ -206,8 +203,8 @@ static void copy_one_time_settings(Universe* U_, SourceState L1_, DestState L2_)
206 203
207 kConfigRegKey.pushValue(L1_); // L1_: config 204 kConfigRegKey.pushValue(L1_); // L1_: config
208 // copy settings from from source to destination registry 205 // copy settings from from source to destination registry
209 InterCopyContext c{ U_, L2_, L1_, {}, {}, {}, {}, {} }; 206 InterCopyContext _c{ U_, L2_, L1_, {}, {}, {}, {}, {} };
210 if (c.inter_move(1) != InterCopyResult::Success) { // L1_: L2_: config 207 if (_c.inter_move(1) != InterCopyResult::Success) { // L1_: L2_: config
211 raise_luaL_error(L1_, "failed to copy settings when loading " kLanesCoreLibName); 208 raise_luaL_error(L1_, "failed to copy settings when loading " kLanesCoreLibName);
212 } 209 }
213 // set L2:_R[kConfigRegKey] = settings 210 // set L2:_R[kConfigRegKey] = settings
@@ -227,8 +224,8 @@ void initializeOnStateCreate(Universe* U_, lua_State* L_)
227 U_->onStateCreateFunc = lua_tocfunction(L_, -1); // L_: settings on_state_create 224 U_->onStateCreateFunc = lua_tocfunction(L_, -1); // L_: settings on_state_create
228 if (U_->onStateCreateFunc != nullptr) { 225 if (U_->onStateCreateFunc != nullptr) {
229 // make sure the function doesn't have upvalues 226 // make sure the function doesn't have upvalues
230 char const* upname = lua_getupvalue(L_, -1, 1); // L_: settings on_state_create upval? 227 char const* _upname{ lua_getupvalue(L_, -1, 1) }; // L_: settings on_state_create upval?
231 if (upname != nullptr) { // should be "" for C functions with upvalues if any 228 if (_upname != nullptr) { // should be "" for C functions with upvalues if any
232 raise_luaL_error(L_, "on_state_create shouldn't have upvalues"); 229 raise_luaL_error(L_, "on_state_create shouldn't have upvalues");
233 } 230 }
234 // remove this C function from the config table so that it doesn't cause problems 231 // remove this C function from the config table so that it doesn't cause problems
@@ -248,29 +245,29 @@ void initializeOnStateCreate(Universe* U_, lua_State* L_)
248 245
249lua_State* create_state([[maybe_unused]] Universe* U_, lua_State* from_) 246lua_State* create_state([[maybe_unused]] Universe* U_, lua_State* from_)
250{ 247{
251 lua_State* L; 248 lua_State* _L;
252#if LUAJIT_FLAVOR() == 64 249#if LUAJIT_FLAVOR() == 64
253 // for some reason, LuaJIT 64 bits does not support creating a state with lua_newstate... 250 // for some reason, LuaJIT 64 bits does not support creating a state with lua_newstate...
254 L = luaL_newstate(); 251 _L = luaL_newstate();
255#else // LUAJIT_FLAVOR() == 64 252#else // LUAJIT_FLAVOR() == 64
256 if (U_->provideAllocator != nullptr) { // we have a function we can call to obtain an allocator 253 if (U_->provideAllocator != nullptr) { // we have a function we can call to obtain an allocator
257 lua_pushcclosure(from_, U_->provideAllocator, 0); 254 lua_pushcclosure(from_, U_->provideAllocator, 0);
258 lua_call(from_, 0, 1); 255 lua_call(from_, 0, 1);
259 { 256 {
260 AllocatorDefinition* const def{ lua_tofulluserdata<AllocatorDefinition>(from_, -1) }; 257 AllocatorDefinition* const def{ lua_tofulluserdata<AllocatorDefinition>(from_, -1) };
261 L = lua_newstate(def->allocF, def->allocUD); 258 _L = lua_newstate(def->allocF, def->allocUD);
262 } 259 }
263 lua_pop(from_, 1); 260 lua_pop(from_, 1);
264 } else { 261 } else {
265 // reuse the allocator provided when the master state was created 262 // reuse the allocator provided when the master state was created
266 L = lua_newstate(U_->protectedAllocator.allocF, U_->protectedAllocator.allocUD); 263 _L = lua_newstate(U_->protectedAllocator.allocF, U_->protectedAllocator.allocUD);
267 } 264 }
268#endif // LUAJIT_FLAVOR() == 64 265#endif // LUAJIT_FLAVOR() == 64
269 266
270 if (L == nullptr) { 267 if (_L == nullptr) {
271 raise_luaL_error(from_, "luaG_newstate() failed while creating state; out of memory"); 268 raise_luaL_error(from_, "luaG_newstate() failed while creating state; out of memory");
272 } 269 }
273 return L; 270 return _L;
274} 271}
275 272
276// ################################################################################################# 273// #################################################################################################
@@ -321,34 +318,34 @@ void callOnStateCreate(Universe* U_, lua_State* L_, lua_State* from_, LookupMode
321 */ 318 */
322lua_State* luaG_newstate(Universe* U_, SourceState from_, char const* libs_) 319lua_State* luaG_newstate(Universe* U_, SourceState from_, char const* libs_)
323{ 320{
324 DestState const L{ create_state(U_, from_) }; 321 DestState const _L{ create_state(U_, from_) };
325 322
326 STACK_GROW(L, 2); 323 STACK_GROW(_L, 2);
327 STACK_CHECK_START_ABS(L, 0); 324 STACK_CHECK_START_ABS(_L, 0);
328 325
329 // copy the universe as a light userdata (only the master state holds the full userdata) 326 // copy the universe as a light userdata (only the master state holds the full userdata)
330 // that way, if Lanes is required in this new state, we'll know we are part of this universe 327 // that way, if Lanes is required in this new state, we'll know we are part of this universe
331 universe_store(L, U_); 328 universe_store(_L, U_);
332 STACK_CHECK(L, 0); 329 STACK_CHECK(_L, 0);
333 330
334 // we'll need this every time we transfer some C function from/to this state 331 // we'll need this every time we transfer some C function from/to this state
335 kLookupRegKey.setValue(L, [](lua_State* L_) { lua_newtable(L_); }); 332 kLookupRegKey.setValue(_L, [](lua_State* L_) { lua_newtable(L_); });
336 STACK_CHECK(L, 0); 333 STACK_CHECK(_L, 0);
337 334
338 // neither libs (not even 'base') nor special init func: we are done 335 // neither libs (not even 'base') nor special init func: we are done
339 if (libs_ == nullptr && U_->onStateCreateFunc == nullptr) { 336 if (libs_ == nullptr && U_->onStateCreateFunc == nullptr) {
340 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "luaG_newstate(nullptr)\n" INDENT_END(U_))); 337 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "luaG_newstate(nullptr)\n" INDENT_END(U_)));
341 return L; 338 return _L;
342 } 339 }
343 340
344 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "luaG_newstate()\n" INDENT_END(U_))); 341 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "luaG_newstate()\n" INDENT_END(U_)));
345 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ U_ }); 342 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ U_ });
346 343
347 // copy settings (for example because it may contain a Lua on_state_create function) 344 // copy settings (for example because it may contain a Lua on_state_create function)
348 copy_one_time_settings(U_, from_, L); 345 copy_one_time_settings(U_, from_, _L);
349 346
350 // 'lua.c' stops GC during initialization so perhaps it is a good idea. :) 347 // 'lua.c' stops GC during initialization so perhaps it is a good idea. :)
351 lua_gc(L, LUA_GCSTOP, 0); 348 lua_gc(_L, LUA_GCSTOP, 0);
352 349
353 // Anything causes 'base' to be taken in 350 // Anything causes 'base' to be taken in
354 if (libs_ != nullptr) { 351 if (libs_ != nullptr) {
@@ -356,24 +353,24 @@ lua_State* luaG_newstate(Universe* U_, SourceState from_, char const* libs_)
356 // as we are called from luaopen_lanes_core() already, and that would deadlock 353 // as we are called from luaopen_lanes_core() already, and that would deadlock
357 if (libs_[0] == '*' && libs_[1] == 0) { 354 if (libs_[0] == '*' && libs_[1] == 0) {
358 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "opening ALL standard libraries\n" INDENT_END(U_))); 355 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "opening ALL standard libraries\n" INDENT_END(U_)));
359 luaL_openlibs(L); 356 luaL_openlibs(_L);
360 // don't forget lanes.core for regular lane states 357 // don't forget lanes.core for regular lane states
361 open1lib(DEBUGSPEW_PARAM_COMMA(U_) L, kLanesCoreLibName); 358 open1lib(DEBUGSPEW_PARAM_COMMA(U_) _L, kLanesCoreLibName);
362 libs_ = nullptr; // done with libs 359 libs_ = nullptr; // done with libs
363 } else { 360 } else {
364 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "opening base library\n" INDENT_END(U_))); 361 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "opening base library\n" INDENT_END(U_)));
365#if LUA_VERSION_NUM >= 502 362#if LUA_VERSION_NUM >= 502
366 // open base library the same way as in luaL_openlibs() 363 // open base library the same way as in luaL_openlibs()
367 luaL_requiref(L, "_G", luaopen_base, 1); 364 luaL_requiref(_L, "_G", luaopen_base, 1);
368 lua_pop(L, 1); 365 lua_pop(_L, 1);
369#else // LUA_VERSION_NUM 366#else // LUA_VERSION_NUM
370 lua_pushcfunction(L, luaopen_base); 367 lua_pushcfunction(_L, luaopen_base);
371 lua_pushstring(L, ""); 368 lua_pushstring(_L, "");
372 lua_call(L, 1, 0); 369 lua_call(_L, 1, 0);
373#endif // LUA_VERSION_NUM 370#endif // LUA_VERSION_NUM
374 } 371 }
375 } 372 }
376 STACK_CHECK(L, 0); 373 STACK_CHECK(_L, 0);
377 374
378 // scan all libraries, open them one by one 375 // scan all libraries, open them one by one
379 if (libs_) { 376 if (libs_) {
@@ -387,40 +384,40 @@ lua_State* luaG_newstate(Universe* U_, SourceState from_, char const* libs_)
387 while (isalnum(p[len]) || p[len] == '.') 384 while (isalnum(p[len]) || p[len] == '.')
388 ++len; 385 ++len;
389 // open library 386 // open library
390 open1lib(DEBUGSPEW_PARAM_COMMA(U_) L, p, len); 387 open1lib(DEBUGSPEW_PARAM_COMMA(U_) _L, p, len);
391 } 388 }
392 } 389 }
393 lua_gc(L, LUA_GCRESTART, 0); 390 lua_gc(_L, LUA_GCRESTART, 0);
394 391
395 serialize_require(DEBUGSPEW_PARAM_COMMA(U_) L); 392 serialize_require(DEBUGSPEW_PARAM_COMMA(U_) _L);
396 393
397 // call this after the base libraries are loaded and GC is restarted 394 // call this after the base libraries are loaded and GC is restarted
398 // will raise an error in from_ in case of problem 395 // will raise an error in from_ in case of problem
399 callOnStateCreate(U_, L, from_, LookupMode::LaneBody); 396 callOnStateCreate(U_, _L, from_, LookupMode::LaneBody);
400 397
401 STACK_CHECK(L, 0); 398 STACK_CHECK(_L, 0);
402 // after all this, register everything we find in our name<->function database 399 // after all this, register everything we find in our name<->function database
403 lua_pushglobaltable(L); // Lua 5.2 no longer has LUA_GLOBALSINDEX: we must push globals table on the stack 400 lua_pushglobaltable(_L); // Lua 5.2 no longer has LUA_GLOBALSINDEX: we must push globals table on the stack
404 STACK_CHECK(L, 1); 401 STACK_CHECK(_L, 1);
405 populate_func_lookup_table(L, -1, nullptr); 402 populate_func_lookup_table(_L, -1, nullptr);
406 403
407#if 1 && USE_DEBUG_SPEW() 404#if 1 && USE_DEBUG_SPEW()
408 // dump the lookup database contents 405 // dump the lookup database contents
409 kLookupRegKey.pushValue(L); // L: {} 406 kLookupRegKey.pushValue(_L); // L: {}
410 lua_pushnil(L); // L: {} nil 407 lua_pushnil(_L); // L: {} nil
411 while (lua_next(L, -2)) { // L: {} k v 408 while (lua_next(_L, -2)) { // L: {} k v
412 lua_getglobal(L, "print"); // L: {} k v print 409 lua_getglobal(_L, "print"); // L: {} k v print
413 int const indent{ U_->debugspewIndentDepth.load(std::memory_order_relaxed) }; 410 int const indent{ U_->debugspewIndentDepth.load(std::memory_order_relaxed) };
414 lua_pushlstring(L, DebugSpewIndentScope::debugspew_indent, indent); // L: {} k v print " " 411 lua_pushlstring(_L, DebugSpewIndentScope::debugspew_indent, indent); // L: {} k v print " "
415 lua_pushvalue(L, -4); // L: {} k v print " " k 412 lua_pushvalue(_L, -4); // L: {} k v print " " k
416 lua_pushvalue(L, -4); // L: {} k v print " " k v 413 lua_pushvalue(_L, -4); // L: {} k v print " " k v
417 lua_call(L, 3, 0); // L: {} k v 414 lua_call(_L, 3, 0); // L: {} k v
418 lua_pop(L, 1); // L: {} k 415 lua_pop(_L, 1); // L: {} k
419 } 416 }
420 lua_pop(L, 1); // L: {} 417 lua_pop(_L, 1); // L: {}
421#endif // USE_DEBUG_SPEW() 418#endif // USE_DEBUG_SPEW()
422 419
423 lua_pop(L, 1); 420 lua_pop(_L, 1);
424 STACK_CHECK(L, 0); 421 STACK_CHECK(_L, 0);
425 return L; 422 return _L;
426} 423}
diff --git a/src/tools.cpp b/src/tools.cpp
index 2623da6..0cfe1ab 100644
--- a/src/tools.cpp
+++ b/src/tools.cpp
@@ -69,16 +69,16 @@ static constexpr RegistryUniqueKey kLookupCacheRegKey{ 0x9BF75F84E54B691Bull };
69 return FuncSubType::Native; 69 return FuncSubType::Native;
70 } 70 }
71 { 71 {
72 int mustpush{ 0 }; 72 int _mustpush{ 0 };
73 if (lua_absindex(L_, _i) != lua_gettop(L_)) { 73 if (lua_absindex(L_, _i) != lua_gettop(L_)) {
74 lua_pushvalue(L_, _i); 74 lua_pushvalue(L_, _i);
75 mustpush = 1; 75 _mustpush = 1;
76 } 76 }
77 // the provided writer fails with code 666 77 // the provided writer fails with code 666
78 // therefore, anytime we get 666, this means that lua_dump() attempted a dump 78 // therefore, anytime we get 666, this means that lua_dump() attempted a dump
79 // all other cases mean this is either a C or LuaJIT-fast function 79 // all other cases mean this is either a C or LuaJIT-fast function
80 int const dumpres{ lua504_dump(L_, dummy_writer, nullptr, 0) }; 80 int const dumpres{ lua504_dump(L_, dummy_writer, nullptr, 0) };
81 lua_pop(L_, mustpush); 81 lua_pop(L_, _mustpush);
82 if (dumpres == 666) { 82 if (dumpres == 666) {
83 return FuncSubType::Bytecode; 83 return FuncSubType::Bytecode;
84 } 84 }
@@ -91,22 +91,22 @@ static constexpr RegistryUniqueKey kLookupCacheRegKey{ 0x9BF75F84E54B691Bull };
91// inspired from tconcat() in ltablib.c 91// inspired from tconcat() in ltablib.c
92[[nodiscard]] static char const* luaG_pushFQN(lua_State* L_, int t_, int last_, size_t* length_) 92[[nodiscard]] static char const* luaG_pushFQN(lua_State* L_, int t_, int last_, size_t* length_)
93{ 93{
94 luaL_Buffer b; 94 luaL_Buffer _b;
95 STACK_CHECK_START_REL(L_, 0); 95 STACK_CHECK_START_REL(L_, 0);
96 // Lua 5.4 pushes &b as light userdata on the stack. be aware of it... 96 // Lua 5.4 pushes &b as light userdata on the stack. be aware of it...
97 luaL_buffinit(L_, &b); // L_: ... {} ... &b? 97 luaL_buffinit(L_, &_b); // L_: ... {} ... &b?
98 int i = 1; 98 int i = 1;
99 for (; i < last_; ++i) { 99 for (; i < last_; ++i) {
100 lua_rawgeti(L_, t_, i); 100 lua_rawgeti(L_, t_, i);
101 luaL_addvalue(&b); 101 luaL_addvalue(&_b);
102 luaL_addlstring(&b, "/", 1); 102 luaL_addlstring(&_b, "/", 1);
103 } 103 }
104 if (i == last_) { // add last value (if interval was not empty) 104 if (i == last_) { // add last value (if interval was not empty)
105 lua_rawgeti(L_, t_, i); 105 lua_rawgeti(L_, t_, i);
106 luaL_addvalue(&b); 106 luaL_addvalue(&_b);
107 } 107 }
108 // &b is popped at that point (-> replaced by the result) 108 // &b is popped at that point (-> replaced by the result)
109 luaL_pushresult(&b); // L_: ... {} ... "<result>" 109 luaL_pushresult(&_b); // L_: ... {} ... "<result>"
110 STACK_CHECK(L_, 1); 110 STACK_CHECK(L_, 1);
111 return lua_tolstring(L_, -1, length_); 111 return lua_tolstring(L_, -1, length_);
112} 112}
@@ -124,28 +124,28 @@ static constexpr RegistryUniqueKey kLookupCacheRegKey{ 0x9BF75F84E54B691Bull };
124static void update_lookup_entry(DEBUGSPEW_PARAM_COMMA(Universe* U_) lua_State* L_, int ctxBase_, int depth_) 124static void update_lookup_entry(DEBUGSPEW_PARAM_COMMA(Universe* U_) lua_State* L_, int ctxBase_, int depth_)
125{ 125{
126 // slot 1 in the stack contains the table that receives everything we found 126 // slot 1 in the stack contains the table that receives everything we found
127 int const dest{ ctxBase_ }; 127 int const _dest{ ctxBase_ };
128 // slot 2 contains a table that, when concatenated, produces the fully qualified name of scanned elements in the table provided at slot _i 128 // slot 2 contains a table that, when concatenated, produces the fully qualified name of scanned elements in the table provided at slot _i
129 int const fqn{ ctxBase_ + 1 }; 129 int const _fqn{ ctxBase_ + 1 };
130 130
131 size_t prevNameLength, newNameLength; 131 DEBUGSPEW_CODE(char const* _newName);
132 char const* prevName;
133 DEBUGSPEW_CODE(char const* newName);
134 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "update_lookup_entry()\n" INDENT_END(U_))); 132 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "update_lookup_entry()\n" INDENT_END(U_)));
135 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ U_ }); 133 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ U_ });
136 134
137 STACK_CHECK_START_REL(L_, 0); 135 STACK_CHECK_START_REL(L_, 0);
138 // first, raise an error if the function is already known 136 // first, raise an error if the function is already known
139 lua_pushvalue(L_, -1); // L_: ... {bfc} k o o 137 lua_pushvalue(L_, -1); // L_: ... {bfc} k o o
140 lua_rawget(L_, dest); // L_: ... {bfc} k o name? 138 lua_rawget(L_, _dest); // L_: ... {bfc} k o name?
141 prevName = lua_tolstring(L_, -1, &prevNameLength); // nullptr if we got nil (first encounter of this object) 139 size_t _prevNameLength;
140 char const* const _prevName{ lua_tolstring(L_, -1, &_prevNameLength) }; // nullptr if we got nil (first encounter of this object)
142 // push name in fqn stack (note that concatenation will crash if name is a not string or a number) 141 // push name in fqn stack (note that concatenation will crash if name is a not string or a number)
143 lua_pushvalue(L_, -3); // L_: ... {bfc} k o name? k 142 lua_pushvalue(L_, -3); // L_: ... {bfc} k o name? k
144 LUA_ASSERT(L_, lua_type(L_, -1) == LUA_TNUMBER || lua_type(L_, -1) == LUA_TSTRING); 143 LUA_ASSERT(L_, lua_type(L_, -1) == LUA_TNUMBER || lua_type(L_, -1) == LUA_TSTRING);
145 ++depth_; 144 ++depth_;
146 lua_rawseti(L_, fqn, depth_); // L_: ... {bfc} k o name? 145 lua_rawseti(L_, _fqn, depth_); // L_: ... {bfc} k o name?
147 // generate name 146 // generate name
148 DEBUGSPEW_OR_NOT(newName, std::ignore) = luaG_pushFQN(L_, fqn, depth_, &newNameLength); // L_: ... {bfc} k o name? "f.q.n" 147 size_t _newNameLength;
148 DEBUGSPEW_OR_NOT(_newName, std::ignore) = luaG_pushFQN(L_, _fqn, depth_, &_newNameLength); // L_: ... {bfc} k o name? "f.q.n"
149 // Lua 5.2 introduced a hash randomizer seed which causes table iteration to yield a different key order 149 // Lua 5.2 introduced a hash randomizer seed which causes table iteration to yield a different key order
150 // on different VMs even when the tables are populated the exact same way. 150 // on different VMs even when the tables are populated the exact same way.
151 // When Lua is built with compatibility options (such as LUA_COMPAT_ALL), 151 // When Lua is built with compatibility options (such as LUA_COMPAT_ALL),
@@ -155,34 +155,34 @@ static void update_lookup_entry(DEBUGSPEW_PARAM_COMMA(Universe* U_) lua_State* L
155 // Also, nothing prevents any external module from exposing a given object under several names, so... 155 // Also, nothing prevents any external module from exposing a given object under several names, so...
156 // Therefore, when we encounter an object for which a name was previously registered, we need to select the names 156 // Therefore, when we encounter an object for which a name was previously registered, we need to select the names
157 // based on some sorting order so that we end up with the same name in all databases whatever order the table walk yielded 157 // based on some sorting order so that we end up with the same name in all databases whatever order the table walk yielded
158 if (prevName != nullptr && (prevNameLength < newNameLength || lua_lessthan(L_, -2, -1))) { 158 if (_prevName != nullptr && (_prevNameLength < _newNameLength || lua_lessthan(L_, -2, -1))) {
159 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "%s '%s' remained named '%s'\n" INDENT_END(U_), lua_typename(L_, lua_type(L_, -3)), newName, prevName)); 159 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "%s '%s' remained named '%s'\n" INDENT_END(U_), lua_typename(L_, lua_type(L_, -3)), _newName, _prevName));
160 // the previous name is 'smaller' than the one we just generated: keep it! 160 // the previous name is 'smaller' than the one we just generated: keep it!
161 lua_pop(L_, 3); // L_: ... {bfc} k 161 lua_pop(L_, 3); // L_: ... {bfc} k
162 } else { 162 } else {
163 // the name we generated is either the first one, or a better fit for our purposes 163 // the name we generated is either the first one, or a better fit for our purposes
164 if (prevName) { 164 if (_prevName) {
165 // clear the previous name for the database to avoid clutter 165 // clear the previous name for the database to avoid clutter
166 lua_insert(L_, -2); // L_: ... {bfc} k o "f.q.n" prevName 166 lua_insert(L_, -2); // L_: ... {bfc} k o "f.q.n" prevName
167 // t[prevName] = nil 167 // t[prevName] = nil
168 lua_pushnil(L_); // L_: ... {bfc} k o "f.q.n" prevName nil 168 lua_pushnil(L_); // L_: ... {bfc} k o "f.q.n" prevName nil
169 lua_rawset(L_, dest); // L_: ... {bfc} k o "f.q.n" 169 lua_rawset(L_, _dest); // L_: ... {bfc} k o "f.q.n"
170 } else { 170 } else {
171 lua_remove(L_, -2); // L_: ... {bfc} k o "f.q.n" 171 lua_remove(L_, -2); // L_: ... {bfc} k o "f.q.n"
172 } 172 }
173 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "%s '%s'\n" INDENT_END(U_), lua_typename(L_, lua_type(L_, -2)), newName)); 173 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "%s '%s'\n" INDENT_END(U_), lua_typename(L_, lua_type(L_, -2)), _newName));
174 // prepare the stack for database feed 174 // prepare the stack for database feed
175 lua_pushvalue(L_, -1); // L_: ... {bfc} k o "f.q.n" "f.q.n" 175 lua_pushvalue(L_, -1); // L_: ... {bfc} k o "f.q.n" "f.q.n"
176 lua_pushvalue(L_, -3); // L_: ... {bfc} k o "f.q.n" "f.q.n" o 176 lua_pushvalue(L_, -3); // L_: ... {bfc} k o "f.q.n" "f.q.n" o
177 LUA_ASSERT(L_, lua_rawequal(L_, -1, -4)); 177 LUA_ASSERT(L_, lua_rawequal(L_, -1, -4));
178 LUA_ASSERT(L_, lua_rawequal(L_, -2, -3)); 178 LUA_ASSERT(L_, lua_rawequal(L_, -2, -3));
179 // t["f.q.n"] = o 179 // t["f.q.n"] = o
180 lua_rawset(L_, dest); // L_: ... {bfc} k o "f.q.n" 180 lua_rawset(L_, _dest); // L_: ... {bfc} k o "f.q.n"
181 // t[o] = "f.q.n" 181 // t[o] = "f.q.n"
182 lua_rawset(L_, dest); // L_: ... {bfc} k 182 lua_rawset(L_, _dest); // L_: ... {bfc} k
183 // remove table name from fqn stack 183 // remove table name from fqn stack
184 lua_pushnil(L_); // L_: ... {bfc} k nil 184 lua_pushnil(L_); // L_: ... {bfc} k nil
185 lua_rawseti(L_, fqn, depth_); // L_: ... {bfc} k 185 lua_rawseti(L_, _fqn, depth_); // L_: ... {bfc} k
186 } 186 }
187 --depth_; 187 --depth_;
188 STACK_CHECK(L_, -1); 188 STACK_CHECK(L_, -1);
@@ -194,9 +194,9 @@ static void populate_func_lookup_table_recur(DEBUGSPEW_PARAM_COMMA(Universe* U_)
194{ 194{
195 // slot dbIdx_ contains the lookup database table 195 // slot dbIdx_ contains the lookup database table
196 // slot dbIdx_ + 1 contains a table that, when concatenated, produces the fully qualified name of scanned elements in the table provided at slot i_ 196 // slot dbIdx_ + 1 contains a table that, when concatenated, produces the fully qualified name of scanned elements in the table provided at slot i_
197 int const fqn{ dbIdx_ + 1 }; 197 int const _fqn{ dbIdx_ + 1 };
198 // slot dbIdx_ + 2 contains a cache that stores all already visited tables to avoid infinite recursion loops 198 // slot dbIdx_ + 2 contains a cache that stores all already visited tables to avoid infinite recursion loops
199 int const cache{ dbIdx_ + 2 }; 199 int const _cache{ dbIdx_ + 2 };
200 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "populate_func_lookup_table_recur()\n" INDENT_END(U_))); 200 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "populate_func_lookup_table_recur()\n" INDENT_END(U_)));
201 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ U_ }); 201 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ U_ });
202 202
@@ -212,19 +212,19 @@ static void populate_func_lookup_table_recur(DEBUGSPEW_PARAM_COMMA(Universe* U_)
212 212
213 // if table is already visited, we are done 213 // if table is already visited, we are done
214 lua_pushvalue(L_, i_); // L_: ... {i_} {} 214 lua_pushvalue(L_, i_); // L_: ... {i_} {}
215 lua_rawget(L_, cache); // L_: ... {i_} nil|n 215 lua_rawget(L_, _cache); // L_: ... {i_} nil|n
216 lua_Integer visit_count{ lua_tointeger(L_, -1) }; // 0 if nil, else n 216 lua_Integer _visit_count{ lua_tointeger(L_, -1) }; // 0 if nil, else n
217 lua_pop(L_, 1); // L_: ... {i_} 217 lua_pop(L_, 1); // L_: ... {i_}
218 STACK_CHECK(L_, 0); 218 STACK_CHECK(L_, 0);
219 if (visit_count > 0) { 219 if (_visit_count > 0) {
220 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "already visited\n" INDENT_END(U_))); 220 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "already visited\n" INDENT_END(U_)));
221 return; 221 return;
222 } 222 }
223 223
224 // remember we visited this table (1-visit count) 224 // remember we visited this table (1-visit count)
225 lua_pushvalue(L_, i_); // L_: ... {i_} {} 225 lua_pushvalue(L_, i_); // L_: ... {i_} {}
226 lua_pushinteger(L_, visit_count + 1); // L_: ... {i_} {} 1 226 lua_pushinteger(L_, _visit_count + 1); // L_: ... {i_} {} 1
227 lua_rawset(L_, cache); // L_: ... {i_} 227 lua_rawset(L_, _cache); // L_: ... {i_}
228 STACK_CHECK(L_, 0); 228 STACK_CHECK(L_, 0);
229 229
230 // we need to remember subtables to process them after functions encountered at the current depth (breadth-first search) 230 // we need to remember subtables to process them after functions encountered at the current depth (breadth-first search)
@@ -240,11 +240,11 @@ static void populate_func_lookup_table_recur(DEBUGSPEW_PARAM_COMMA(Universe* U_)
240 // increment visit count to make sure we will actually scan it at this recursive level 240 // increment visit count to make sure we will actually scan it at this recursive level
241 lua_pushvalue(L_, -1); // L_: ... {i_} {bfc} k {} {} 241 lua_pushvalue(L_, -1); // L_: ... {i_} {bfc} k {} {}
242 lua_pushvalue(L_, -1); // L_: ... {i_} {bfc} k {} {} {} 242 lua_pushvalue(L_, -1); // L_: ... {i_} {bfc} k {} {} {}
243 lua_rawget(L_, cache); // L_: ... {i_} {bfc} k {} {} n? 243 lua_rawget(L_, _cache); // L_: ... {i_} {bfc} k {} {} n?
244 visit_count = lua_tointeger(L_, -1) + 1; // 1 if we got nil, else n+1 244 _visit_count = lua_tointeger(L_, -1) + 1; // 1 if we got nil, else n+1
245 lua_pop(L_, 1); // L_: ... {i_} {bfc} k {} {} 245 lua_pop(L_, 1); // L_: ... {i_} {bfc} k {} {}
246 lua_pushinteger(L_, visit_count); // L_: ... {i_} {bfc} k {} {} n 246 lua_pushinteger(L_, _visit_count); // L_: ... {i_} {bfc} k {} {} n
247 lua_rawset(L_, cache); // L_: ... {i_} {bfc} k {} 247 lua_rawset(L_, _cache); // L_: ... {i_} {bfc} k {}
248 // store the table in the breadth-first cache 248 // store the table in the breadth-first cache
249 lua_pushvalue(L_, -2); // L_: ... {i_} {bfc} k {} k 249 lua_pushvalue(L_, -2); // L_: ... {i_} {bfc} k {} k
250 lua_pushvalue(L_, -2); // L_: ... {i_} {bfc} k {} k {} 250 lua_pushvalue(L_, -2); // L_: ... {i_} {bfc} k {} k {}
@@ -269,27 +269,27 @@ static void populate_func_lookup_table_recur(DEBUGSPEW_PARAM_COMMA(Universe* U_)
269 DEBUGSPEW_CODE(DebugSpewIndentScope scope2{ U_ }); 269 DEBUGSPEW_CODE(DebugSpewIndentScope scope2{ U_ });
270 // un-visit this table in case we do need to process it 270 // un-visit this table in case we do need to process it
271 lua_pushvalue(L_, -1); // L_: ... {i_} {bfc} k {} {} 271 lua_pushvalue(L_, -1); // L_: ... {i_} {bfc} k {} {}
272 lua_rawget(L_, cache); // L_: ... {i_} {bfc} k {} n 272 lua_rawget(L_, _cache); // L_: ... {i_} {bfc} k {} n
273 LUA_ASSERT(L_, lua_type(L_, -1) == LUA_TNUMBER); 273 LUA_ASSERT(L_, lua_type(L_, -1) == LUA_TNUMBER);
274 visit_count = lua_tointeger(L_, -1) - 1; 274 _visit_count = lua_tointeger(L_, -1) - 1;
275 lua_pop(L_, 1); // L_: ... {i_} {bfc} k {} 275 lua_pop(L_, 1); // L_: ... {i_} {bfc} k {}
276 lua_pushvalue(L_, -1); // L_: ... {i_} {bfc} k {} {} 276 lua_pushvalue(L_, -1); // L_: ... {i_} {bfc} k {} {}
277 if (visit_count > 0) { 277 if (_visit_count > 0) {
278 lua_pushinteger(L_, visit_count); // L_: ... {i_} {bfc} k {} {} n 278 lua_pushinteger(L_, _visit_count); // L_: ... {i_} {bfc} k {} {} n
279 } else { 279 } else {
280 lua_pushnil(L_); // L_: ... {i_} {bfc} k {} {} nil 280 lua_pushnil(L_); // L_: ... {i_} {bfc} k {} {} nil
281 } 281 }
282 lua_rawset(L_, cache); // L_: ... {i_} {bfc} k {} 282 lua_rawset(L_, _cache); // L_: ... {i_} {bfc} k {}
283 // push table name in fqn stack (note that concatenation will crash if name is a not string!) 283 // push table name in fqn stack (note that concatenation will crash if name is a not string!)
284 lua_pushvalue(L_, -2); // L_: ... {i_} {bfc} k {} k 284 lua_pushvalue(L_, -2); // L_: ... {i_} {bfc} k {} k
285 lua_rawseti(L_, fqn, depth_); // L_: ... {i_} {bfc} k {} 285 lua_rawseti(L_, _fqn, depth_); // L_: ... {i_} {bfc} k {}
286 populate_func_lookup_table_recur(DEBUGSPEW_PARAM_COMMA(U_) L_, dbIdx_, lua_gettop(L_), depth_); 286 populate_func_lookup_table_recur(DEBUGSPEW_PARAM_COMMA(U_) L_, dbIdx_, lua_gettop(L_), depth_);
287 lua_pop(L_, 1); // L_: ... {i_} {bfc} k 287 lua_pop(L_, 1); // L_: ... {i_} {bfc} k
288 STACK_CHECK(L_, 2); 288 STACK_CHECK(L_, 2);
289 } 289 }
290 // remove table name from fqn stack 290 // remove table name from fqn stack
291 lua_pushnil(L_); // L_: ... {i_} {bfc} nil 291 lua_pushnil(L_); // L_: ... {i_} {bfc} nil
292 lua_rawseti(L_, fqn, depth_); // L_: ... {i_} {bfc} 292 lua_rawseti(L_, _fqn, depth_); // L_: ... {i_} {bfc}
293 --depth_; 293 --depth_;
294 // we are done with our cache 294 // we are done with our cache
295 lua_pop(L_, 1); // L_: ... {i_} 295 lua_pop(L_, 1); // L_: ... {i_}
@@ -302,46 +302,46 @@ static void populate_func_lookup_table_recur(DEBUGSPEW_PARAM_COMMA(Universe* U_)
302// create a "fully.qualified.name" <-> function equivalence database 302// create a "fully.qualified.name" <-> function equivalence database
303void populate_func_lookup_table(lua_State* L_, int i_, char const* name_) 303void populate_func_lookup_table(lua_State* L_, int i_, char const* name_)
304{ 304{
305 int const in_base = lua_absindex(L_, i_); 305 int const _in_base = lua_absindex(L_, i_);
306 DEBUGSPEW_CODE(Universe* U = universe_get(L_)); 306 DEBUGSPEW_CODE(Universe* _U = universe_get(L_));
307 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "%p: populate_func_lookup_table('%s')\n" INDENT_END(U), L_, name_ ? name_ : "nullptr")); 307 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "%p: populate_func_lookup_table('%s')\n" INDENT_END(_U), L_, name_ ? name_ : "nullptr"));
308 DEBUGSPEW_CODE(DebugSpewIndentScope scope{ U }); 308 DEBUGSPEW_CODE(DebugSpewIndentScope _scope{ _U });
309 STACK_GROW(L_, 3); 309 STACK_GROW(L_, 3);
310 STACK_CHECK_START_REL(L_, 0); 310 STACK_CHECK_START_REL(L_, 0);
311 kLookupRegKey.pushValue(L_); // L_: {} 311 kLookupRegKey.pushValue(L_); // L_: {}
312 int const dbIdx{ lua_gettop(L_) }; 312 int const _dbIdx{ lua_gettop(L_) };
313 STACK_CHECK(L_, 1); 313 STACK_CHECK(L_, 1);
314 LUA_ASSERT(L_, lua_istable(L_, -1)); 314 LUA_ASSERT(L_, lua_istable(L_, -1));
315 if (lua_type(L_, in_base) == LUA_TFUNCTION) { // for example when a module is a simple function 315 if (lua_type(L_, _in_base) == LUA_TFUNCTION) { // for example when a module is a simple function
316 name_ = name_ ? name_ : "nullptr"; 316 name_ = name_ ? name_ : "nullptr";
317 lua_pushvalue(L_, in_base); // L_: {} f 317 lua_pushvalue(L_, _in_base); // L_: {} f
318 lua_pushstring(L_, name_); // L_: {} f _name 318 lua_pushstring(L_, name_); // L_: {} f _name
319 lua_rawset(L_, -3); // L_: {} 319 lua_rawset(L_, -3); // L_: {}
320 lua_pushstring(L_, name_); // L_: {} _name 320 lua_pushstring(L_, name_); // L_: {} _name
321 lua_pushvalue(L_, in_base); // L_: {} _name f 321 lua_pushvalue(L_, _in_base); // L_: {} _name f
322 lua_rawset(L_, -3); // L_: {} 322 lua_rawset(L_, -3); // L_: {}
323 lua_pop(L_, 1); // L_: 323 lua_pop(L_, 1); // L_:
324 } else if (lua_type(L_, in_base) == LUA_TTABLE) { 324 } else if (lua_type(L_, _in_base) == LUA_TTABLE) {
325 lua_newtable(L_); // L_: {} {fqn} 325 lua_newtable(L_); // L_: {} {fqn}
326 int startDepth{ 0 }; 326 int _startDepth{ 0 };
327 if (name_) { 327 if (name_) {
328 STACK_CHECK(L_, 2); 328 STACK_CHECK(L_, 2);
329 lua_pushstring(L_, name_); // L_: {} {fqn} "name" 329 lua_pushstring(L_, name_); // L_: {} {fqn} "name"
330 // generate a name, and if we already had one name, keep whichever is the shorter 330 // generate a name, and if we already had one name, keep whichever is the shorter
331 lua_pushvalue(L_, in_base); // L_: {} {fqn} "name" t 331 lua_pushvalue(L_, _in_base); // L_: {} {fqn} "name" t
332 update_lookup_entry(DEBUGSPEW_PARAM_COMMA(U) L_, dbIdx, startDepth); // L_: {} {fqn} "name" 332 update_lookup_entry(DEBUGSPEW_PARAM_COMMA(_U) L_, _dbIdx, _startDepth); // L_: {} {fqn} "name"
333 // don't forget to store the name at the bottom of the fqn stack 333 // don't forget to store the name at the bottom of the fqn stack
334 lua_rawseti(L_, -2, ++startDepth); // L_: {} {fqn} 334 lua_rawseti(L_, -2, ++_startDepth); // L_: {} {fqn}
335 STACK_CHECK(L_, 2); 335 STACK_CHECK(L_, 2);
336 } 336 }
337 // retrieve the cache, create it if we haven't done it yet 337 // retrieve the cache, create it if we haven't done it yet
338 std::ignore = kLookupCacheRegKey.getSubTable(L_, 0, 0); // L_: {} {fqn} {cache} 338 std::ignore = kLookupCacheRegKey.getSubTable(L_, 0, 0); // L_: {} {fqn} {cache}
339 // process everything we find in that table, filling in lookup data for all functions and tables we see there 339 // process everything we find in that table, filling in lookup data for all functions and tables we see there
340 populate_func_lookup_table_recur(DEBUGSPEW_PARAM_COMMA(U) L_, dbIdx, in_base, startDepth); 340 populate_func_lookup_table_recur(DEBUGSPEW_PARAM_COMMA(_U) L_, _dbIdx, _in_base, _startDepth);
341 lua_pop(L_, 3); // L_: 341 lua_pop(L_, 3); // L_:
342 } else { 342 } else {
343 lua_pop(L_, 1); // L_: 343 lua_pop(L_, 1); // L_:
344 raise_luaL_error(L_, "unsupported module type %s", lua_typename(L_, lua_type(L_, in_base))); 344 raise_luaL_error(L_, "unsupported module type %s", lua_typename(L_, lua_type(L_, _in_base)));
345 } 345 }
346 STACK_CHECK(L_, 0); 346 STACK_CHECK(L_, 0);
347} 347}
@@ -484,9 +484,9 @@ void populate_func_lookup_table(lua_State* L_, int i_, char const* name_)
484// "type", "name" = lanes.nameof(o) 484// "type", "name" = lanes.nameof(o)
485int luaG_nameof(lua_State* L_) 485int luaG_nameof(lua_State* L_)
486{ 486{
487 int const what{ lua_gettop(L_) }; 487 int const _what{ lua_gettop(L_) };
488 if (what > 1) { 488 if (_what > 1) {
489 raise_luaL_argerror(L_, what, "too many arguments."); 489 raise_luaL_argerror(L_, _what, "too many arguments.");
490 } 490 }
491 491
492 // nil, boolean, light userdata, number and string aren't identifiable 492 // nil, boolean, light userdata, number and string aren't identifiable
diff --git a/src/universe.cpp b/src/universe.cpp
index a5c28f0..f05cc6f 100644
--- a/src/universe.cpp
+++ b/src/universe.cpp
@@ -68,13 +68,13 @@ Universe::Universe()
68[[nodiscard]] Universe* universe_create(lua_State* L_) 68[[nodiscard]] Universe* universe_create(lua_State* L_)
69{ 69{
70 LUA_ASSERT(L_, universe_get(L_) == nullptr); 70 LUA_ASSERT(L_, universe_get(L_) == nullptr);
71 Universe* const U{ lua_newuserdatauv<Universe>(L_, 0) }; // universe 71 Universe* const _U{ lua_newuserdatauv<Universe>(L_, 0) }; // universe
72 U->Universe::Universe(); 72 _U->Universe::Universe();
73 STACK_CHECK_START_REL(L_, 1); 73 STACK_CHECK_START_REL(L_, 1);
74 kUniverseFullRegKey.setValue(L_, [](lua_State* L_) { lua_pushvalue(L_, -2); }); 74 kUniverseFullRegKey.setValue(L_, [](lua_State* L_) { lua_pushvalue(L_, -2); });
75 kUniverseLightRegKey.setValue(L_, [U](lua_State* L_) { lua_pushlightuserdata(L_, U); }); 75 kUniverseLightRegKey.setValue(L_, [U = _U](lua_State* L_) { lua_pushlightuserdata(L_, U); });
76 STACK_CHECK(L_, 1); 76 STACK_CHECK(L_, 1);
77 return U; 77 return _U;
78} 78}
79 79
80// ################################################################################################# 80// #################################################################################################
@@ -84,22 +84,22 @@ void Universe::terminateFreeRunningLanes(lua_State* L_, lua_Duration shutdownTim
84 if (selfdestructFirst != SELFDESTRUCT_END) { 84 if (selfdestructFirst != SELFDESTRUCT_END) {
85 // Signal _all_ still running threads to exit (including the timer thread) 85 // Signal _all_ still running threads to exit (including the timer thread)
86 { 86 {
87 std::lock_guard<std::mutex> guard{ selfdestructMutex }; 87 std::lock_guard<std::mutex> _guard{ selfdestructMutex };
88 Lane* lane{ selfdestructFirst }; 88 Lane* _lane{ selfdestructFirst };
89 while (lane != SELFDESTRUCT_END) { 89 while (_lane != SELFDESTRUCT_END) {
90 // attempt the requested cancel with a small timeout. 90 // attempt the requested cancel with a small timeout.
91 // if waiting on a linda, they will raise a cancel_error. 91 // if waiting on a linda, they will raise a cancel_error.
92 // if a cancellation hook is desired, it will be installed to try to raise an error 92 // if a cancellation hook is desired, it will be installed to try to raise an error
93 if (lane->thread.joinable()) { 93 if (_lane->thread.joinable()) {
94 std::ignore = thread_cancel(lane, op_, 1, std::chrono::steady_clock::now() + 1us, true); 94 std::ignore = thread_cancel(_lane, op_, 1, std::chrono::steady_clock::now() + 1us, true);
95 } 95 }
96 lane = lane->selfdestruct_next; 96 _lane = _lane->selfdestruct_next;
97 } 97 }
98 } 98 }
99 99
100 // When noticing their cancel, the lanes will remove themselves from the selfdestruct chain. 100 // When noticing their cancel, the lanes will remove themselves from the selfdestruct chain.
101 { 101 {
102 std::chrono::time_point<std::chrono::steady_clock> t_until{ std::chrono::steady_clock::now() + std::chrono::duration_cast<std::chrono::steady_clock::duration>(shutdownTimeout_) }; 102 std::chrono::time_point<std::chrono::steady_clock> _until{ std::chrono::steady_clock::now() + std::chrono::duration_cast<std::chrono::steady_clock::duration>(shutdownTimeout_) };
103 103
104 while (selfdestructFirst != SELFDESTRUCT_END) { 104 while (selfdestructFirst != SELFDESTRUCT_END) {
105 // give threads time to act on their cancel 105 // give threads time to act on their cancel
@@ -107,17 +107,17 @@ void Universe::terminateFreeRunningLanes(lua_State* L_, lua_Duration shutdownTim
107 // count the number of cancelled thread that didn't have the time to act yet 107 // count the number of cancelled thread that didn't have the time to act yet
108 int n{ 0 }; 108 int n{ 0 };
109 { 109 {
110 std::lock_guard<std::mutex> guard{ selfdestructMutex }; 110 std::lock_guard<std::mutex> _guard{ selfdestructMutex };
111 Lane* lane{ selfdestructFirst }; 111 Lane* _lane{ selfdestructFirst };
112 while (lane != SELFDESTRUCT_END) { 112 while (_lane != SELFDESTRUCT_END) {
113 if (lane->cancelRequest != CancelRequest::None) 113 if (_lane->cancelRequest != CancelRequest::None)
114 ++n; 114 ++n;
115 lane = lane->selfdestruct_next; 115 _lane = _lane->selfdestruct_next;
116 } 116 }
117 } 117 }
118 // if timeout elapsed, or we know all threads have acted, stop waiting 118 // if timeout elapsed, or we know all threads have acted, stop waiting
119 std::chrono::time_point<std::chrono::steady_clock> t_now = std::chrono::steady_clock::now(); 119 std::chrono::time_point<std::chrono::steady_clock> _now = std::chrono::steady_clock::now();
120 if (n == 0 || (t_now >= t_until)) { 120 if (n == 0 || (_now >= _until)) {
121 DEBUGSPEW_CODE(fprintf(stderr, "%d uncancelled lane(s) remain after waiting %fs at process end.\n", n, shutdownTimeout_.count())); 121 DEBUGSPEW_CODE(fprintf(stderr, "%d uncancelled lane(s) remain after waiting %fs at process end.\n", n, shutdownTimeout_.count()));
122 break; 122 break;
123 } 123 }
@@ -133,11 +133,11 @@ void Universe::terminateFreeRunningLanes(lua_State* L_, lua_Duration shutdownTim
133 133
134 // If after all this, we still have some free-running lanes, it's an external user error, they should have stopped appropriately 134 // If after all this, we still have some free-running lanes, it's an external user error, they should have stopped appropriately
135 { 135 {
136 std::lock_guard<std::mutex> guard{ selfdestructMutex }; 136 std::lock_guard<std::mutex> _guard{ selfdestructMutex };
137 Lane* lane{ selfdestructFirst }; 137 Lane* _lane{ selfdestructFirst };
138 if (lane != SELFDESTRUCT_END) { 138 if (_lane != SELFDESTRUCT_END) {
139 // this causes a leak because we don't call U's destructor (which could be bad if the still running lanes are accessing it) 139 // this causes a leak because we don't call U's destructor (which could be bad if the still running lanes are accessing it)
140 raise_luaL_error(L_, "Zombie thread %s refuses to die!", lane->debugName); 140 raise_luaL_error(L_, "Zombie thread %s refuses to die!", _lane->debugName);
141 } 141 }
142 } 142 }
143} 143}
@@ -147,25 +147,25 @@ void Universe::terminateFreeRunningLanes(lua_State* L_, lua_Duration shutdownTim
147// process end: cancel any still free-running threads 147// process end: cancel any still free-running threads
148int universe_gc(lua_State* L_) 148int universe_gc(lua_State* L_)
149{ 149{
150 lua_Duration const shutdown_timeout{ lua_tonumber(L_, lua_upvalueindex(1)) }; 150 lua_Duration const _shutdown_timeout{ lua_tonumber(L_, lua_upvalueindex(1)) };
151 [[maybe_unused]] char const* const op_string{ lua_tostring(L_, lua_upvalueindex(2)) }; 151 [[maybe_unused]] char const* const _op_string{ lua_tostring(L_, lua_upvalueindex(2)) };
152 Universe* const U{ lua_tofulluserdata<Universe>(L_, 1) }; 152 Universe* const _U{ lua_tofulluserdata<Universe>(L_, 1) };
153 U->terminateFreeRunningLanes(L_, shutdown_timeout, which_cancel_op(op_string)); 153 _U->terminateFreeRunningLanes(L_, _shutdown_timeout, which_cancel_op(_op_string));
154 154
155 // no need to mutex-protect this as all threads in the universe are gone at that point 155 // no need to mutex-protect this as all threads in the universe are gone at that point
156 if (U->timerLinda != nullptr) { // test in case some early internal error prevented Lanes from creating the deep timer 156 if (_U->timerLinda != nullptr) { // test in case some early internal error prevented Lanes from creating the deep timer
157 [[maybe_unused]] int const prev_ref_count{ U->timerLinda->refcount.fetch_sub(1, std::memory_order_relaxed) }; 157 [[maybe_unused]] int const prev_ref_count{ _U->timerLinda->refcount.fetch_sub(1, std::memory_order_relaxed) };
158 LUA_ASSERT(L_, prev_ref_count == 1); // this should be the last reference 158 LUA_ASSERT(L_, prev_ref_count == 1); // this should be the last reference
159 DeepFactory::DeleteDeepObject(L_, U->timerLinda); 159 DeepFactory::DeleteDeepObject(L_, _U->timerLinda);
160 U->timerLinda = nullptr; 160 _U->timerLinda = nullptr;
161 } 161 }
162 162
163 close_keepers(U); 163 close_keepers(_U);
164 164
165 // remove the protected allocator, if any 165 // remove the protected allocator, if any
166 U->protectedAllocator.removeFrom(L_); 166 _U->protectedAllocator.removeFrom(L_);
167 167
168 U->Universe::~Universe(); 168 _U->Universe::~Universe();
169 169
170 return 0; 170 return 0;
171} 171}