aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBenoit Germain <benoit.germain@ubisoft.com>2024-12-13 10:01:33 +0100
committerBenoit Germain <benoit.germain@ubisoft.com>2024-12-13 10:01:33 +0100
commit7500a80fc06c5311c46df8f1761f25ae67277fc4 (patch)
tree27cec01cecabe4284bf84e12d067ef69872e02ca /src
parenta025d843dfe5a251a8b2284522a7165a93524e17 (diff)
downloadlanes-7500a80fc06c5311c46df8f1761f25ae67277fc4.tar.gz
lanes-7500a80fc06c5311c46df8f1761f25ae67277fc4.tar.bz2
lanes-7500a80fc06c5311c46df8f1761f25ae67277fc4.zip
Fix lane {.name} setting application
The name of the lane was applied to the thread of the lane's creator instead of the lane's thread
Diffstat (limited to 'src')
-rw-r--r--src/lane.cpp59
-rw-r--r--src/lane.hpp3
-rw-r--r--src/lanes.cpp16
3 files changed, 42 insertions, 36 deletions
diff --git a/src/lane.cpp b/src/lane.cpp
index 3f6f792..63efdb6 100644
--- a/src/lane.cpp
+++ b/src/lane.cpp
@@ -90,7 +90,8 @@ static LUAG_FUNC(lane_threadname)
90 if (lua_gettop(L_) == 1) { 90 if (lua_gettop(L_) == 1) {
91 lua_settop(L_, 1); 91 lua_settop(L_, 1);
92 STACK_CHECK_START_REL(L_, 0); 92 STACK_CHECK_START_REL(L_, 0);
93 _lane->changeDebugName(kIdxTop); 93 _lane->storeDebugName(luaG_tostring(L_, kIdxTop));
94 _lane->applyDebugName();
94 STACK_CHECK(L_, 0); 95 STACK_CHECK(L_, 0);
95 return 0; 96 return 0;
96 } else if (lua_gettop(L_) == 0) { 97 } else if (lua_gettop(L_) == 0) {
@@ -708,6 +709,7 @@ static void lane_main(Lane* const lane_)
708 } 709 }
709#endif // __PROSPERO__ 710#endif // __PROSPERO__
710 711
712 lane_->applyDebugName();
711 lua_State* const _L{ lane_->L }; 713 lua_State* const _L{ lane_->L };
712 LuaError _rc{ LuaError::ERRRUN }; 714 LuaError _rc{ LuaError::ERRRUN };
713 if (lane_->status.load(std::memory_order_acquire) == Lane::Pending) { // nothing wrong happened during preparation, we can work 715 if (lane_->status.load(std::memory_order_acquire) == Lane::Pending) { // nothing wrong happened during preparation, we can work
@@ -908,6 +910,19 @@ Lane::~Lane()
908 910
909// ################################################################################################# 911// #################################################################################################
910 912
913void Lane::applyDebugName() const
914{
915 if constexpr (HAVE_DECODA_SUPPORT()) {
916 // to see VM name in Decoda debugger Virtual Machine window
917 luaG_pushstring(L, debugName); // L: ... "name"
918 lua_setglobal(L, "decoda_name"); // L: ...
919 }
920 // and finally set the OS thread name
921 THREAD_SETNAME(debugName);
922}
923
924// #################################################################################################
925
911CancelResult Lane::cancel(CancelOp const op_, std::chrono::time_point<std::chrono::steady_clock> const until_, WakeLane const wakeLane_, int const hookCount_) 926CancelResult Lane::cancel(CancelOp const op_, std::chrono::time_point<std::chrono::steady_clock> const until_, WakeLane const wakeLane_, int const hookCount_)
912{ 927{
913 // this is a hook installed with lua_sethook: can't capture anything to be convertible to lua_Hook 928 // this is a hook installed with lua_sethook: can't capture anything to be convertible to lua_Hook
@@ -963,30 +978,6 @@ CancelResult Lane::internalCancel(CancelRequest const rq_, std::chrono::time_poi
963 978
964// ################################################################################################# 979// #################################################################################################
965 980
966void Lane::changeDebugName(StackIndex const nameIdx_)
967{
968 StackIndex const _nameIdx{ luaG_absindex(L, nameIdx_) };
969 luaL_checktype(L, _nameIdx, LUA_TSTRING); // L: ... "name" ...
970 STACK_CHECK_START_REL(L, 0);
971 // 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...
972 kLaneNameRegKey.setValue(L, [idx = _nameIdx](lua_State* L_) { lua_pushvalue(L_, idx); }); // L: ... "name" ...
973 // keep a direct pointer on the string
974 {
975 std::lock_guard<std::mutex> _guard{ debugNameMutex };
976 debugName = luaG_tostring(L, _nameIdx);
977 }
978 if constexpr (HAVE_DECODA_SUPPORT()) {
979 // to see VM name in Decoda debugger Virtual Machine window
980 lua_pushvalue(L, _nameIdx); // L: ... "name" ... "name"
981 lua_setglobal(L, "decoda_name"); // L: ... "name" ...
982 }
983 // and finally set the OS thread name
984 THREAD_SETNAME(debugName.data());
985 STACK_CHECK(L, 0);
986}
987
988// #################################################################################################
989
990//--- 981//---
991// str= thread_status( lane ) 982// str= thread_status( lane )
992// 983//
@@ -1183,6 +1174,24 @@ void Lane::startThread(int const priority_)
1183 1174
1184// ################################################################################################# 1175// #################################################################################################
1185 1176
1177void Lane::storeDebugName(std::string_view const& name_)
1178{
1179 STACK_CHECK_START_REL(L, 0);
1180 // 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...
1181 kLaneNameRegKey.setValue(L, [name = name_](lua_State* L_) { luaG_pushstring(L_, name); });
1182 STACK_CHECK(L, 0);
1183 kLaneNameRegKey.pushValue(L); // L: ... "name" ...
1184 // keep a direct view on the stored string
1185 {
1186 std::lock_guard<std::mutex> _guard{ debugNameMutex };
1187 debugName = luaG_tostring(L, kIdxTop);
1188 }
1189 lua_pop(L, 1);
1190 STACK_CHECK(L, 0);
1191}
1192
1193// #################################################################################################
1194
1186// take the results on the lane state stack and store them in our uservalue table, at numeric indices: 1195// take the results on the lane state stack and store them in our uservalue table, at numeric indices:
1187// t[0] = nresults 1196// t[0] = nresults
1188// t[i] = result #i 1197// t[i] = result #i
diff --git a/src/lane.hpp b/src/lane.hpp
index 29bf213..183c8bf 100644
--- a/src/lane.hpp
+++ b/src/lane.hpp
@@ -162,8 +162,8 @@ class Lane
162 162
163 public: 163 public:
164 164
165 void applyDebugName() const;
165 CancelResult cancel(CancelOp op_, std::chrono::time_point<std::chrono::steady_clock> until_, WakeLane wakeLane_, int hookCount_); 166 CancelResult cancel(CancelOp op_, std::chrono::time_point<std::chrono::steady_clock> until_, WakeLane wakeLane_, int hookCount_);
166 void changeDebugName(StackIndex nameIdx_);
167 void closeState() 167 void closeState()
168 { 168 {
169 lua_State* const _L{ S }; 169 lua_State* const _L{ S };
@@ -202,6 +202,7 @@ class Lane
202 bool selfdestructRemove(); 202 bool selfdestructRemove();
203 void securizeDebugName(lua_State* L_); 203 void securizeDebugName(lua_State* L_);
204 void startThread(int priority_); 204 void startThread(int priority_);
205 void storeDebugName( std::string_view const& name_);
205 [[nodiscard]] 206 [[nodiscard]]
206 int storeResults(lua_State* L_); 207 int storeResults(lua_State* L_);
207 [[nodiscard]] 208 [[nodiscard]]
diff --git a/src/lanes.cpp b/src/lanes.cpp
index f32e7af..87f9a90 100644
--- a/src/lanes.cpp
+++ b/src/lanes.cpp
@@ -356,24 +356,20 @@ LUAG_FUNC(lane_new)
356 // store the uservalue in the Lane full userdata 356 // store the uservalue in the Lane full userdata
357 lua_setiuservalue(L, StackIndex{ -2 }, UserValueIndex{ 1 }); // L: ... lane 357 lua_setiuservalue(L, StackIndex{ -2 }, UserValueIndex{ 1 }); // L: ... lane
358 358
359 lua_State* const _L2{ lane->L };
360 STACK_CHECK_START_REL(_L2, 0);
361 StackIndex const _name_idx{ lua_isnoneornil(L, kNameIdx) ? kIdxNone : kNameIdx }; 359 StackIndex const _name_idx{ lua_isnoneornil(L, kNameIdx) ? kIdxNone : kNameIdx };
362 std::string_view const _debugName{ (_name_idx > 0) ? luaG_tostring(L, _name_idx) : std::string_view{} }; 360 std::string_view _debugName{ (_name_idx > 0) ? luaG_tostring(L, _name_idx) : std::string_view{} };
363 if (!_debugName.empty()) 361 if (!_debugName.empty())
364 { 362 {
365 if (_debugName != "auto") { 363 if (_debugName == "auto") {
366 luaG_pushstring(_L2, _debugName); // L: ... lane L2: "<name>"
367 } else {
368 lua_Debug _ar; 364 lua_Debug _ar;
369 lua_pushvalue(L, kFuncIdx); // L: ... lane func 365 lua_pushvalue(L, kFuncIdx); // L: ... lane func
370 lua_getinfo(L, ">S", &_ar); // L: ... lane 366 lua_getinfo(L, ">S", &_ar); // L: ... lane
371 luaG_pushstring(_L2, "%s:%d", _ar.short_src, _ar.linedefined); // L: ... lane L2: "<name>" 367 luaG_pushstring(L, "%s:%d", _ar.short_src, _ar.linedefined); // L: ... lane "<name>"
368 lua_replace(L, _name_idx); // L: ... lane
369 _debugName = luaG_tostring(L, _name_idx);
372 } 370 }
373 lane->changeDebugName(kIdxTop); 371 lane->storeDebugName(_debugName);
374 lua_pop(_L2, 1); // L: ... lane L2:
375 } 372 }
376 STACK_CHECK(_L2, 0);
377 STACK_CHECK(L, 1); 373 STACK_CHECK(L, 1);
378 } 374 }
379 375