From: Jérémie Galarneau Date: Fri, 5 May 2017 02:54:17 +0000 (-0400) Subject: Add pipe_release utils to the pipe wrapper X-Git-Tag: v2.10.0-rc1~48 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=55dfb029ae73f7a8987c00154ffdddabdf4a1e8c;p=lttng-tools.git Add pipe_release utils to the pipe wrapper Signed-off-by: Jérémie Galarneau --- diff --git a/src/common/pipe.c b/src/common/pipe.c index c8f001415..52ee08a97 100644 --- a/src/common/pipe.c +++ b/src/common/pipe.c @@ -404,3 +404,69 @@ error: unlock_write_side(pipe); return ret; } + +/* + * Return and release the read end of the pipe. + * + * This call transfers the ownership of the read fd of the underlying pipe + * to the caller if it is still open. + * + * Returns the fd of the read end of the pipe, or -1 if it was already closed or + * released. + */ +LTTNG_HIDDEN +int lttng_pipe_release_readfd(struct lttng_pipe *pipe) +{ + int ret; + + if (!pipe) { + ret = -1; + goto end; + } + + lock_read_side(pipe); + if (!lttng_pipe_is_read_open(pipe)) { + ret = -1; + goto end_unlock; + } + ret = pipe->fd[0]; + pipe->fd[0] = -1; + pipe->r_state = LTTNG_PIPE_STATE_CLOSED; +end_unlock: + unlock_read_side(pipe); +end: + return ret; +} + +/* + * Return and release the write end of the pipe. + * + * This call transfers the ownership of the write fd of the underlying pipe + * to the caller if it is still open. + * + * Returns the fd of the write end of the pipe, or -1 if it was alwritey closed + * or released. + */ +LTTNG_HIDDEN +int lttng_pipe_release_writefd(struct lttng_pipe *pipe) +{ + int ret; + + if (!pipe) { + ret = -1; + goto end; + } + + lock_write_side(pipe); + if (!lttng_pipe_is_write_open(pipe)) { + ret = -1; + goto end_unlock; + } + ret = pipe->fd[1]; + pipe->fd[1] = -1; + pipe->w_state = LTTNG_PIPE_STATE_CLOSED; +end_unlock: + unlock_write_side(pipe); +end: + return ret; +} diff --git a/src/common/pipe.h b/src/common/pipe.h index 1a1087c10..2d4fc967d 100644 --- a/src/common/pipe.h +++ b/src/common/pipe.h @@ -93,5 +93,11 @@ ssize_t lttng_pipe_read(struct lttng_pipe *pipe, void *buf, size_t count); LTTNG_HIDDEN ssize_t lttng_pipe_write(struct lttng_pipe *pipe, const void *buf, size_t count); +/* Returns and releases the read end of the pipe. */ +LTTNG_HIDDEN +int lttng_pipe_release_readfd(struct lttng_pipe *pipe); +/* Returns and releases the write end of the pipe. */ +LTTNG_HIDDEN +int lttng_pipe_release_writefd(struct lttng_pipe *pipe); #endif /* LTTNG_PIPE_H */