Home | History | Annotate | Line # | Download | only in gdbsupport
      1 /* Standard wait macros.
      2    Copyright (C) 2000-2024 Free Software Foundation, Inc.
      3 
      4    This file is part of GDB.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     18 
     19 #ifndef GDBSUPPORT_GDB_WAIT_H
     20 #define GDBSUPPORT_GDB_WAIT_H
     21 
     22 #ifdef HAVE_SYS_WAIT_H
     23 #include <sys/wait.h>
     24 #else
     25 #ifdef HAVE_WAIT_H
     26 #include <wait.h>
     27 #endif
     28 #endif
     29 
     30 /* Define how to access the int that the wait system call stores.
     31    This has been compatible in all Unix systems since time immemorial,
     32    but various well-meaning people have defined various different
     33    words for the same old bits in the same old int (sometimes claimed
     34    to be a struct).  We just know it's an int and we use these macros
     35    to access the bits.  */
     36 
     37 /* The following macros are defined equivalently to their definitions
     38    in POSIX.1.  We fail to define WNOHANG and WUNTRACED, which POSIX.1
     39    <sys/wait.h> defines, since our code does not use waitpid() (but
     40    NOTE exception for GNU/Linux below).  We also fail to declare
     41    wait() and waitpid().
     42 
     43    For MinGW, we use the fact that when a Windows program is
     44    terminated by a fatal exception, its exit code is the value of that
     45    exception, as defined by the various EXCEPTION_* symbols in the
     46    Windows API headers.  See also gdb_wait.c.  */
     47 
     48 #ifndef	WIFEXITED
     49 # ifdef __MINGW32__
     50 #  define WIFEXITED(w)	(((w) & 0xC0000000) == 0)
     51 # else
     52 #  define WIFEXITED(w)	(((w)&0377) == 0)
     53 # endif
     54 #endif
     55 
     56 #ifndef	WIFSIGNALED
     57 # ifdef __MINGW32__
     58 #  define WIFSIGNALED(w)	(((w) & 0xC0000000) == 0xC0000000)
     59 # else
     60 #  define WIFSIGNALED(w)	(((w)&0377) != 0177 && ((w)&~0377) == 0)
     61 # endif
     62 #endif
     63 
     64 #ifndef	WIFSTOPPED
     65 #ifdef IBM6000
     66 
     67 /* Unfortunately, the above comment (about being compatible in all Unix
     68    systems) is not quite correct for AIX, sigh.  And AIX 3.2 can generate
     69    status words like 0x57c (sigtrap received after load), and gdb would
     70    choke on it.  */
     71 
     72 #define WIFSTOPPED(w)	((w)&0x40)
     73 
     74 #else
     75 #define WIFSTOPPED(w)	(((w)&0377) == 0177)
     76 #endif
     77 #endif
     78 
     79 #ifndef	WEXITSTATUS
     80 # ifdef __MINGW32__
     81 #  define WEXITSTATUS(w)	((w) & ~0xC0000000)
     82 # else
     83 #  define WEXITSTATUS(w)	(((w) >> 8) & 0377) /* same as WRETCODE */
     84 # endif
     85 #endif
     86 
     87 #ifndef	WTERMSIG
     88 # ifdef __MINGW32__
     89 extern int windows_status_to_termsig (unsigned long);
     90 #  define WTERMSIG(w)	windows_status_to_termsig (w)
     91 # else
     92 #  define WTERMSIG(w)	((w) & 0177)
     93 # endif
     94 #endif
     95 
     96 #ifndef	WSTOPSIG
     97 #define WSTOPSIG	WEXITSTATUS
     98 #endif
     99 
    100 /* These are not defined in POSIX, but are used by our programs.  */
    101 
    102 #ifndef W_EXITCODE
    103 #define W_EXITCODE(status, sig) ((status) << 8 | (sig))
    104 #endif
    105 
    106 #ifndef W_STOPCODE
    107 #define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
    108 #endif
    109 
    110 #ifndef	WSETSTOP
    111 #define	WSETSTOP(w,sig)    ((w) = W_STOPCODE(sig))
    112 #endif
    113 
    114 /* For native GNU/Linux we may use waitpid and the __WCLONE option.
    115   <GRIPE> It is of course dangerous not to use the REAL header file...
    116   </GRIPE>.  */
    117 
    118 /* Bits in the third argument to `waitpid'.  */
    119 #ifndef WNOHANG
    120 #define	WNOHANG		1	/* Don't block waiting.  */
    121 #endif
    122 
    123 #ifndef WUNTRACED
    124 #define	WUNTRACED	2	/* Report status of stopped children.  */
    125 #endif
    126 
    127 #ifndef __WCLONE
    128 #define __WCLONE	0x80000000 /* Wait for cloned process.  */
    129 #endif
    130 
    131 #endif /* GDBSUPPORT_GDB_WAIT_H */
    132