4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-02-22 00:38:06 +08:00

* child_info.h (child_status): New enum.

(child_info::flag): Rename from 'straced'.
(child_info::isstraced): New function.
(child_info::iscygwin): Ditto.
(child_info_fork::handle_fork): Reparmize.
(child_info_fork::handle_failure): Ditto.
(child_info_spawn::handle_spawn): New function.
* dcrt0.cc (get_cygwin_startup_info): Use isstraced method.
(child_info_spawn::handle_spawn): Define new function from code previously in
dll_crt0_0.
(dll_crt0_0): Move spawn stuff into handle_spawn.  Only call
init_console_handler for fork case.
* sigproc.cc (child_info::child_info): Set flag appropriately.
(child_info::proc_retry): Treat exit code as "funny" if it's a cygwin process.
* spawn.cc (spawn_guts): Remove commented out flag setting.
This commit is contained in:
Christopher Faylor 2006-03-20 18:01:17 +00:00
parent 4aedb28796
commit c1494e03a2
5 changed files with 70 additions and 32 deletions

View File

@ -1,3 +1,22 @@
2006-03-20 Christopher Faylor <cgf@timesys.com>
* child_info.h (child_status): New enum.
(child_info::flag): Rename from 'straced'.
(child_info::isstraced): New function.
(child_info::iscygwin): Ditto.
(child_info_fork::handle_fork): Reparmize.
(child_info_fork::handle_failure): Ditto.
(child_info_spawn::handle_spawn): New function.
* dcrt0.cc (get_cygwin_startup_info): Use isstraced method.
(child_info_spawn::handle_spawn): Define new function from code
previously in dll_crt0_0.
(dll_crt0_0): Move spawn stuff into handle_spawn. Only call
init_console_handler for fork case.
* sigproc.cc (child_info::child_info): Set flag appropriately.
(child_info::proc_retry): Treat exit code as "funny" if it's a cygwin
process.
* spawn.cc (spawn_guts): Remove commented out flag setting.
2006-03-19 Christopher Faylor <cgf@timesys.com> 2006-03-19 Christopher Faylor <cgf@timesys.com>
* pinfo.cc (commune_process): Fix randomly invalid pointer which caused * pinfo.cc (commune_process): Fix randomly invalid pointer which caused

View File

@ -18,6 +18,12 @@ enum child_info_types
_PROC_WHOOPS _PROC_WHOOPS
}; };
enum child_status
{
_CI_STRACED = 0x01,
_CI_ISCYGWIN = 0x0
};
#define OPROC_MAGIC_MASK 0xff00ff00 #define OPROC_MAGIC_MASK 0xff00ff00
#define OPROC_MAGIC_GENERIC 0xaf00f000 #define OPROC_MAGIC_GENERIC 0xaf00f000
@ -29,7 +35,8 @@ enum child_info_types
#define EXEC_MAGIC_SIZE sizeof(child_info) #define EXEC_MAGIC_SIZE sizeof(child_info)
#define CURR_CHILD_INFO_MAGIC 0x482b2eaU /* Change this value if you get a message indicating that it is out-of-sync. */
#define CURR_CHILD_INFO_MAGIC 0xa189e57U
/* NOTE: Do not make gratuitous changes to the names or organization of the /* NOTE: Do not make gratuitous changes to the names or organization of the
below class. The layout is checksummed to determine compatibility between below class. The layout is checksummed to determine compatibility between
@ -48,7 +55,7 @@ public:
init_cygheap *cygheap; init_cygheap *cygheap;
void *cygheap_max; void *cygheap_max;
DWORD cygheap_reserve_sz; DWORD cygheap_reserve_sz;
unsigned char straced; unsigned char flag;
unsigned fhandler_union_cb; unsigned fhandler_union_cb;
int retry; // number of times we've tried to start child process int retry; // number of times we've tried to start child process
DWORD exit_code; // process exit code DWORD exit_code; // process exit code
@ -58,7 +65,9 @@ public:
~child_info (); ~child_info ();
void ready (bool); void ready (bool);
bool sync (int, HANDLE&, DWORD) __attribute__ ((regparm (3))); bool sync (int, HANDLE&, DWORD) __attribute__ ((regparm (3)));
DWORD proc_retry (HANDLE); DWORD proc_retry (HANDLE) __attribute__ ((regparm (2)));
bool isstraced () const {return flag & _CI_STRACED;}
bool iscygwin () const {return flag & _CI_ISCYGWIN;}
}; };
class mount_info; class mount_info;
@ -73,8 +82,8 @@ public:
void *stacktop; // location of top of parent stack void *stacktop; // location of top of parent stack
void *stackbottom; // location of bottom of parent stack void *stackbottom; // location of bottom of parent stack
child_info_fork (); child_info_fork ();
void handle_fork (); void handle_fork () __attribute__ ((regparm (1)));;
bool handle_failure (DWORD); bool handle_failure (DWORD) __attribute__ ((regparm (2)));
}; };
class fhandler_base; class fhandler_base;
@ -115,6 +124,7 @@ public:
child_info_spawn (child_info_types, bool); child_info_spawn (child_info_types, bool);
void *operator new (size_t, void *p) __attribute__ ((nothrow)) {return p;} void *operator new (size_t, void *p) __attribute__ ((nothrow)) {return p;}
void set (child_info_types ci, bool b) { new (this) child_info_spawn (ci, b);} void set (child_info_types ci, bool b) { new (this) child_info_spawn (ci, b);}
void handle_spawn () __attribute__ ((regparm (1)));
}; };
void __stdcall init_child_info (DWORD, child_info *, HANDLE); void __stdcall init_child_info (DWORD, child_info *, HANDLE);

View File

@ -622,7 +622,7 @@ get_cygwin_startup_info ()
multiple_cygwin_problem ("proc size", res->cb, should_be_cb); multiple_cygwin_problem ("proc size", res->cb, should_be_cb);
else if (sizeof (fhandler_union) != res->fhandler_union_cb) else if (sizeof (fhandler_union) != res->fhandler_union_cb)
multiple_cygwin_problem ("fhandler size", res->fhandler_union_cb, sizeof (fhandler_union)); multiple_cygwin_problem ("fhandler size", res->fhandler_union_cb, sizeof (fhandler_union));
if (res->straced) if (res->isstraced ())
{ {
res->ready (false); res->ready (false);
for (unsigned i = 0; !being_debugged () && i < 10000; i++) for (unsigned i = 0; !being_debugged () && i < 10000; i++)
@ -669,6 +669,33 @@ child_info_fork::handle_fork ()
api_fatal ("recreate_mmaps_after_fork_failed"); api_fatal ("recreate_mmaps_after_fork_failed");
} }
void
child_info_spawn::handle_spawn ()
{
HANDLE h;
cygheap_fixup_in_child (true);
memory_init ();
if (!moreinfo->myself_pinfo ||
!DuplicateHandle (hMainProc, moreinfo->myself_pinfo, hMainProc, &h, 0,
FALSE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE))
h = NULL;
set_myself (h);
ready (true);
__argc = moreinfo->argc;
__argv = moreinfo->argv;
envp = moreinfo->envp;
envc = moreinfo->envc;
if (!dynamically_loaded)
cygheap->fdtab.fixup_after_exec ();
signal_fixup_after_exec ();
if (moreinfo->old_title)
{
old_title = strcpy (title_buf, moreinfo->old_title);
cfree (moreinfo->old_title);
}
init_console_handler (myself->ctty >= 0);
}
void __stdcall void __stdcall
dll_crt0_0 () dll_crt0_0 ()
{ {
@ -718,31 +745,9 @@ dll_crt0_0 ()
break; break;
case _PROC_SPAWN: case _PROC_SPAWN:
case _PROC_EXEC: case _PROC_EXEC:
HANDLE h; spawn_info->handle_spawn ();
cygheap_fixup_in_child (true);
memory_init ();
if (!spawn_info->moreinfo->myself_pinfo ||
!DuplicateHandle (hMainProc, spawn_info->moreinfo->myself_pinfo,
hMainProc, &h, 0, FALSE,
DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE))
h = NULL;
set_myself (h);
child_proc_info->ready (true);
__argc = spawn_info->moreinfo->argc;
__argv = spawn_info->moreinfo->argv;
envp = spawn_info->moreinfo->envp;
envc = spawn_info->moreinfo->envc;
if (!dynamically_loaded)
cygheap->fdtab.fixup_after_exec ();
signal_fixup_after_exec ();
if (spawn_info->moreinfo->old_title)
{
old_title = strcpy (title_buf, spawn_info->moreinfo->old_title);
cfree (spawn_info->moreinfo->old_title);
}
break; break;
} }
init_console_handler (myself->ctty >= 0);
} }
user_data->resourcelocks->Init (); user_data->resourcelocks->Init ();

View File

@ -785,7 +785,11 @@ child_info::child_info (unsigned in_cb, child_info_types chtype, bool need_subpr
sigproc_printf ("subproc_ready %p", subproc_ready); sigproc_printf ("subproc_ready %p", subproc_ready);
cygheap = ::cygheap; cygheap = ::cygheap;
cygheap_max = ::cygheap_max; cygheap_max = ::cygheap_max;
straced = strace.attached (); flag = 0;
if (strace.attached ())
flag |= _CI_STRACED;
if (need_subproc_ready)
flag |= _CI_ISCYGWIN;
retry = child_info::retry_count; retry = child_info::retry_count;
/* Create an inheritable handle to pass to the child process. This will /* Create an inheritable handle to pass to the child process. This will
allow the child to duplicate handles from the parent to itself. */ allow the child to duplicate handles from the parent to itself. */
@ -903,7 +907,7 @@ child_info::proc_retry (HANDLE h)
/* Count down non-recognized exit codes more quickly since they aren't /* Count down non-recognized exit codes more quickly since they aren't
due to known conditions. */ due to known conditions. */
default: default:
if ((exit_code & 0xc0000000) != 0xc0000000) if (!iscygwin () && (exit_code & 0xc0000000) != 0xc0000000)
break; break;
if ((retry -= 2) < 0) if ((retry -= 2) < 0)
retry = 0; retry = 0;

View File

@ -601,7 +601,7 @@ spawn_guts (const char * prog_arg, const char *const *argv,
int flags = GetPriorityClass (hMainProc); int flags = GetPriorityClass (hMainProc);
sigproc_printf ("priority class %d", flags); sigproc_printf ("priority class %d", flags);
flags |= /* CREATE_DEFAULT_ERROR_MODE | */CREATE_SEPARATE_WOW_VDM; flags |= CREATE_SEPARATE_WOW_VDM;
if (mode == _P_DETACH) if (mode == _P_DETACH)
flags |= DETACHED_PROCESS; flags |= DETACHED_PROCESS;