aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lane.cpp34
1 files changed, 20 insertions, 14 deletions
diff --git a/src/lane.cpp b/src/lane.cpp
index 65a776e..cb20930 100644
--- a/src/lane.cpp
+++ b/src/lane.cpp
@@ -105,7 +105,7 @@ static LUAG_FUNC(lane_threadname)
105// ################################################################################################# 105// #################################################################################################
106 106
107//--- 107//---
108// [...] | [nil, err_any, stack_tbl]= lane:join([wait_secs]) 108// [true, ...] | [nil, err_any, stack_tbl]= lane:join([wait_secs])
109// 109//
110// timeout: returns nil 110// timeout: returns nil
111// done: returns return values (0..N) 111// done: returns return values (0..N)
@@ -147,18 +147,19 @@ static LUAG_FUNC(lane_join)
147 switch (_lane->status.load(std::memory_order_acquire)) { 147 switch (_lane->status.load(std::memory_order_acquire)) {
148 case Lane::Suspended: // got yielded values 148 case Lane::Suspended: // got yielded values
149 case Lane::Done: // got regular return values 149 case Lane::Done: // got regular return values
150 { 150 if (_stored > 0) {
151 if (_stored == 0) {
152 raise_luaL_error(L_, _lane->L ? "First return value must be non-nil when using join()" : "Can't join() more than once or after indexing");
153 }
154 lua_getiuservalue(L_, StackIndex{ 1 }, UserValueIndex{ 1 }); // L_: lane {uv} 151 lua_getiuservalue(L_, StackIndex{ 1 }, UserValueIndex{ 1 }); // L_: lane {uv}
155 for (int _i = 2; _i <= _stored; ++_i) { 152 for (int _i = 2; _i <= _stored; ++_i) {
156 lua_rawgeti(L_, 2, _i); // L_: lane {uv} results2...N 153 lua_rawgeti(L_, 2, _i); // L_: lane {uv} results2...N
157 } 154 }
158 lua_rawgeti(L_, 2, 1); // L_: lane {uv} results2...N result1 155 lua_rawgeti(L_, 2, 1); // L_: lane {uv} results2...N result1
159 lua_replace(L_, 2); // L_: lane results 156 lua_replace(L_, 2); // L_: lane results
160 _ret = _stored;
161 } 157 }
158 // we precede the lane body returned values with boolean true
159 lua_pushboolean(L_, 1); // L_: lane results true
160 lua_replace(L_, 1); // L_: true results
161 _ret = _stored + 1;
162 STACK_CHECK(L_, _stored);
162 break; 163 break;
163 164
164 case Lane::Error: 165 case Lane::Error:
@@ -174,25 +175,30 @@ static LUAG_FUNC(lane_join)
174 lua_replace(L_, 2); // L_: lane nil <error> <trace> 175 lua_replace(L_, 2); // L_: lane nil <error> <trace>
175 } 176 }
176 _ret = lua_gettop(L_) - 1; // 2 or 3 177 _ret = lua_gettop(L_) - 1; // 2 or 3
178 STACK_CHECK(L_, _ret);
177 } 179 }
178 break; 180 break;
179 181
180 case Lane::Cancelled: 182 case Lane::Cancelled:
181 LUA_ASSERT(L_, _stored == 2); 183 {
182 lua_getiuservalue(L_, StackIndex{ 1 }, UserValueIndex{ 1 }); // L_: lane {uv} 184 LUA_ASSERT(L_, _stored == 2);
183 lua_rawgeti(L_, 2, 2); // L_: lane {uv} cancel_error 185 lua_getiuservalue(L_, StackIndex{ 1 }, UserValueIndex{ 1 }); // L_: lane {uv}
184 lua_rawgeti(L_, 2, 1); // L_: lane {uv} cancel_error nil 186 lua_rawgeti(L_, 2, 2); // L_: lane {uv} cancel_error
185 lua_replace(L_, -3); // L_: lane nil cancel_error 187 lua_rawgeti(L_, 2, 1); // L_: lane {uv} cancel_error nil
186 LUA_ASSERT(L_, lua_isnil(L_, -2) && kCancelError.equals(L_, kIdxTop)); 188 lua_replace(L_, -3); // L_: lane nil cancel_error
187 _ret = 2; 189 LUA_ASSERT(L_, lua_isnil(L_, -2) && kCancelError.equals(L_, kIdxTop));
190 _ret = 2;
191 STACK_CHECK(L_, _ret);
192 }
188 break; 193 break;
189 194
190 default: 195 default:
191 DEBUGSPEW_CODE(DebugSpew(nullptr) << "Unknown Lane status: " << static_cast<int>(_lane->status.load(std::memory_order_relaxed)) << std::endl); 196 DEBUGSPEW_CODE(DebugSpew(nullptr) << "Unknown Lane status: " << static_cast<int>(_lane->status.load(std::memory_order_relaxed)) << std::endl);
192 LUA_ASSERT(L_, false); 197 LUA_ASSERT(L_, false);
193 _ret = 0; 198 _ret = 0;
199 STACK_CHECK(L_, _ret);
194 } 200 }
195 STACK_CHECK(L_, _ret); 201 LUA_ASSERT(L_, lua_gettop(L_) >= _ret);
196 return _ret; 202 return _ret;
197} 203}
198 204