aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBenoit Germain <benoit.germain@ubisoft.com>2024-06-04 11:34:44 +0200
committerBenoit Germain <benoit.germain@ubisoft.com>2024-06-04 11:34:44 +0200
commit011593650caa66457694fc46352208b8607d8994 (patch)
treea642b8ff0fb2aed6df84867e48298c578581bded /src
parentfc2fde434b73e9189dfa6b0c160e5fe72a7aee15 (diff)
downloadlanes-011593650caa66457694fc46352208b8607d8994.tar.gz
lanes-011593650caa66457694fc46352208b8607d8994.tar.bz2
lanes-011593650caa66457694fc46352208b8607d8994.zip
Keeper code internal improvements
Diffstat (limited to 'src')
-rw-r--r--src/keeper.cpp50
1 files changed, 25 insertions, 25 deletions
diff --git a/src/keeper.cpp b/src/keeper.cpp
index 915d6b6..eba184f 100644
--- a/src/keeper.cpp
+++ b/src/keeper.cpp
@@ -79,7 +79,7 @@ class KeyUD
79 79
80 [[nodiscard]] static KeyUD* GetPtr(KeeperState K_, int idx_); 80 [[nodiscard]] static KeyUD* GetPtr(KeeperState K_, int idx_);
81 [[nodiscard]] static KeyUD* Create(KeeperState K_); 81 [[nodiscard]] static KeyUD* Create(KeeperState K_);
82 [[nodiscard]] static KeyUD* PrepareAccess(KeeperState K_, int idx_); 82 void prepareAccess(KeeperState K_);
83 void peek(KeeperState K_, int count_); 83 void peek(KeeperState K_, int count_);
84 void pop(KeeperState K_, int count_); 84 void pop(KeeperState K_, int count_);
85 void push(KeeperState K_, int count_); 85 void push(KeeperState K_, int count_);
@@ -111,19 +111,14 @@ KeyUD* KeyUD::GetPtr(KeeperState const K_, int idx_)
111 111
112// ################################################################################################# 112// #################################################################################################
113 113
114// replaces the KeyUD by its uservalue on the stack 114// expects 'this' on top of the stack
115// TODO: make it a non-static member to be called after KeyUD::GetPtr() 115// replaces it by its uservalue on the stack
116KeyUD* KeyUD::PrepareAccess(KeeperState const K_, int const idx_) 116void KeyUD::prepareAccess(KeeperState const K_)
117{ 117{
118 KeyUD* const _key{ KeyUD::GetPtr(K_, idx_) }; 118 LUA_ASSERT(K_, KeyUD::GetPtr(K_, -1) == this);
119 if (_key) { 119 // we can replace the key userdata in the stack without fear of it being GCed, there are other references around
120 int const _idx{ lua_absindex(K_, idx_) }; 120 lua_getiuservalue(K_, -1, kContentsTableIndex);
121 STACK_GROW(K_, 1); 121 lua_replace(K_, -2);
122 // we can replace the key userdata in the stack without fear of it being GCed, there are other references around
123 lua_getiuservalue(K_, _idx, kContentsTableIndex);
124 lua_replace(K_, _idx);
125 }
126 return _key;
127} 122}
128 123
129// ################################################################################################# 124// #################################################################################################
@@ -266,7 +261,8 @@ int keeper_push_linda_storage(Linda& linda_, DestState L_)
266 InterCopyContext _c{ linda_.U, L_, SourceState{ _K }, {}, {}, {}, LookupMode::FromKeeper, {} }; 261 InterCopyContext _c{ linda_.U, L_, SourceState{ _K }, {}, {}, {}, LookupMode::FromKeeper, {} };
267 lua_pushnil(_K); // _K: KeysDB nil L_: out 262 lua_pushnil(_K); // _K: KeysDB nil L_: out
268 while (lua_next(_K, -2)) { // _K: KeysDB key KeyUD L_: out 263 while (lua_next(_K, -2)) { // _K: KeysDB key KeyUD L_: out
269 KeyUD* const _key{ KeyUD::PrepareAccess(_K, -1) }; // _K: KeysDB key fifo L_: out 264 KeyUD* const _key{ KeyUD::GetPtr(_K, -1) };
265 _key->prepareAccess(_K); // _K: KeysDB key fifo L_: out
270 lua_pushvalue(_K, -2); // _K: KeysDB key fifo key L_: out 266 lua_pushvalue(_K, -2); // _K: KeysDB key fifo key L_: out
271 std::ignore = _c.inter_move(1); // _K: KeysDB key fifo L_: out key 267 std::ignore = _c.inter_move(1); // _K: KeysDB key fifo L_: out key
272 STACK_CHECK(L_, 2); 268 STACK_CHECK(L_, 2);
@@ -340,14 +336,14 @@ int keepercall_send(lua_State* const L_)
340 } 336 }
341 lua_remove(_K, -2); // _K: linda key args... KeyUD 337 lua_remove(_K, -2); // _K: linda key args... KeyUD
342 STACK_CHECK(_K, 1); 338 STACK_CHECK(_K, 1);
343 KeyUD* _key{ KeyUD::GetPtr(_K, -1) }; 339 KeyUD* const _key{ KeyUD::GetPtr(_K, -1) };
344 if (_key->limit >= 0 && _key->count + _n > _key->limit) { // not enough room? 340 if (_key->limit >= 0 && _key->count + _n > _key->limit) { // not enough room?
345 // don't send anything 341 // don't send anything
346 lua_settop(_K, 0); // _K: 342 lua_settop(_K, 0); // _K:
347 lua_pushboolean(_K, 0); // _K: false 343 lua_pushboolean(_K, 0); // _K: false
348 } else { 344 } else {
349 // _key should remain unchanged 345 // _key should remain unchanged
350 _key = KeyUD::PrepareAccess(_K, -1); // _K: linda key args... fifo 346 _key->prepareAccess(_K); // _K: linda key args... fifo
351 lua_replace(_K, 2); // _K: linda fifo args... 347 lua_replace(_K, 2); // _K: linda fifo args...
352 _key->push(_K, _n); // _K: linda fifo 348 _key->push(_K, _n); // _K: linda fifo
353 lua_settop(_K, 0); // _K: 349 lua_settop(_K, 0); // _K:
@@ -370,8 +366,9 @@ int keepercall_receive(lua_State* const L_)
370 for (int const _i : std::ranges::iota_view{ 2, _top + 1 }) { 366 for (int const _i : std::ranges::iota_view{ 2, _top + 1 }) {
371 lua_pushvalue(_K, _i); // _K: KeysDB keys... key[i] 367 lua_pushvalue(_K, _i); // _K: KeysDB keys... key[i]
372 lua_rawget(_K, 1); // _K: KeysDB keys... KeyUD 368 lua_rawget(_K, 1); // _K: KeysDB keys... KeyUD
373 KeyUD* const _key{ KeyUD::PrepareAccess(_K, -1) }; // _K: KeysDB keys... fifo 369 KeyUD* const _key{ KeyUD::GetPtr(_K, -1) };
374 if (_key != nullptr && _key->count > 0) { 370 if (_key != nullptr && _key->count > 0) {
371 _key->prepareAccess(_K); // _K: KeysDB keys... fifo
375 _key->pop(_K, 1); // _K: KeysDB keys... val 372 _key->pop(_K, 1); // _K: KeysDB keys... val
376 if (!lua_isnil(_K, -1)) { 373 if (!lua_isnil(_K, -1)) {
377 lua_replace(_K, 1); // _K: val keys... 374 lua_replace(_K, 1); // _K: val keys...
@@ -406,8 +403,9 @@ int keepercall_receive_batched(lua_State* const L_)
406 lua_pushvalue(_K, 1); // _K: key KeysDB key 403 lua_pushvalue(_K, 1); // _K: key KeysDB key
407 lua_rawget(_K, 2); // _K: key KeysDB KeyUD 404 lua_rawget(_K, 2); // _K: key KeysDB KeyUD
408 lua_remove(_K, 2); // _K: key KeyUD 405 lua_remove(_K, 2); // _K: key KeyUD
409 KeyUD* const _key{ KeyUD::PrepareAccess(_K, 2) }; // _K: key fifo 406 KeyUD* const _key{ KeyUD::GetPtr(_K, -1) };
410 if (_key != nullptr && _key->count >= _min_count) { 407 if (_key != nullptr && _key->count >= _min_count) {
408 _key->prepareAccess(_K); // _K: key fifo
411 _key->pop(_K, std::min(_max_count, _key->count)); // _K: key val... 409 _key->pop(_K, std::min(_max_count, _key->count)); // _K: key val...
412 } else { 410 } else {
413 lua_settop(_K, 0); // _K: 411 lua_settop(_K, 0); // _K:
@@ -435,13 +433,14 @@ int keepercall_limit(lua_State* const L_)
435 KeyUD* _key{ KeyUD::GetPtr(_K, -1) }; 433 KeyUD* _key{ KeyUD::GetPtr(_K, -1) };
436 if (_key == nullptr) { // _K: KeysDB key nil 434 if (_key == nullptr) { // _K: KeysDB key nil
437 lua_pop(_K, 1); // _K: KeysDB key 435 lua_pop(_K, 1); // _K: KeysDB key
438 _key = KeyUD::Create(_K); // _K: KeysDB key fifo 436 _key = KeyUD::Create(_K); // _K: KeysDB key KeyUD
439 lua_rawset(_K, -3); // _K: KeysDB 437 lua_rawset(_K, -3); // _K: KeysDB
440 } 438 }
441 // remove any clutter on the stack 439 // remove any clutter on the stack
442 lua_settop(_K, 0); // _K: 440 lua_settop(_K, 0); // _K:
443 // return true if we decide that blocked threads waiting to write on that key should be awakened 441 // return true if we decide that blocked threads waiting to write on that key should be awakened
444 // this is the case if we detect the key was full but it is no longer the case 442 // this is the case if we detect the key was full but it is no longer the case
443 // TODO: make this KeyUD::changeLimit() -> was full (bool)
445 if ( 444 if (
446 ((_key->limit >= 0) && (_key->count >= _key->limit)) // the key was full if limited and count exceeded the previous limit 445 ((_key->limit >= 0) && (_key->count >= _key->limit)) // the key was full if limited and count exceeded the previous limit
447 && ((_limit < 0) || (_key->count < _limit)) // the key is not full if unlimited or count is lower than the new limit 446 && ((_limit < 0) || (_key->count < _limit)) // the key is not full if unlimited or count is lower than the new limit
@@ -502,8 +501,8 @@ int keepercall_set(lua_State* const L_)
502 // we create room if the KeyUD was full but we didn't refill it to the brim with new data 501 // we create room if the KeyUD was full but we didn't refill it to the brim with new data
503 _should_wake_writers = _key->reset(_K) && (_count < _key->limit); 502 _should_wake_writers = _key->reset(_K) && (_count < _key->limit);
504 } 503 }
505 std::ignore = KeyUD::PrepareAccess(_K, -1); // _K: KeysDB key val... fifo 504 _key->prepareAccess(_K); // _K: KeysDB key val... fifo
506 // move the fifo below the values we want to store 505 // move the fifo below the values we want to store. can be slow if there are a lot. TODO: optimize that if possible
507 lua_insert(_K, 3); // _K: KeysDB key fifo val... 506 lua_insert(_K, 3); // _K: KeysDB key fifo val...
508 _key->push(_K, _count); // _K: KeysDB key fifo 507 _key->push(_K, _count); // _K: KeysDB key fifo
509 } 508 }
@@ -522,11 +521,12 @@ int keepercall_get(lua_State* const L_)
522 _count = static_cast<int>(lua_tointeger(_K, 3)); 521 _count = static_cast<int>(lua_tointeger(_K, 3));
523 lua_pop(_K, 1); // _K: linda key 522 lua_pop(_K, 1); // _K: linda key
524 } 523 }
525 PushKeysDB(_K, 1); // _K: linda key KeyUD 524 PushKeysDB(_K, 1); // _K: linda key KeysDB
526 lua_replace(_K, 1); // _K: KeyUD key 525 lua_replace(_K, 1); // _K: KeysDB key
527 lua_rawget(_K, 1); // _K: KeyUD fifo 526 lua_rawget(_K, 1); // _K: KeysDB KeyUD
528 KeyUD* const _key{ KeyUD::PrepareAccess(_K, -1) }; // _K: KeyUD fifo 527 KeyUD* const _key{ KeyUD::GetPtr(_K, -1) };
529 if (_key != nullptr && _key->count > 0) { 528 if (_key != nullptr && _key->count > 0) {
529 _key->prepareAccess(_K); // _K: KeysDB fifo
530 lua_remove(_K, 1); // _K: fifo 530 lua_remove(_K, 1); // _K: fifo
531 _count = std::min(_count, _key->count); 531 _count = std::min(_count, _key->count);
532 // read <count> value off the fifo 532 // read <count> value off the fifo