/* Standard wait macros.
   Copyright (C) 2000-2021 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef COMMON_GDB_WAIT_H
#define COMMON_GDB_WAIT_H

#ifdef HAVE_SYS_WAIT_H
#include <sys/wait.h> /* POSIX */
#else
#ifdef HAVE_WAIT_H
#include <wait.h> /* legacy */
#endif
#endif

/* Define how to access the int that the wait system call stores.
   This has been compatible in all Unix systems since time immemorial,
   but various well-meaning people have defined various different
   words for the same old bits in the same old int (sometimes claimed
   to be a struct).  We just know it's an int and we use these macros
   to access the bits.  */

/* The following macros are defined equivalently to their definitions
   in POSIX.1.  We fail to define WNOHANG and WUNTRACED, which POSIX.1
   <sys/wait.h> defines, since our code does not use waitpid() (but
   NOTE exception for GNU/Linux below).  We also fail to declare
   wait() and waitpid().

   For MinGW, we use the fact that when a Windows program is
   terminated by a fatal exception, its exit code is the value of that
   exception, as defined by the various EXCEPTION_* symbols in the
   Windows API headers.  See also gdb_wait.c.  */

#ifndef	WIFEXITED
# ifdef __MINGW32__
#  define WIFEXITED(w)	(((w) & 0xC0000000) == 0)
# else
#  define WIFEXITED(w)	(((w)&0377) == 0)
# endif
#endif

#ifndef	WIFSIGNALED
# ifdef __MINGW32__
#  define WIFSIGNALED(w)	(((w) & 0xC0000000) == 0xC0000000)
# else
#  define WIFSIGNALED(w)	(((w)&0377) != 0177 && ((w)&~0377) == 0)
# endif
#endif

#ifndef	WIFSTOPPED
#ifdef IBM6000

/* Unfortunately, the above comment (about being compatible in all Unix
   systems) is not quite correct for AIX, sigh.  And AIX 3.2 can generate
   status words like 0x57c (sigtrap received after load), and gdb would
   choke on it.  */

#define WIFSTOPPED(w)	((w)&0x40)

#else
#define WIFSTOPPED(w)	(((w)&0377) == 0177)
#endif
#endif

#ifndef	WEXITSTATUS
# ifdef __MINGW32__
#  define WEXITSTATUS(w)	((w) & ~0xC0000000)
# else
#  define WEXITSTATUS(w)	(((w) >> 8) & 0377) /* same as WRETCODE */
# endif
#endif

#ifndef	WTERMSIG
# ifdef __MINGW32__
extern int windows_status_to_termsig (unsigned long);
#  define WTERMSIG(w)	windows_status_to_termsig (w)
# else
#  define WTERMSIG(w)	((w) & 0177)
# endif
#endif

#ifndef	WSTOPSIG
#define WSTOPSIG	WEXITSTATUS
#endif

/* These are not defined in POSIX, but are used by our programs.  */

#ifndef	WSETEXIT
# ifdef	W_EXITCODE
#define	WSETEXIT(w,status) ((w) = W_EXITCODE(status,0))
# else
#define WSETEXIT(w,status) ((w) = (0 | ((status) << 8)))
# endif
#endif

#ifndef W_STOPCODE
#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
#endif

#ifndef	WSETSTOP
#define	WSETSTOP(w,sig)    ((w) = W_STOPCODE(sig))
#endif

/* For native GNU/Linux we may use waitpid and the __WCLONE option.
  <GRIPE> It is of course dangerous not to use the REAL header file...
  </GRIPE>.  */

/* Bits in the third argument to `waitpid'.  */
#ifndef WNOHANG
#define	WNOHANG		1	/* Don't block waiting.  */
#endif

#ifndef WUNTRACED
#define	WUNTRACED	2	/* Report status of stopped children.  */
#endif

#ifndef __WCLONE
#define __WCLONE	0x80000000 /* Wait for cloned process.  */
#endif

#endif /* COMMON_GDB_WAIT_H */
