Add cygwin wrapper for ExitProcess and TerminateProcess.
This commit is contained in:
parent
960bdc0e74
commit
c8ee587a8e
|
@ -1,3 +1,16 @@
|
||||||
|
2009-10-05 Charles Wilson <cygwin@cwilson.fastmail.fm>
|
||||||
|
|
||||||
|
Add cygwin wrapper for ExitProcess and TerminateProcess.
|
||||||
|
* include/sys/cygwin.h: Declare new cygwin_getinfo_type
|
||||||
|
CW_EXIT_PROCESS.
|
||||||
|
* external.cc (exit_process): New function.
|
||||||
|
(cygwin_internal): Handle CW_EXIT_PROCESS.
|
||||||
|
* pinfo.h (pinfo::set_exit_code): New method.
|
||||||
|
* pinfo.cc (pinfo::set_exit_code): New, refactored from...
|
||||||
|
(pinfo::maybe_set_exit_code_from_windows): here. Call it.
|
||||||
|
* include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR
|
||||||
|
to 215 to reflect the above change.
|
||||||
|
|
||||||
2009-10-05 Charles Wilson <cygwin@cwilson.fastmail.fm>
|
2009-10-05 Charles Wilson <cygwin@cwilson.fastmail.fm>
|
||||||
|
|
||||||
* exceptions.cc: Move global variable sigExeced...
|
* exceptions.cc: Move global variable sigExeced...
|
||||||
|
|
|
@ -32,6 +32,7 @@ details. */
|
||||||
#include <iptypes.h>
|
#include <iptypes.h>
|
||||||
|
|
||||||
child_info *get_cygwin_startup_info ();
|
child_info *get_cygwin_startup_info ();
|
||||||
|
static void exit_process (UINT, bool) __attribute__((noreturn));
|
||||||
|
|
||||||
static winpids pids;
|
static winpids pids;
|
||||||
|
|
||||||
|
@ -161,6 +162,37 @@ sync_winenv ()
|
||||||
free (envblock);
|
free (envblock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Cygwin-specific wrapper for win32 ExitProcess and TerminateProcess.
|
||||||
|
* It ensures that the correct exit code, derived from the specified
|
||||||
|
* status value, will be made available to this process's parent (if
|
||||||
|
* that parent is also a cygwin process). If useTerminateProcess is
|
||||||
|
* true, then TerminateProcess(GetCurrentProcess(),...) will be used;
|
||||||
|
* otherwise, ExitProcess(...) is called.
|
||||||
|
*
|
||||||
|
* Used by startup code for cygwin processes which is linked statically
|
||||||
|
* into applications, and is not part of the cygwin DLL -- which is why
|
||||||
|
* this interface is exposed. "Normal" programs should use ANSI exit(),
|
||||||
|
* ANSI abort(), or POSIX _exit(), rather than this function -- because
|
||||||
|
* calling ExitProcess or TerminateProcess, even through this wrapper,
|
||||||
|
* skips much of the cygwin process cleanup code.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
exit_process (UINT status, bool useTerminateProcess)
|
||||||
|
{
|
||||||
|
pid_t pid = getpid ();
|
||||||
|
external_pinfo * ep = fillout_pinfo (pid, 1);
|
||||||
|
DWORD dwpid = ep ? ep->dwProcessId : pid;
|
||||||
|
pinfo p (pid, PID_MAP_RW);
|
||||||
|
if ((dwpid == GetCurrentProcessId()) && (p->pid == ep->pid))
|
||||||
|
p.set_exit_code ((DWORD)status);
|
||||||
|
if (useTerminateProcess)
|
||||||
|
TerminateProcess (GetCurrentProcess(), status);
|
||||||
|
/* avoid 'else' clause to silence warning */
|
||||||
|
ExitProcess (status);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
extern "C" unsigned long
|
extern "C" unsigned long
|
||||||
cygwin_internal (cygwin_getinfo_types t, ...)
|
cygwin_internal (cygwin_getinfo_types t, ...)
|
||||||
{
|
{
|
||||||
|
@ -375,6 +407,12 @@ cygwin_internal (cygwin_getinfo_types t, ...)
|
||||||
seterrno(file, line);
|
seterrno(file, line);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case CW_EXIT_PROCESS:
|
||||||
|
{
|
||||||
|
UINT status = va_arg (arg, UINT);
|
||||||
|
int useTerminateProcess = va_arg (arg, int);
|
||||||
|
exit_process (status, !!useTerminateProcess); /* no return */
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -368,12 +368,13 @@ details. */
|
||||||
212: Add and export libstdc++ malloc wrappers.
|
212: Add and export libstdc++ malloc wrappers.
|
||||||
213: Export canonicalize_file_name, eaccess, euidaccess.
|
213: Export canonicalize_file_name, eaccess, euidaccess.
|
||||||
214: Export execvpe, fexecve.
|
214: Export execvpe, fexecve.
|
||||||
|
215: CW_EXIT_PROCESS added.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
|
/* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
|
||||||
|
|
||||||
#define CYGWIN_VERSION_API_MAJOR 0
|
#define CYGWIN_VERSION_API_MAJOR 0
|
||||||
#define CYGWIN_VERSION_API_MINOR 214
|
#define CYGWIN_VERSION_API_MINOR 215
|
||||||
|
|
||||||
/* There is also a compatibity version number associated with the
|
/* There is also a compatibity version number associated with the
|
||||||
shared memory regions. It is incremented when incompatible
|
shared memory regions. It is incremented when incompatible
|
||||||
|
|
|
@ -142,7 +142,8 @@ typedef enum
|
||||||
CW_CYGTLS_PADSIZE,
|
CW_CYGTLS_PADSIZE,
|
||||||
CW_SET_DOS_FILE_WARNING,
|
CW_SET_DOS_FILE_WARNING,
|
||||||
CW_SET_PRIV_KEY,
|
CW_SET_PRIV_KEY,
|
||||||
CW_SETERRNO
|
CW_SETERRNO,
|
||||||
|
CW_EXIT_PROCESS
|
||||||
} cygwin_getinfo_types;
|
} cygwin_getinfo_types;
|
||||||
|
|
||||||
#define CW_NEXTPID 0x80000000 /* or with pid to get next one */
|
#define CW_NEXTPID 0x80000000 /* or with pid to get next one */
|
||||||
|
|
|
@ -135,6 +135,14 @@ status_exit (DWORD x)
|
||||||
}
|
}
|
||||||
|
|
||||||
# define self (*this)
|
# define self (*this)
|
||||||
|
void
|
||||||
|
pinfo::set_exit_code (DWORD x)
|
||||||
|
{
|
||||||
|
if (x >= 0xc0000000UL)
|
||||||
|
x = status_exit (x);
|
||||||
|
self->exitcode = EXITCODE_SET | (sigExeced ?: (x & 0xff) << 8);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
pinfo::maybe_set_exit_code_from_windows ()
|
pinfo::maybe_set_exit_code_from_windows ()
|
||||||
{
|
{
|
||||||
|
@ -147,9 +155,7 @@ pinfo::maybe_set_exit_code_from_windows ()
|
||||||
process hasn't quite exited
|
process hasn't quite exited
|
||||||
after closing pipe */
|
after closing pipe */
|
||||||
GetExitCodeProcess (hProcess, &x);
|
GetExitCodeProcess (hProcess, &x);
|
||||||
if (x >= 0xc0000000UL)
|
set_exit_code (x);
|
||||||
x = status_exit (x);
|
|
||||||
self->exitcode = EXITCODE_SET | (sigExeced ?: (x & 0xff) << 8);
|
|
||||||
}
|
}
|
||||||
sigproc_printf ("pid %d, exit value - old %p, windows %p, cygwin %p",
|
sigproc_printf ("pid %d, exit value - old %p, windows %p, cygwin %p",
|
||||||
self->pid, oexitcode, x, self->exitcode);
|
self->pid, oexitcode, x, self->exitcode);
|
||||||
|
|
|
@ -155,6 +155,7 @@ public:
|
||||||
}
|
}
|
||||||
void exit (DWORD n) __attribute__ ((noreturn, regparm(2)));
|
void exit (DWORD n) __attribute__ ((noreturn, regparm(2)));
|
||||||
void maybe_set_exit_code_from_windows () __attribute__ ((regparm(1)));
|
void maybe_set_exit_code_from_windows () __attribute__ ((regparm(1)));
|
||||||
|
void set_exit_code (DWORD n) __attribute__ ((regparm(2)));
|
||||||
_pinfo *operator -> () const {return procinfo;}
|
_pinfo *operator -> () const {return procinfo;}
|
||||||
int operator == (pinfo *x) const {return x->procinfo == procinfo;}
|
int operator == (pinfo *x) const {return x->procinfo == procinfo;}
|
||||||
int operator == (pinfo &x) const {return x.procinfo == procinfo;}
|
int operator == (pinfo &x) const {return x.procinfo == procinfo;}
|
||||||
|
|
Loading…
Reference in New Issue