From: Alexander Turenko <alexander.turenko@tarantool.org> To: Cyrill Gorcunov <gorcunov@gmail.com> Cc: tarantool-patches@dev.tarantool.org Subject: [Tarantool-patches] [PATCH 12/13] coio: add *_noxc read / write functions Date: Fri, 10 Apr 2020 05:50:50 +0300 [thread overview] Message-ID: <328813debe7020378d0faa79bc3eee8cd00f6197.1586486220.git.alexander.turenko@tarantool.org> (raw) In-Reply-To: <cover.1586486219.git.alexander.turenko@tarantool.org> The popen implementation is written in C and uses coio read / write functions. If an exception occurs, it'll pass through the C code. It should be catched to proceed correctly. We usually have foo() and foo_xc() (exception) functions when both variants are necessary. Here I added non-conventional *_noxc() functions as the temporary solution to postpone refactoring of the code and all its usages. Part of #4031 --- src/lib/core/coio.cc | 39 +++++++++++++++++++++++++++++++++++++++ src/lib/core/coio.h | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/src/lib/core/coio.cc b/src/lib/core/coio.cc index 74e6240ce..6a113aa47 100644 --- a/src/lib/core/coio.cc +++ b/src/lib/core/coio.cc @@ -381,6 +381,26 @@ coio_readn_ahead_timeout(struct ev_io *coio, void *buf, size_t sz, size_t bufsiz return nrd; } +/* + * FIXME: Rewrite coio_read_ahead_timeout() w/o C++ exceptions and + * drop this function. + */ +ssize_t +coio_read_ahead_timeout_noxc(struct ev_io *coio, void *buf, size_t sz, + size_t bufsiz, ev_tstamp timeout) +{ + try { + return coio_read_ahead_timeout(coio, buf, sz, bufsiz, timeout); + } catch (Exception *) { + /* + * The exception is already in the diagnostics + * area. Nothing to do. + */ + } + return -1; +} + + /** Write sz bytes to socket. * * Throws SocketError in case of write error. If @@ -437,6 +457,25 @@ coio_write_timeout(struct ev_io *coio, const void *buf, size_t sz, } } +/* + * FIXME: Rewrite coio_write_timeout() w/o C++ exceptions and drop + * this function. + */ +ssize_t +coio_write_timeout_noxc(struct ev_io *coio, const void *buf, size_t sz, + ev_tstamp timeout) +{ + try { + return coio_write_timeout(coio, buf, sz, timeout); + } catch (Exception *) { + /* + * The exception is already in the diagnostics + * area. Nothing to do. + */ + } + return -1; +} + /* * Write iov using sio API. * Put in an own function to workaround gcc bug with @finally diff --git a/src/lib/core/coio.h b/src/lib/core/coio.h index c323955d7..7875a0da1 100644 --- a/src/lib/core/coio.h +++ b/src/lib/core/coio.h @@ -130,6 +130,29 @@ coio_read_timeout(struct ev_io *coio, void *buf, size_t sz, ev_tstamp timeout) return coio_read_ahead_timeout(coio, buf, sz, sz, timeout); } +/** + * Read data with timeout. + * + * Yield until some data will be available for read. + * + * Returns amount of read bytes at success, otherwise returns -1 + * and set a diag. + * + * Zero return value means EOF. + * + * Note: Less then @a count bytes may be available for read at a + * moment, so a return value less then @a count does not mean EOF. + * + * Possible errors: + * + * - SocketError: an IO error occurs at read(). + * - TimedOut: @a timeout quota is exceeded. + * - FiberIsCancelled: cancelled by an outside code. + */ +ssize_t +coio_read_ahead_timeout_noxc(struct ev_io *coio, void *buf, size_t sz, + size_t bufsiz, ev_tstamp timeout); + static inline ssize_t coio_readn(struct ev_io *coio, void *buf, size_t sz) { @@ -144,6 +167,24 @@ ssize_t coio_write_timeout(struct ev_io *coio, const void *buf, size_t sz, ev_tstamp timeout); +/** + * Write @a count bytes with timeout. + * + * Yield until all @a count bytes will be written. + * + * Returns @a count at success, otherwise returns -1 and set a + * diag. + * + * Possible errors: + * + * - SocketError: an IO error occurs at write(). + * - TimedOut: @a timeout quota is exceeded. + * - FiberIsCancelled: cancelled by an outside code. + */ +ssize_t +coio_write_timeout_noxc(struct ev_io *coio, const void *buf, size_t sz, + ev_tstamp timeout); + static inline void coio_write(struct ev_io *coio, const void *buf, size_t sz) { -- 2.25.0
next prev parent reply other threads:[~2020-04-10 2:51 UTC|newest] Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-04-10 2:50 [Tarantool-patches] [PATCH 00/13] Popen Lua API: preliminary patches Alexander Turenko 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 01/13] popen: require popen handle to be non-NULL Alexander Turenko 2020-04-10 7:16 ` Cyrill Gorcunov 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 02/13] popen: remove retval from popen_state() Alexander Turenko 2020-04-10 7:17 ` Cyrill Gorcunov 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 03/13] popen: add missed diag_set in popen_signal/delete Alexander Turenko 2020-04-10 7:23 ` Cyrill Gorcunov 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 04/13] popen: add logging of fds closed in a child Alexander Turenko 2020-04-10 7:46 ` Cyrill Gorcunov 2020-04-10 12:19 ` Alexander Turenko 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 05/13] say: allow to set a logger file descriptor Alexander Turenko 2020-04-10 8:33 ` Cyrill Gorcunov 2020-04-10 12:19 ` Alexander Turenko 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 06/13] popen: decouple logger fd from stderr Alexander Turenko 2020-04-10 9:18 ` Cyrill Gorcunov 2020-04-10 12:20 ` Alexander Turenko 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 07/13] popen: add const qualifier to popen_write_timeout Alexander Turenko 2020-04-10 8:04 ` Cyrill Gorcunov 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 08/13] popen: unblock popen_read_timeout at a first byte Alexander Turenko 2020-04-10 8:10 ` Cyrill Gorcunov 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 09/13] popen: remove redundant fd check before perform IO Alexander Turenko 2020-04-10 8:18 ` Cyrill Gorcunov 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 10/13] popen: add missed diag_set() in popen IO functions Alexander Turenko 2020-04-10 8:28 ` Cyrill Gorcunov 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 11/13] coio: fix obsoleted comment in coio_write_timeout Alexander Turenko 2020-04-10 8:28 ` Cyrill Gorcunov 2020-04-10 2:50 ` Alexander Turenko [this message] 2020-04-10 8:05 ` [Tarantool-patches] [PATCH 12/13] coio: add *_noxc read / write functions Konstantin Osipov 2020-04-10 8:17 ` Cyrill Gorcunov 2020-04-10 11:57 ` Alexander Turenko 2020-04-12 12:51 ` Alexander Turenko 2020-04-10 8:29 ` Cyrill Gorcunov 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 13/13] popen: use of exception safe functions for IO Alexander Turenko 2020-04-10 11:50 ` Cyrill Gorcunov 2020-04-10 12:21 ` Alexander Turenko 2020-04-10 16:36 ` [Tarantool-patches] [PATCH 00/13] Popen Lua API: preliminary patches Kirill Yukhin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=328813debe7020378d0faa79bc3eee8cd00f6197.1586486220.git.alexander.turenko@tarantool.org \ --to=alexander.turenko@tarantool.org \ --cc=gorcunov@gmail.com \ --cc=tarantool-patches@dev.tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH 12/13] coio: add *_noxc read / write functions' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox