From d172d8b621b473f2dff29b57dff93595e8307977 Mon Sep 17 00:00:00 2001
From: Konstantin Osipov <kostja@tarantool.org>
Date: Tue, 20 Nov 2012 22:01:57 +0400
Subject: [PATCH] Workaround a gcc bug with finally (try to at least).

Move the  block with @finally into an own function.
---
 src/coio.m | 26 +++++++++++++++++++-------
 1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/src/coio.m b/src/coio.m
index 84ab087614..c1c8a2c746 100644
--- a/src/coio.m
+++ b/src/coio.m
@@ -201,6 +201,23 @@ coio_write(struct ev_io *coio, const void *buf, size_t sz)
 	}
 }
 
+/*
+ * Write iov using sio API.
+ * Put in an own function to workaround gcc bug with @finally
+ */
+static inline ssize_t
+coio_flush(int fd, struct iovec *iov, ssize_t offset, int iovcnt)
+{
+	ssize_t nwr;
+	@try {
+		sio_add_to_iov(iov, -offset);
+		nwr = sio_writev(fd, iov, iovcnt);
+	} @finally {
+		sio_add_to_iov(iov, offset);
+	}
+	return nwr;
+}
+
 ssize_t
 coio_writev(struct ev_io *coio, struct iovec *iov, int iovcnt, size_t size_hint)
 {
@@ -211,13 +228,8 @@ coio_writev(struct ev_io *coio, struct iovec *iov, int iovcnt, size_t size_hint)
 		/* Avoid a syscall in case of 0 iovcnt. */
 		while (iov < end) {
 			/* Write as much data as possible. */
-			ssize_t nwr;
-			@try {
-				sio_add_to_iov(iov, -iov_len);
-				nwr = sio_writev(coio->fd, iov, end - iov);
-			} @finally {
-				sio_add_to_iov(iov, iov_len);
-			}
+			ssize_t nwr = coio_flush(coio->fd, iov, iov_len,
+						 end - iov);
 			if (nwr >= 0) {
 				total += nwr;
 				/*
-- 
GitLab