Discussion:
[newlib-cygwin] Cygwin: Remove union wait
Corinna Vinschen
2018-08-24 18:57:58 UTC
Permalink
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=6706b19a974b10fc20234fc101ab7bf5f9563705

commit 6706b19a974b10fc20234fc101ab7bf5f9563705
Author: Corinna Vinschen <***@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 <***@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 <***@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>

Loading...