From 0b231d7cdbcf944ce85fcb8c15fa7cc1a27503e3 Mon Sep 17 00:00:00 2001 From: Konstantin Osipov <kostja@tarantool.org> Date: Thu, 31 Jul 2014 19:24:38 +0400 Subject: [PATCH] A fix for gh-361: new sockets don't respect fiber cancel. Add a testcancel() call to iowait(). A test case will be added to 1.6, where it's easier to do. --- src/lua/bsdsocket.cc | 2 ++ src/lua/bsdsocket.lua | 1 + test/box/bsdsocket.result | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lua/bsdsocket.cc b/src/lua/bsdsocket.cc index f506998b9c..570faca546 100644 --- a/src/lua/bsdsocket.cc +++ b/src/lua/bsdsocket.cc @@ -427,7 +427,9 @@ lbox_bsdsocket_iowait(struct lua_State *L) ev_set_priority(&io, EV_MAXPRI); ev_io_start(&io); + fiber_setcancellable(true); fiber_yield_timeout(timeout); + fiber_setcancellable(false); ev_io_stop(&io); int ret = 0; diff --git a/src/lua/bsdsocket.lua b/src/lua/bsdsocket.lua index 9a9ac7ef33..628705ca51 100644 --- a/src/lua/bsdsocket.lua +++ b/src/lua/bsdsocket.lua @@ -180,6 +180,7 @@ local function wait_safely(self, what, timeout) self.waiters[fid] = f local res = box.socket.internal.iowait(self.fh, what, timeout) self.waiters[fid] = nil + box.fiber.testcancel() return res end diff --git a/test/box/bsdsocket.result b/test/box/bsdsocket.result index ad78ab5db4..aff05e6d65 100644 --- a/test/box/bsdsocket.result +++ b/test/box/bsdsocket.result @@ -219,7 +219,7 @@ lua s:getsockopt('SOL_SOCKET', 'SO_DEBUG') ... lua s:setsockopt('SOL_SOCKET', 'SO_ACCEPTCONN', 1) --- -error: '[string "-- bsdsocket.lua (internal file)..."]:321: Socket option SO_ACCEPTCONN is read only' +error: '[string "-- bsdsocket.lua (internal file)..."]:322: Socket option SO_ACCEPTCONN is read only' ... lua s:getsockopt('SOL_SOCKET', 'SO_RCVBUF') > 32 --- -- GitLab