From 9cf2a7e1e2d7181b0135eb6b9c1a4e6577924076 Mon Sep 17 00:00:00 2001 From: Roman Tsisyk <roman@tsisyk.com> Date: Fri, 18 Jul 2014 14:43:42 +0400 Subject: [PATCH] Remove fiber:wakeup() from public API --- src/lua/bsdsocket.cc | 16 ++++++++++++++++ src/lua/bsdsocket.lua | 6 +++--- src/lua/fiber.cc | 9 --------- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/lua/bsdsocket.cc b/src/lua/bsdsocket.cc index 04df4b59ae..016df83d64 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 06be8295d4..0c85b55f2c 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 dd1036c68c..ba69d6ac00 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}, -- GitLab