* child_info.h (child_info::sync): Pass pid and HANDLE rather than using pinfo.

(child_info::child_info): Accept an argument controlling whether to create
proc_subproc.
(child_info_spawn::child_info_spawn): Ditto.
* sigproc.cc (child_info::child_info): Ditto.
(child_info_spawn::child_info_spawn): Ditto.
(child_info::sync): Use passed in pid and HANDLE.
* fork.cc (fork_parent): Reflect additional arguments required for
child_info::sync.
* hookapi.cc (hook_or_detect_cygwin): Rename.  Change so that NULL 'fn'
argument just returns "true", indicating that program uses cygwin1.dll.
* spawn.cc (av::win16_exe): New element.
* spawn.cc (av::iscygwin): New element.
(av::fixup): New function.
(spawn_guts): Protect against SEGV.  Use fixup function to detect when it is
safe to wait for a spawned (as opposed to an execed) program.  Reflect changes
in child_info::sync arguments.
* external.cc (cygwin_internal): Reflect function renaming to
hook_or_detect_cygwin.
* cygheap.cc (cygheap_fixup_in_child): Close handle after debug fixup has been
done to prevent false positives in handle collision.
* exceptions.cc (try_to_debug): Notify debugger if already being debugged.
This commit is contained in:
Christopher Faylor
2005-07-17 00:51:03 +00:00
parent cd929277d6
commit e8454a3400
10 changed files with 195 additions and 136 deletions

View File

@@ -721,7 +721,7 @@ out:
/* Initialize some of the memory block passed to child processes
by fork/spawn/exec. */
child_info::child_info (unsigned in_cb, child_info_types chtype)
child_info::child_info (unsigned in_cb, child_info_types chtype, bool need_subproc_ready)
{
memset (this, 0, in_cb);
cb = in_cb;
@@ -730,7 +730,7 @@ child_info::child_info (unsigned in_cb, child_info_types chtype)
type = chtype;
fhandler_union_cb = sizeof (fhandler_union);
user_h = cygwin_user_h;
if (chtype != PROC_SPAWN)
if (need_subproc_ready)
subproc_ready = CreateEvent (&sec_all, FALSE, FALSE, NULL);
sigproc_printf ("subproc_ready %p", subproc_ready);
cygheap = ::cygheap;
@@ -753,12 +753,12 @@ child_info::~child_info ()
}
child_info_fork::child_info_fork () :
child_info (sizeof *this, _PROC_FORK)
child_info (sizeof *this, _PROC_FORK, true)
{
}
child_info_spawn::child_info_spawn (child_info_types chtype) :
child_info (sizeof *this, chtype)
child_info_spawn::child_info_spawn (child_info_types chtype, bool need_subproc_ready) :
child_info (sizeof *this, chtype, need_subproc_ready)
{
}
@@ -786,7 +786,7 @@ child_info::ready (bool execed)
}
bool
child_info::sync (pinfo& vchild, DWORD howlong)
child_info::sync (pid_t pid, HANDLE hProcess, DWORD howlong)
{
if (!subproc_ready)
{
@@ -796,14 +796,14 @@ child_info::sync (pinfo& vchild, DWORD howlong)
HANDLE w4[2];
w4[0] = subproc_ready;
w4[1] = vchild.hProcess;
w4[1] = hProcess;
bool res;
sigproc_printf ("waiting for subproc_ready(%p) and child process(%p)", w4[0], w4[1]);
switch (WaitForMultipleObjects (2, w4, FALSE, howlong))
{
case WAIT_OBJECT_0:
sigproc_printf ("got subproc_ready for pid %d", vchild->pid);
sigproc_printf ("got subproc_ready for pid %d", pid);
res = true;
break;
case WAIT_OBJECT_0 + 1:
@@ -813,7 +813,7 @@ child_info::sync (pinfo& vchild, DWORD howlong)
res = false;
break;
default:
system_printf ("wait failed, pid %d, %E", vchild->pid);
system_printf ("wait failed, pid %d, %E", pid);
res = false;
break;
}