aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBenoit Germain <benoit.germain@ubisoft.com>2024-05-20 15:49:28 +0200
committerBenoit Germain <benoit.germain@ubisoft.com>2024-05-20 15:49:28 +0200
commit9a0781e52fd0f9eac8ac75c18d7f58936fb6c981 (patch)
treeb0766998fe71a89e4f968dac1e669684d7cb7d88 /src
parent5e5f08558010890206e1d2d11045870c35eb23cf (diff)
downloadlanes-9a0781e52fd0f9eac8ac75c18d7f58936fb6c981.tar.gz
lanes-9a0781e52fd0f9eac8ac75c18d7f58936fb6c981.tar.bz2
lanes-9a0781e52fd0f9eac8ac75c18d7f58936fb6c981.zip
linda:limit uses nil instead of -1 to unblock
Diffstat (limited to 'src')
-rw-r--r--src/keeper.cpp10
-rw-r--r--src/linda.cpp11
2 files changed, 11 insertions, 10 deletions
diff --git a/src/keeper.cpp b/src/keeper.cpp
index 2f8817c..9bde2d5 100644
--- a/src/keeper.cpp
+++ b/src/keeper.cpp
@@ -359,14 +359,14 @@ int keepercall_receive_batched(lua_State* L_)
359 359
360// ################################################################################################# 360// #################################################################################################
361 361
362// in: linda_ud key n 362// in: linda_ud key [n|nil]
363// out: true or nil 363// out: true or nil
364int keepercall_limit(lua_State* L_) 364int keepercall_limit(lua_State* L_)
365{ 365{
366 int const _limit{ static_cast<int>(lua_tointeger(L_, 3)) }; 366 int const _limit{ static_cast<int>(luaL_optinteger(L_, 3, -1)) }; // -1 if we read nil because the argument is absent
367 push_table(L_, 1); // L_: ud key n fifos 367 push_table(L_, 1); // L_: ud key n? fifos
368 lua_replace(L_, 1); // L_: fifos key n 368 lua_replace(L_, 1); // L_: fifos key n?
369 lua_pop(L_, 1); // L_: fifos key 369 lua_settop(L_, 2); // L_: fifos key
370 lua_pushvalue(L_, -1); // L_: fifos key key 370 lua_pushvalue(L_, -1); // L_: fifos key key
371 lua_rawget(L_, -3); // L_: fifos key fifo|nil 371 lua_rawget(L_, -3); // L_: fifos key fifo|nil
372 keeper_fifo* _fifo{ keeper_fifo::getPtr(L_, -1) }; 372 keeper_fifo* _fifo{ keeper_fifo::getPtr(L_, -1) };
diff --git a/src/linda.cpp b/src/linda.cpp
index 76607a4..48da1cf 100644
--- a/src/linda.cpp
+++ b/src/linda.cpp
@@ -354,21 +354,22 @@ LUAG_FUNC(linda_get)
354// ################################################################################################# 354// #################################################################################################
355 355
356/* 356/*
357 * [true] = linda_limit( linda_ud, key_num|str|bool|lightuserdata, int) 357 * [true] = linda_limit( linda_ud, key_num|str|bool|lightuserdata, [int])
358 * 358 *
359 * Set limit to 1 Linda keys. 359 * Set limit to 1 Linda keys.
360 * Optionally wake threads waiting to write on the linda, in case the limit enables them to do so 360 * Optionally wake threads waiting to write on the linda, in case the limit enables them to do so
361 * Limit can be 0 to completely block everything 361 * Limit can be 0 to completely block everything, nil to reset
362 */ 362 */
363LUAG_FUNC(linda_limit) 363LUAG_FUNC(linda_limit)
364{ 364{
365 auto _limit = [](lua_State* L_) { 365 auto _limit = [](lua_State* L_) {
366 Linda* const _linda{ ToLinda<false>(L_, 1) }; 366 Linda* const _linda{ ToLinda<false>(L_, 1) };
367 // make sure we got 3 arguments: the linda, a key and a limit 367 // make sure we got 3 arguments: the linda, a key and a limit
368 luaL_argcheck(L_, lua_gettop(L_) == 3, 2, "wrong number of arguments"); 368 int const _nargs{ lua_gettop(L_) };
369 luaL_argcheck(L_, _nargs == 2 || _nargs == 3, 2, "wrong number of arguments");
369 // make sure we got a numeric limit 370 // make sure we got a numeric limit
370 lua_Number const _limit{ luaL_checknumber(L_, 3) }; 371 lua_Integer const _limit{ luaL_optinteger(L_, 3, 0) };
371 if (_limit < 1) { 372 if (_limit < 0) {
372 raise_luaL_argerror(L_, 3, "limit must be >= 0"); 373 raise_luaL_argerror(L_, 3, "limit must be >= 0");
373 } 374 }
374 // make sure the key is of a valid type 375 // make sure the key is of a valid type