From 4382f7feda0658f7641a87c253204d51dbdd51af Mon Sep 17 00:00:00 2001
From: Konstantin Osipov <kostja@tarantool.org>
Date: Mon, 10 Dec 2018 20:50:50 +0300
Subject: [PATCH] sio: remove exceptions

Propagate exceptions up to the caller.

In scope of #3234
---
 src/coio.cc |  3 +++
 src/evio.cc | 12 +++++++++---
 src/sio.cc  |  4 ++--
 3 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/src/coio.cc b/src/coio.cc
index e91de40b5c..c5bdf4b254 100644
--- a/src/coio.cc
+++ b/src/coio.cc
@@ -35,6 +35,7 @@
 #include <netinet/tcp.h>
 #include <stdio.h>
 #include <arpa/inet.h>
+#include <errno.h>
 
 #include "sio.h"
 #include "scoped_guard.h"
@@ -258,6 +259,8 @@ coio_accept(struct ev_io *coio, struct sockaddr *addr,
 					       SOCK_STREAM);
 			return fd;
 		}
+		if (! sio_wouldblock(errno))
+			diag_raise();
 		/* The socket is not ready, yield */
 		if (! ev_is_active(coio)) {
 			ev_io_set(coio, coio->fd, EV_READ);
diff --git a/src/evio.cc b/src/evio.cc
index a6ac65daf8..c0addaf16d 100644
--- a/src/evio.cc
+++ b/src/evio.cc
@@ -184,8 +184,11 @@ evio_service_accept_cb(ev_loop * /* loop */, ev_io *watcher,
 			fd = sio_accept(service->ev.fd,
 				(struct sockaddr *)&addr, &addrlen);
 
-			if (fd < 0) /* EAGAIN, EWOULDLOCK, EINTR */
+			if (fd < 0) {
+				if (! sio_wouldblock(errno))
+					diag_raise();
 				return;
+			}
 			/* set common client socket options */
 			evio_setsockopt_client(fd, service->addr.sa_family, SOCK_STREAM);
 			/*
@@ -295,8 +298,11 @@ evio_service_listen(struct evio_service *service)
 
 	int fd = service->ev.fd;
 	if (sio_listen(fd)) {
-		/* raise for addr in use to */
-		tnt_raise(SocketError, sio_socketname(fd), "listen");
+		if (diag_is_empty(diag_get())) {
+			/* Raise for addr in use to */
+			diag_set(SocketError, sio_socketname(fd), "listen");
+		}
+		diag_raise();
 	}
 	ev_io_start(service->loop, &service->ev);
 }
diff --git a/src/sio.cc b/src/sio.cc
index 5dcf9fdd19..0c874404ec 100644
--- a/src/sio.cc
+++ b/src/sio.cc
@@ -203,7 +203,7 @@ sio_listen(int fd)
 {
 	int rc = listen(fd, sio_listen_backlog());
 	if (rc < 0 && errno != EADDRINUSE)
-		tnt_raise(SocketError, sio_socketname(fd), "listen");
+		diag_set(SocketError, sio_socketname(fd), "listen");
 	return rc;
 }
 
@@ -213,7 +213,7 @@ sio_accept(int fd, struct sockaddr *addr, socklen_t *addrlen)
 	/* Accept a connection. */
 	int newfd = accept(fd, addr, addrlen);
 	if (newfd < 0 && !sio_wouldblock(errno))
-		tnt_raise(SocketError, sio_socketname(fd), "accept");
+		diag_set(SocketError, sio_socketname(fd), "accept");
 	return newfd;
 }
 
-- 
GitLab