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