* cygthread.cc (cygthread::stub): Add better debug output.
(cygthread::cygthread): Ditto. (cygthread::terminate_thread): Ditto. Move inuse test earlier or suffer infinite loop. * pinfo.cc (_pinfo::dup_proc_pipe): Close handle if DuplicateHandle fails and process no longer exists. * spawn.cc (spawn_guts): Create process in suspended state if OS demands it. * wincap.cc: Add "start_proc_suspended" throughout. * wincap.h (wincaps): Ditto. (wincapc): Ditto.
This commit is contained in:
parent
432524c162
commit
57ba174fa0
|
@ -1,3 +1,17 @@
|
||||||
|
2004-12-27 Christopher Faylor <cgf@timesys.com>
|
||||||
|
|
||||||
|
* cygthread.cc (cygthread::stub): Add better debug output.
|
||||||
|
(cygthread::cygthread): Ditto.
|
||||||
|
(cygthread::terminate_thread): Ditto. Move inuse test earlier or
|
||||||
|
suffer infinite loop.
|
||||||
|
* pinfo.cc (_pinfo::dup_proc_pipe): Close handle if DuplicateHandle
|
||||||
|
fails and process no longer exists.
|
||||||
|
* spawn.cc (spawn_guts): Create process in suspended state if OS
|
||||||
|
demands it.
|
||||||
|
* wincap.cc: Add "start_proc_suspended" throughout.
|
||||||
|
* wincap.h (wincaps): Ditto.
|
||||||
|
(wincapc): Ditto.
|
||||||
|
|
||||||
2004-12-27 Christopher Faylor <cgf@timesys.com>
|
2004-12-27 Christopher Faylor <cgf@timesys.com>
|
||||||
|
|
||||||
* pinfo.cc (_pinfo::exit): Beef up debugging output.
|
* pinfo.cc (_pinfo::exit): Beef up debugging output.
|
||||||
|
|
|
@ -45,6 +45,7 @@ cygthread::stub (VOID *arg)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
info->stack_ptr = &arg;
|
info->stack_ptr = &arg;
|
||||||
|
debug_printf ("thread '%s', id %p, stack_ptr %p", info->name (), info->id, info->stack_ptr);
|
||||||
if (!info->ev)
|
if (!info->ev)
|
||||||
{
|
{
|
||||||
info->ev = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL);
|
info->ev = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL);
|
||||||
|
@ -166,7 +167,7 @@ cygthread::cygthread (LPTHREAD_START_ROUTINE start, LPVOID param,
|
||||||
while (!thread_sync)
|
while (!thread_sync)
|
||||||
low_priority_sleep (0);
|
low_priority_sleep (0);
|
||||||
SetEvent (thread_sync);
|
SetEvent (thread_sync);
|
||||||
thread_printf ("activated thread_sync %p", thread_sync);
|
thread_printf ("activated name '%s', thread_sync %p for thread %p", thread_sync, id);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -179,7 +180,7 @@ cygthread::cygthread (LPTHREAD_START_ROUTINE start, LPVOID param,
|
||||||
this, 0, &id);
|
this, 0, &id);
|
||||||
if (!h)
|
if (!h)
|
||||||
api_fatal ("thread handle not set - %p<%p>, %E", h, id);
|
api_fatal ("thread handle not set - %p<%p>, %E", h, id);
|
||||||
thread_printf ("created thread %p", h);
|
thread_printf ("created name '%s', thread %p, id %p", __name, h, id);
|
||||||
#ifdef DEBUGGING
|
#ifdef DEBUGGING
|
||||||
terminated = false;
|
terminated = false;
|
||||||
#endif
|
#endif
|
||||||
|
@ -268,18 +269,21 @@ cygthread::terminate_thread ()
|
||||||
ResetEvent (*this);
|
ResetEvent (*this);
|
||||||
ResetEvent (thread_sync);
|
ResetEvent (thread_sync);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
debug_printf ("thread '%s', id %p, inuse %d, stack_ptr %p", name (), id, inuse, stack_ptr);
|
||||||
|
while (inuse && !stack_ptr)
|
||||||
|
low_priority_sleep (0);
|
||||||
|
|
||||||
if (!inuse)
|
if (!inuse)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
(void) TerminateThread (h, 0);
|
(void) TerminateThread (h, 0);
|
||||||
(void) WaitForSingleObject (h, INFINITE);
|
(void) WaitForSingleObject (h, INFINITE);
|
||||||
if (!inuse)
|
if (!inuse || exiting)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CloseHandle (h);
|
CloseHandle (h);
|
||||||
|
|
||||||
while (inuse && !stack_ptr)
|
|
||||||
low_priority_sleep (0);
|
|
||||||
|
|
||||||
if (!inuse)
|
if (!inuse)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -128,7 +128,7 @@ _pinfo::exit (UINT n, bool norecord)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sigproc_printf ("Calling ExitProcess norecord %d, n %d, exitcode %d",
|
sigproc_printf ("Calling ExitProcess norecord %d, n %p, exitcode %p",
|
||||||
norecord, n, exitcode);
|
norecord, n, exitcode);
|
||||||
_my_tls.stacklock = 0;
|
_my_tls.stacklock = 0;
|
||||||
_my_tls.stackptr = _my_tls.stack;
|
_my_tls.stackptr = _my_tls.stack;
|
||||||
|
@ -768,7 +768,11 @@ _pinfo::dup_proc_pipe (HANDLE hProcess)
|
||||||
0, FALSE,
|
0, FALSE,
|
||||||
DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);
|
DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);
|
||||||
if (!res)
|
if (!res)
|
||||||
|
{
|
||||||
|
if (WaitForSingleObject (hProcess, 0) == WAIT_OBJECT_0)
|
||||||
|
CloseHandle (wr_proc_pipe);
|
||||||
sigproc_printf ("DuplicateHandle failed, pid %d, hProcess %p, %E", pid, hProcess);
|
sigproc_printf ("DuplicateHandle failed, pid %d, hProcess %p, %E", pid, hProcess);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wr_proc_pipe_owner = dwProcessId;
|
wr_proc_pipe_owner = dwProcessId;
|
||||||
|
|
|
@ -645,7 +645,8 @@ spawn_guts (const char * prog_arg, const char *const *argv,
|
||||||
after CreateProcess and before copying the datastructures to the child.
|
after CreateProcess and before copying the datastructures to the child.
|
||||||
So we have to start the child in suspend state, unfortunately, to avoid
|
So we have to start the child in suspend state, unfortunately, to avoid
|
||||||
a race condition. */
|
a race condition. */
|
||||||
if (mode != _P_OVERLAY || cygheap->fdtab.need_fixup_before ())
|
if (wincap.start_proc_suspended() || mode != _P_OVERLAY
|
||||||
|
|| cygheap->fdtab.need_fixup_before ())
|
||||||
flags |= CREATE_SUSPENDED;
|
flags |= CREATE_SUSPENDED;
|
||||||
|
|
||||||
const char *runpath = null_app_name ? NULL : (const char *) real_path;
|
const char *runpath = null_app_name ? NULL : (const char *) real_path;
|
||||||
|
|
|
@ -53,7 +53,8 @@ static NO_COPY wincaps wincap_unknown = {
|
||||||
has_terminal_services:false,
|
has_terminal_services:false,
|
||||||
has_switch_to_thread:false,
|
has_switch_to_thread:false,
|
||||||
cant_debug_dll_entry:false,
|
cant_debug_dll_entry:false,
|
||||||
has_ioctl_storage_get_media_types_ex:false
|
has_ioctl_storage_get_media_types_ex:false,
|
||||||
|
start_proc_suspended:true
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_95 = {
|
static NO_COPY wincaps wincap_95 = {
|
||||||
|
@ -98,7 +99,8 @@ static NO_COPY wincaps wincap_95 = {
|
||||||
has_terminal_services:false,
|
has_terminal_services:false,
|
||||||
has_switch_to_thread:false,
|
has_switch_to_thread:false,
|
||||||
cant_debug_dll_entry:true,
|
cant_debug_dll_entry:true,
|
||||||
has_ioctl_storage_get_media_types_ex:false
|
has_ioctl_storage_get_media_types_ex:false,
|
||||||
|
start_proc_suspended:true
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_95osr2 = {
|
static NO_COPY wincaps wincap_95osr2 = {
|
||||||
|
@ -143,7 +145,8 @@ static NO_COPY wincaps wincap_95osr2 = {
|
||||||
has_terminal_services:false,
|
has_terminal_services:false,
|
||||||
has_switch_to_thread:false,
|
has_switch_to_thread:false,
|
||||||
cant_debug_dll_entry:true,
|
cant_debug_dll_entry:true,
|
||||||
has_ioctl_storage_get_media_types_ex:false
|
has_ioctl_storage_get_media_types_ex:false,
|
||||||
|
start_proc_suspended:true
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_98 = {
|
static NO_COPY wincaps wincap_98 = {
|
||||||
|
@ -188,7 +191,8 @@ static NO_COPY wincaps wincap_98 = {
|
||||||
has_terminal_services:false,
|
has_terminal_services:false,
|
||||||
has_switch_to_thread:false,
|
has_switch_to_thread:false,
|
||||||
cant_debug_dll_entry:true,
|
cant_debug_dll_entry:true,
|
||||||
has_ioctl_storage_get_media_types_ex:false
|
has_ioctl_storage_get_media_types_ex:false,
|
||||||
|
start_proc_suspended:true
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_98se = {
|
static NO_COPY wincaps wincap_98se = {
|
||||||
|
@ -233,7 +237,8 @@ static NO_COPY wincaps wincap_98se = {
|
||||||
has_terminal_services:false,
|
has_terminal_services:false,
|
||||||
has_switch_to_thread:false,
|
has_switch_to_thread:false,
|
||||||
cant_debug_dll_entry:true,
|
cant_debug_dll_entry:true,
|
||||||
has_ioctl_storage_get_media_types_ex:false
|
has_ioctl_storage_get_media_types_ex:false,
|
||||||
|
start_proc_suspended:true
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_me = {
|
static NO_COPY wincaps wincap_me = {
|
||||||
|
@ -278,7 +283,8 @@ static NO_COPY wincaps wincap_me = {
|
||||||
has_terminal_services:false,
|
has_terminal_services:false,
|
||||||
has_switch_to_thread:false,
|
has_switch_to_thread:false,
|
||||||
cant_debug_dll_entry:true,
|
cant_debug_dll_entry:true,
|
||||||
has_ioctl_storage_get_media_types_ex:false
|
has_ioctl_storage_get_media_types_ex:false,
|
||||||
|
start_proc_suspended:true
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_nt3 = {
|
static NO_COPY wincaps wincap_nt3 = {
|
||||||
|
@ -323,7 +329,8 @@ static NO_COPY wincaps wincap_nt3 = {
|
||||||
has_terminal_services:false,
|
has_terminal_services:false,
|
||||||
has_switch_to_thread:false,
|
has_switch_to_thread:false,
|
||||||
cant_debug_dll_entry:false,
|
cant_debug_dll_entry:false,
|
||||||
has_ioctl_storage_get_media_types_ex:false
|
has_ioctl_storage_get_media_types_ex:false,
|
||||||
|
start_proc_suspended:false
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_nt4 = {
|
static NO_COPY wincaps wincap_nt4 = {
|
||||||
|
@ -368,7 +375,8 @@ static NO_COPY wincaps wincap_nt4 = {
|
||||||
has_terminal_services:false,
|
has_terminal_services:false,
|
||||||
has_switch_to_thread:true,
|
has_switch_to_thread:true,
|
||||||
cant_debug_dll_entry:false,
|
cant_debug_dll_entry:false,
|
||||||
has_ioctl_storage_get_media_types_ex:false
|
has_ioctl_storage_get_media_types_ex:false,
|
||||||
|
start_proc_suspended:false
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_nt4sp4 = {
|
static NO_COPY wincaps wincap_nt4sp4 = {
|
||||||
|
@ -413,7 +421,8 @@ static NO_COPY wincaps wincap_nt4sp4 = {
|
||||||
has_terminal_services:false,
|
has_terminal_services:false,
|
||||||
has_switch_to_thread:true,
|
has_switch_to_thread:true,
|
||||||
cant_debug_dll_entry:false,
|
cant_debug_dll_entry:false,
|
||||||
has_ioctl_storage_get_media_types_ex:false
|
has_ioctl_storage_get_media_types_ex:false,
|
||||||
|
start_proc_suspended:false
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_2000 = {
|
static NO_COPY wincaps wincap_2000 = {
|
||||||
|
@ -458,7 +467,8 @@ static NO_COPY wincaps wincap_2000 = {
|
||||||
has_terminal_services:true,
|
has_terminal_services:true,
|
||||||
has_switch_to_thread:true,
|
has_switch_to_thread:true,
|
||||||
cant_debug_dll_entry:false,
|
cant_debug_dll_entry:false,
|
||||||
has_ioctl_storage_get_media_types_ex:false
|
has_ioctl_storage_get_media_types_ex:false,
|
||||||
|
start_proc_suspended:false
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_xp = {
|
static NO_COPY wincaps wincap_xp = {
|
||||||
|
@ -503,7 +513,8 @@ static NO_COPY wincaps wincap_xp = {
|
||||||
has_terminal_services:true,
|
has_terminal_services:true,
|
||||||
has_switch_to_thread:true,
|
has_switch_to_thread:true,
|
||||||
cant_debug_dll_entry:false,
|
cant_debug_dll_entry:false,
|
||||||
has_ioctl_storage_get_media_types_ex:true
|
has_ioctl_storage_get_media_types_ex:true,
|
||||||
|
start_proc_suspended:false
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_2003 = {
|
static NO_COPY wincaps wincap_2003 = {
|
||||||
|
@ -548,7 +559,8 @@ static NO_COPY wincaps wincap_2003 = {
|
||||||
has_terminal_services:true,
|
has_terminal_services:true,
|
||||||
has_switch_to_thread:true,
|
has_switch_to_thread:true,
|
||||||
cant_debug_dll_entry:false,
|
cant_debug_dll_entry:false,
|
||||||
has_ioctl_storage_get_media_types_ex:true
|
has_ioctl_storage_get_media_types_ex:true,
|
||||||
|
start_proc_suspended:false
|
||||||
};
|
};
|
||||||
|
|
||||||
wincapc wincap;
|
wincapc wincap;
|
||||||
|
|
|
@ -55,6 +55,7 @@ struct wincaps
|
||||||
unsigned has_switch_to_thread : 1;
|
unsigned has_switch_to_thread : 1;
|
||||||
unsigned cant_debug_dll_entry : 1;
|
unsigned cant_debug_dll_entry : 1;
|
||||||
unsigned has_ioctl_storage_get_media_types_ex : 1;
|
unsigned has_ioctl_storage_get_media_types_ex : 1;
|
||||||
|
unsigned start_proc_suspended : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
class wincapc
|
class wincapc
|
||||||
|
@ -114,6 +115,7 @@ public:
|
||||||
bool IMPLEMENT (has_switch_to_thread)
|
bool IMPLEMENT (has_switch_to_thread)
|
||||||
bool IMPLEMENT (cant_debug_dll_entry)
|
bool IMPLEMENT (cant_debug_dll_entry)
|
||||||
bool IMPLEMENT (has_ioctl_storage_get_media_types_ex)
|
bool IMPLEMENT (has_ioctl_storage_get_media_types_ex)
|
||||||
|
bool IMPLEMENT (start_proc_suspended)
|
||||||
|
|
||||||
#undef IMPLEMENT
|
#undef IMPLEMENT
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue