bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

pipe-filter-ii: fix test failure


From: Bruno Haible
Subject: pipe-filter-ii: fix test failure
Date: Sun, 5 Jun 2011 19:15:51 +0200
User-agent: KMail/1.9.9

On AIX 5.1, 7.1 and IRIX 6.5, the pipe-filter-ii test fails like this:

  ./test-pipe-filter-ii1: write to tr subprocess failed: Resource temporarily 
unavailable
  FAIL: test-pipe-filter-ii1.sh

This fixes it.


2011-06-05  Bruno Haible  <address@hidden>

        pipe-filter-ii: Fix test failure on AIX and IRIX.
        * lib/pipe-filter-ii.c (pipe_filter_ii_execute): When write() fails
        with EAGAIN, retry with a smaller buffer size.

*** lib/pipe-filter-ii.c.orig   Sun Jun  5 19:12:12 2011
--- lib/pipe-filter-ii.c        Sun Jun  5 18:57:39 2011
***************
*** 347,367 ****
              const void *buf = prepare_write (&bufsize, private_data);
              if (buf != NULL)
                {
!                 ssize_t nwritten =
!                   write (fd[1], buf,
!                          bufsize > SSIZE_MAX ? SSIZE_MAX : bufsize);
!                 if (nwritten < 0)
                    {
!                     if (!IS_EAGAIN (errno))
                        {
!                         if (exit_on_error)
!                           error (EXIT_FAILURE, errno,
!                                  _("write to %s subprocess failed"), 
progname);
!                         goto fail;
                        }
                    }
-                 else if (nwritten > 0)
-                   done_write ((void *) buf, nwritten, private_data);
                }
              else
                {
--- 347,388 ----
              const void *buf = prepare_write (&bufsize, private_data);
              if (buf != NULL)
                {
!                 /* Writing to a pipe in non-blocking mode is tricky: The
!                    write() call may fail with EAGAIN, simply because suffcient
!                    space is not available in the pipe. See POSIX:2008
!                    
<http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html>.
!                    This happens actually on AIX and IRIX, when bufsize >= 8192
!                    (even though PIPE_BUF and pathconf ("/", _PC_PIPE_BUF) are
!                    both 32768).  */
!                 size_t attempt_to_write =
!                   (bufsize > SSIZE_MAX ? SSIZE_MAX : bufsize);
!                 for (;;)
                    {
!                     ssize_t nwritten = write (fd[1], buf, attempt_to_write);
!                     if (nwritten < 0)
                        {
!                         if (errno == EAGAIN)
!                           {
!                             attempt_to_write = attempt_to_write / 2;
!                             if (attempt_to_write == 0)
!                               break;
!                           }
!                         else if (!IS_EAGAIN (errno))
!                           {
!                             if (exit_on_error)
!                               error (EXIT_FAILURE, errno,
!                                      _("write to %s subprocess failed"),
!                                      progname);
!                             goto fail;
!                           }
!                       }
!                     else
!                       {
!                         if (nwritten > 0)
!                           done_write ((void *) buf, nwritten, private_data);
!                         break;
                        }
                    }
                }
              else
                {

-- 
In memoriam Eduard Lederer <http://de.wikipedia.org/wiki/Eduard_Lederer>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]