https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=6706b19a974b10fc20234fc101ab7bf5f9563705

commit 6706b19a974b10fc20234fc101ab7bf5f9563705
Author: Corinna Vinschen <cori...@vinschen.de>
Date:   Fri Aug 24 20:57:47 2018 +0200

    Cygwin: Remove union wait
    
    This patch follows glibc.  Original commit message:
    
    Author:     Florian Weimer <fwei...@redhat.com>
    Date:   Thu, 14 Apr 2016 06:54:57 +0000
    
    Remove union wait [BZ #19613]
    
    The overloading approach in the W* macros was incompatible with
    integer expressions of a type different from int.  Applications
    using union wait and these macros will have to migrate to the
    POSIX-specified int status type.
    
    Signed-off-by: Corinna Vinschen <cori...@vinschen.de>

Diff:
---
 winsup/cygwin/include/cygwin/wait.h | 21 +++++------
 winsup/cygwin/include/sys/wait.h    | 74 ++-----------------------------------
 winsup/cygwin/release/2.11.0        |  4 ++
 winsup/doc/new-features.xml         |  6 +++
 4 files changed, 23 insertions(+), 82 deletions(-)

diff --git a/winsup/cygwin/include/cygwin/wait.h 
b/winsup/cygwin/include/cygwin/wait.h
index 8934314..7e40c8d 100644
--- a/winsup/cygwin/include/cygwin/wait.h
+++ b/winsup/cygwin/include/cygwin/wait.h
@@ -17,9 +17,6 @@ details. */
 #define WCONTINUED 8
 #define __W_CONTINUED  0xffff
 
-/* Will be redefined in sys/wait.h.  */
-#define __wait_status_to_int(w)  (w)
-
 /* A status is 16 bits, and looks like:
       <1 byte info> <1 byte code>
 
@@ -29,14 +26,14 @@ details. */
       <code> == 80, there was a core dump.
 */
 
-#define WIFEXITED(w)   ((__wait_status_to_int(w) & 0xff) == 0)
-#define WIFSIGNALED(w) ((__wait_status_to_int(w) & 0x7f) > 0 \
-                        && ((__wait_status_to_int(w) & 0x7f) < 0x7f))
-#define WIFSTOPPED(w)  ((__wait_status_to_int(w) & 0xff) == 0x7f)
-#define WIFCONTINUED(w)        ((__wait_status_to_int(w) & 0xffff) == 
__W_CONTINUED)
-#define WEXITSTATUS(w) ((__wait_status_to_int(w) >> 8) & 0xff)
-#define WTERMSIG(w)    (__wait_status_to_int(w) & 0x7f)
-#define WSTOPSIG       WEXITSTATUS
-#define WCOREDUMP(w)   (WIFSIGNALED(w) && (__wait_status_to_int(w) & 0x80))
+#define WIFEXITED(_w)          (((_w) & 0xff) == 0)
+#define WIFSIGNALED(_w)                (((_w) & 0x7f) > 0 \
+                                && (((_w) & 0x7f) < 0x7f))
+#define WIFSTOPPED(_w)         (((_w) & 0xff) == 0x7f)
+#define WIFCONTINUED(_w)       (((_w) & 0xffff) == __W_CONTINUED)
+#define WEXITSTATUS(_w)                (((_w) >> 8) & 0xff)
+#define WTERMSIG(_w)           ((_w) & 0x7f)
+#define WSTOPSIG               WEXITSTATUS
+#define WCOREDUMP(_w)          (WIFSIGNALED(_w) && ((_w) & 0x80))
 
 #endif /* _CYGWIN_WAIT_H */
diff --git a/winsup/cygwin/include/sys/wait.h b/winsup/cygwin/include/sys/wait.h
index dc89458..97e5d99 100644
--- a/winsup/cygwin/include/sys/wait.h
+++ b/winsup/cygwin/include/sys/wait.h
@@ -17,79 +17,13 @@ details. */
 extern "C" {
 #endif
 
-#ifdef __INSIDE_CYGWIN__
-
-typedef int *__wait_status_ptr_t;
-
-#elif defined(__cplusplus)
-
-/* Attribute __transparent_union__ is only supported for C.  */
-typedef void *__wait_status_ptr_t;
-
-#else /* !__INSIDE_CYGWIN__ && !__cplusplus */
-
-/* Allow `int' and `union wait' for the status.  */
-typedef union
-  {
-    int *__int_ptr;
-    union wait *__union_wait_ptr;
-  } __wait_status_ptr_t  __attribute__ ((__transparent_union__));
-
-#endif /* __INSIDE_CYGWIN__ */
-
-pid_t wait (__wait_status_ptr_t __status);
-pid_t waitpid (pid_t __pid, __wait_status_ptr_t __status, int __options);
-pid_t wait3 (__wait_status_ptr_t __status, int __options, struct rusage 
*__rusage);
-pid_t wait4 (pid_t __pid, __wait_status_ptr_t __status, int __options, struct 
rusage *__rusage);
-
-#ifdef _COMPILING_NEWLIB
-pid_t _wait (__wait_status_ptr_t __status);
-#endif
-
-union wait
-  {
-    int w_status;
-    struct
-      {
-       unsigned int __w_termsig:7; /* Terminating signal.  */
-       unsigned int __w_coredump:1; /* Set if dumped core.  */
-       unsigned int __w_retcode:8; /* Return code if exited normally.  */
-       unsigned int:16;
-      } __wait_terminated;
-    struct
-      {
-       unsigned int __w_stopval:8; /* W_STOPPED if stopped.  */
-       unsigned int __w_stopsig:8; /* Stopping signal.  */
-       unsigned int:16;
-      } __wait_stopped;
-  }; 
-#define        w_termsig       __wait_terminated.__w_termsig
-#define        w_coredump      __wait_terminated.__w_coredump
-#define        w_retcode       __wait_terminated.__w_retcode
-#define        w_stopsig       __wait_stopped.__w_stopsig
-#define        w_stopval       __wait_stopped.__w_stopval
+pid_t wait (int *__status);
+pid_t waitpid (pid_t __pid, int *__status, int __options);
+pid_t wait3 (int *__status, int __options, struct rusage *__rusage);
+pid_t wait4 (pid_t __pid, int *__status, int __options, struct rusage 
*__rusage);
 
 #ifdef __cplusplus
 }
 #endif
 
-/* Used in cygwin/wait.h, redefine to accept `int' and `union wait'.  */
-#undef __wait_status_to_int
-
-#ifdef __cplusplus
-
-extern "C++" {
-inline int __wait_status_to_int (int __status)
-  { return __status; }
-inline int __wait_status_to_int (const union wait & __status)
-  { return __status.w_status; }
-}
-
-#else /* !__cplusplus */
-
-#define __wait_status_to_int(__status)  (__extension__ \
-  (((union { __typeof(__status) __sin; int __sout; }) { .__sin = (__status) 
}).__sout))
-
-#endif /* __cplusplus */
-
 #endif /* _SYS_WAIT_H */
diff --git a/winsup/cygwin/release/2.11.0 b/winsup/cygwin/release/2.11.0
index 44206b4..6ffe3f6 100644
--- a/winsup/cygwin/release/2.11.0
+++ b/winsup/cygwin/release/2.11.0
@@ -22,6 +22,10 @@ What changed:
 
 - Support Unicode 10.
 
+- Following glibc, `union wait' has now been removed.  Applications
+  using union wait and these macros will have to migrate to the
+  POSIX-specified int status type.
+
 
 Bug Fixes
 ---------
diff --git a/winsup/doc/new-features.xml b/winsup/doc/new-features.xml
index 48a1765..e7dfca5 100644
--- a/winsup/doc/new-features.xml
+++ b/winsup/doc/new-features.xml
@@ -38,6 +38,12 @@ Rename the --file option of setfacl(1) to --set-file, as on 
Linux.
 Support Unicode 10.
 </para></listitem>
 
+<listitem><para>
+Following glibc, `union wait' has now been removed.  Applications
+using union wait and these macros will have to migrate to the
+POSIX-specified int status type.
+</para></listitem>
+
 </itemizedlist>
 
 </sect2>

Reply via email to