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