diff --git a/src/lua/bsdsocket.cc b/src/lua/bsdsocket.cc index 04df4b59ae0fe65e0eafe090ec9a410482c314b7..016df83d6411b1a19412355cf75080de10a6dcb4 100644 --- a/src/lua/bsdsocket.cc +++ b/src/lua/bsdsocket.cc @@ -832,6 +832,21 @@ lbox_bsdsocket_recvfrom(struct lua_State *L) return 2; } +/** + * A special method to abort fiber blocked by iowait() by fid. + * Used only by socket:close(). + */ +static int +lbox_bsdsocket_abort(struct lua_State *L) +{ + int fid = lua_tointeger(L, 1); + struct fiber *fiber = fiber_find(fid); + if (fiber == NULL || !(fiber->flags & FIBER_USER_MODE)) + return 0; + fiber_wakeup(fiber); + return 0; +} + void tarantool_lua_bsdsocket_init(struct lua_State *L) { @@ -841,6 +856,7 @@ tarantool_lua_bsdsocket_init(struct lua_State *L) { "name", lbox_bsdsocket_soname }, { "peer", lbox_bsdsocket_peername }, { "recvfrom", lbox_bsdsocket_recvfrom }, + { "abort", lbox_bsdsocket_abort }, { NULL, NULL } }; diff --git a/src/lua/bsdsocket.lua b/src/lua/bsdsocket.lua index 06be8295d4a2ea84f70e691161991e924f6388b6..0c85b55f2c25513ae2898bde4dde2a8aa0d84318 100644 --- a/src/lua/bsdsocket.lua +++ b/src/lua/bsdsocket.lua @@ -187,7 +187,7 @@ local function wait_safely(self, what, timeout) self.waiters = {} end - self.waiters[fid] = f + self.waiters[fid] = true local res = internal.iowait(self.fh, what, timeout) self.waiters[fid] = nil return res @@ -280,8 +280,8 @@ end socket_methods.close = function(self) if self.waiters ~= nil then - for fid, fiber in pairs(self.waiters) do - fiber:wakeup() + for fid in pairs(self.waiters) do + internal.abort(fid) self.waiters[fid] = nil end end diff --git a/src/lua/fiber.cc b/src/lua/fiber.cc index dd1036c68c5e08e1cbd309bb2ce9169721d16139..ba69d6ac001d6f00d39f50e47eb824c3e9606479 100644 --- a/src/lua/fiber.cc +++ b/src/lua/fiber.cc @@ -255,14 +255,6 @@ lbox_fiber_info(struct lua_State *L) return 1; } -static int -lbox_fiber_wakeup(struct lua_State *L) -{ - struct fiber *f = lbox_checkfiber(L, 1); - fiber_wakeup(f); - return 0; -} - static void box_lua_fiber_run_detached(va_list ap) { @@ -461,7 +453,6 @@ lbox_fiber_time64(struct lua_State *L) static const struct luaL_reg lbox_fiber_meta [] = { {"id", lbox_fiber_id}, {"name", lbox_fiber_name}, - {"wakeup", lbox_fiber_wakeup}, {"cancel", lbox_fiber_cancel}, {"status", lbox_fiber_status}, {"testcancel", lbox_fiber_testcancel},