Re: svn commit: r1918258 - /apr/apr/trunk/file_io/unix/pipe.c

Ruediger Pluem <[email protected]>
Newsgroups gmane.comp.apache.apr.devel
Message-ID <[email protected]>

On 6/11/24 6:05 PM, [email protected] wrote:
> Author: jorton
> Date: Tue Jun 11 16:05:22 2024
> New Revision: 1918258
> 
> URL: http://svn.apache.org/viewvc?rev=1918258&view=rev
> Log:
> * file_io/unix/pipe.c (file_pipe_create): Use pipe2(,O_NONBLOCK) by
>   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.

I guess it is me being blind , but how do we save two syscalls for the
APR_READ_BLOCK and APR_WRITE_BLOCK case each? With the code before the patch
we started with a blocking pipe and needed to set one end of the pipe to non blocking.
Now we start with a non blocking pipe and need to set the other end to blocking.
Where did I get lost and miss the point?

Regards

Rüdiger

> 
> Github: closes #56
> 
> Modified:
>     apr/apr/trunk/file_io/unix/pipe.c
> 
> Modified: apr/apr/trunk/file_io/unix/pipe.c
> URL: http://svn.apache.org/viewvc/apr/apr/trunk/file_io/unix/pipe.c?rev=1918258&r1=1918257&r2=1918258&view=diff
> ==============================================================================
> --- apr/apr/trunk/file_io/unix/pipe.c (original)
> +++ apr/apr/trunk/file_io/unix/pipe.c Tue Jun 11 16:05:22 2024
> @@ -186,7 +186,10 @@ static apr_status_t file_pipe_create(apr
>      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;
>          }
> @@ -239,21 +242,14 @@ static apr_status_t file_pipe_create(apr
>      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;
>  }
>  
> 
> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.