OSDN Git Service

* fhandler.cc (fhandler_base::wait_overlapped): Always assume that bytes will
authorcgf <cgf>
Wed, 20 Aug 2008 02:25:05 +0000 (02:25 +0000)
committercgf <cgf>
Wed, 20 Aug 2008 02:25:05 +0000 (02:25 +0000)
be non-NULL.  Distinguish input result from result derived from WFMO and
GetOverlappedResult or res can never be -1.  Only raise SIGPIPE when writing.
* fhandler.h (fhandler_base::wait_overlapped): Pass first argument by value.
* fhandler_fifo.cc (fhandler_fifo::wait): Pass in dummy byte count to
wait_overlapped.
* pipe.cc (DEFAULT_PIPEBUFSIZE): Define to 65536 explicitly.

winsup/cygwin/ChangeLog
winsup/cygwin/fhandler.cc
winsup/cygwin/fhandler.h
winsup/cygwin/fhandler_fifo.cc
winsup/cygwin/pipe.cc

index 42e57fb..056af72 100644 (file)
@@ -1,3 +1,15 @@
+2008-08-19  Christopher Faylor  <me+cygwin@cgf.cx>
+
+       * fhandler.cc (fhandler_base::wait_overlapped): Always assume that
+       bytes will be non-NULL.  Distinguish input result from result derived
+       from WFMO and GetOverlappedResult or res can never be -1.  Only raise
+       SIGPIPE when writing.
+       * fhandler.h (fhandler_base::wait_overlapped): Pass first argument by
+       value.
+       * fhandler_fifo.cc (fhandler_fifo::wait): Pass in dummy byte count to
+       wait_overlapped.
+       * pipe.cc (DEFAULT_PIPEBUFSIZE): Define to 65536 explicitly.
+
 2008-08-19  Corinna Vinschen  <corinna@vinschen.de>
 
        * fhandler_disk_file.cc (fhandler_disk_file::mkdir): Drop fattr variable
index 3fdddd5..1db40ac 100644 (file)
@@ -1680,18 +1680,17 @@ fhandler_base::destroy_overlapped ()
 }
 
 int
-fhandler_base::wait_overlapped (boolres, bool writing, DWORD *bytes)
+fhandler_base::wait_overlapped (bool inres, bool writing, DWORD *bytes)
 {
-  if (bytes)
-    *bytes = (DWORD) -1;
+  int res;
+  *bytes = (DWORD) -1;
   DWORD err = GetLastError ();
-  if (!res && err != ERROR_IO_PENDING)
+  if (!inres && err != ERROR_IO_PENDING)
     {
-      if (err != ERROR_HANDLE_EOF)
+      if (err != ERROR_HANDLE_EOF && err != ERROR_BROKEN_PIPE)
        goto err;
       res = 1;
-      if (*bytes)
-       *bytes = 0;
+      *bytes = 0;
     }
   else
     {
@@ -1707,12 +1706,13 @@ fhandler_base::wait_overlapped (bool& res, bool writing, DWORD *bytes)
       if (&_my_tls == _main_tls)
        w4[n++] = signal_arrived;
       HANDLE h = writing ? get_output_handle () : get_handle ();
-      switch (WaitForMultipleObjects (n, w4, false, INFINITE))
+      DWORD res = WaitForMultipleObjects (n, w4, false, INFINITE);
+      ResetEvent (get_overlapped ()->hEvent);
+      switch (res)
        {
        case WAIT_OBJECT_0:
          debug_printf ("normal read");
-         if (!bytes ||
-             GetOverlappedResult (h, get_overlapped (), bytes, false))
+         if (GetOverlappedResult (h, get_overlapped (), bytes, false))
            res = 1;
          else
            {
@@ -1738,10 +1738,9 @@ fhandler_base::wait_overlapped (bool& res, bool writing, DWORD *bytes)
 err:
   __seterrno_from_win_error (err);
   res = -1;
-  if (err == ERROR_NO_DATA || err == ERROR_BROKEN_PIPE)
+  if (writing && (err == ERROR_NO_DATA || err == ERROR_BROKEN_PIPE))
     raise (SIGPIPE);
 out:
-  ResetEvent (get_overlapped ()->hEvent);
   return res;
 }
 
index 1430b28..05ed03c 100644 (file)
@@ -143,7 +143,7 @@ class fhandler_base
   void del_my_locks (bool);
 
   HANDLE read_state;
-  int wait_overlapped (bool&, bool, DWORD *) __attribute__ ((regparm (3)));
+  int wait_overlapped (bool, bool, DWORD *) __attribute__ ((regparm (3)));
   bool setup_overlapped () __attribute__ ((regparm (1)));
   void destroy_overlapped () __attribute__ ((regparm (1)));
 
index 0faaec9..a97d949 100644 (file)
@@ -132,9 +132,10 @@ fhandler_fifo::wait (bool iswrite)
     {
     case fifo_wait_for_client:
       bool res = ConnectNamedPipe (get_handle (), get_overlapped ());
+      DWORD dummy_bytes;
       if (res || GetLastError () == ERROR_PIPE_CONNECTED)
        return true;
-      return wait_overlapped (res, iswrite, NULL);
+      return wait_overlapped (res, iswrite, &dummy_bytes);
     default:
       break;
     }
index 2cad3fe..b9e8b17 100644 (file)
@@ -490,7 +490,7 @@ fhandler_pipe::fstatvfs (struct statvfs *sfs)
   return -1;
 }
 
-#define DEFAULT_PIPEBUFSIZE (16 * PIPE_BUF)
+#define DEFAULT_PIPEBUFSIZE 65536
 
 extern "C" int
 pipe (int filedes[2])