Skip to content

Commit

Permalink
* file_io/unix/pipe.c (file_pipe_create): Use pipe2(,O_NONBLOCK) by
Browse files Browse the repository at this point in the history
  default unless APR_FULL_BLOCK was used; unconditionally set the
  blocking state later. Saves two syscalls per invocation for both
  APR_READ_BLOCK and APR_WRITE_BLOCK, no [intended] functional change.
  • Loading branch information
notroj committed May 10, 2024
1 parent eecbe1f commit 9051fa1
Showing 1 changed file with 12 additions and 16 deletions.
28 changes: 12 additions & 16 deletions file_io/unix/pipe.c
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,10 @@ static apr_status_t file_pipe_create(apr_file_t **in,
apr_interval_time_t fd_timeout;

#ifdef HAVE_PIPE2
if (blocking == APR_FULL_NONBLOCK) {
/* If pipe2() is available, use O_NONBLOCK by default unless
* APR_FULL_BLOCK is requested, then set the individual pipe state
* as desired later - changing the state uses two syscalls. */
if (blocking != APR_FULL_BLOCK) {
if (pipe2(filedes, O_NONBLOCK) == -1) {
return errno;
}
Expand Down Expand Up @@ -239,21 +242,14 @@ static apr_status_t file_pipe_create(apr_file_t **in,
apr_pool_cleanup_register((*out)->pool, (void *)(*out), apr_unix_file_cleanup,
apr_pool_cleanup_null);

switch (blocking) {
case APR_FULL_BLOCK:
break;
case APR_READ_BLOCK:
apr_file_pipe_timeout_set(*out, 0);
break;
case APR_WRITE_BLOCK:
apr_file_pipe_timeout_set(*in, 0);
break;
default:
/* These are noops for the pipe2() case */
apr_file_pipe_timeout_set(*out, 0);
apr_file_pipe_timeout_set(*in, 0);
break;
}
/* Set each pipe to the desired O_NONBLOCK state, which may be a
* noop depending on whether the pipe2() or pipe() case was
* used. (timeout of -1 == blocking) */
apr_file_pipe_timeout_set(*in, (blocking == APR_FULL_BLOCK
|| blocking == APR_READ_BLOCK) ? -1 : 0);
apr_file_pipe_timeout_set(*out, (blocking == APR_FULL_BLOCK
|| blocking == APR_WRITE_BLOCK) ? -1 : 0);

return APR_SUCCESS;
}

Expand Down

0 comments on commit 9051fa1

Please sign in to comment.