* exceptions.cc: (ctrl_c_handler): Do nothing while a Cygwin subprocess is
starting. * child_info.h (init_child_info): Remove pid argument from declaration. * cygheap.h (init_cygheap::pid): New element. * dcrt0.cc (dll_crt0_0): Eliminate handling of now-noexistent cygpid parameter in child_info struct. Set forkee to 'true' rather than cygpid since the pid value was never used. (dll_crt0_1): Ditto. (_dll_crt0): Ditto. * fork.cc (fork_child): Don't wait for sigthread. This is handled in the fork call now. (fork_parent): Remove obsolete pid argument from init_child_info call. Don't do anything special with cygpid when DEBUGGING. (fork): Delay all signals during fork. (fork_init): Don't do anything special when DEBUGGING. * pinfo.cc (set_myself): Remove pid parameter. Use new pid field in cygheap. (pinfo_init): Don't pass pid argument to set_myself. * sigproc.cc (sig_send): Wait for dwProcessId to be non-zero as well as sendsig. (init_child_info): Eliminate handling of pid. (wait_sig): Implement method to temporarily hold off sending signals. * sigproc.h (__SIGHOLD): New enum. (__SIGNOHOLD): Ditto. * spawn.cc (spawn_guts): Remove obsolete pid argument from init_child_info call.
This commit is contained in:
@@ -223,9 +223,9 @@ leave:
|
||||
unlike CreatePipe, which returns a bool for success or failure. */
|
||||
static int
|
||||
create_selectable_pipe (PHANDLE read_pipe_ptr,
|
||||
PHANDLE write_pipe_ptr,
|
||||
LPSECURITY_ATTRIBUTES sa_ptr,
|
||||
DWORD psize)
|
||||
PHANDLE write_pipe_ptr,
|
||||
LPSECURITY_ATTRIBUTES sa_ptr,
|
||||
DWORD psize)
|
||||
{
|
||||
/* Default to error. */
|
||||
*read_pipe_ptr = *write_pipe_ptr = INVALID_HANDLE_VALUE;
|
||||
@@ -251,62 +251,62 @@ create_selectable_pipe (PHANDLE read_pipe_ptr,
|
||||
debug_printf ("CreateNamedPipe: name %s, size %lu", pipename, psize);
|
||||
|
||||
/* Use CreateNamedPipe instead of CreatePipe, because the latter
|
||||
returns a write handle that does not permit FILE_READ_ATTRIBUTES
|
||||
access, on versions of win32 earlier than WinXP SP2.
|
||||
CreatePipe also stupidly creates a full duplex pipe, which is
|
||||
a waste, since only a single direction is actually used.
|
||||
It's important to only allow a single instance, to ensure that
|
||||
the pipe was not created earlier by some other process, even if
|
||||
the pid has been reused. We avoid FILE_FLAG_FIRST_PIPE_INSTANCE
|
||||
because that is only available for Win2k SP2 and WinXP. */
|
||||
returns a write handle that does not permit FILE_READ_ATTRIBUTES
|
||||
access, on versions of win32 earlier than WinXP SP2.
|
||||
CreatePipe also stupidly creates a full duplex pipe, which is
|
||||
a waste, since only a single direction is actually used.
|
||||
It's important to only allow a single instance, to ensure that
|
||||
the pipe was not created earlier by some other process, even if
|
||||
the pid has been reused. We avoid FILE_FLAG_FIRST_PIPE_INSTANCE
|
||||
because that is only available for Win2k SP2 and WinXP. */
|
||||
SetLastError (0);
|
||||
read_pipe = CreateNamedPipe (pipename,
|
||||
PIPE_ACCESS_INBOUND,
|
||||
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE,
|
||||
1, /* max instances */
|
||||
psize, /* output buffer size */
|
||||
psize, /* input buffer size */
|
||||
NMPWAIT_USE_DEFAULT_WAIT,
|
||||
sa_ptr);
|
||||
PIPE_ACCESS_INBOUND,
|
||||
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE,
|
||||
1, /* max instances */
|
||||
psize, /* output buffer size */
|
||||
psize, /* input buffer size */
|
||||
NMPWAIT_USE_DEFAULT_WAIT,
|
||||
sa_ptr);
|
||||
|
||||
DWORD err = GetLastError ();
|
||||
/* Win 95 seems to return NULL instead of INVALID_HANDLE_VALUE */
|
||||
if ((read_pipe || !err) && read_pipe != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
debug_printf ("pipe read handle %p", read_pipe);
|
||||
break;
|
||||
}
|
||||
{
|
||||
debug_printf ("pipe read handle %p", read_pipe);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (err)
|
||||
{
|
||||
case ERROR_PIPE_BUSY:
|
||||
/* The pipe is already open with compatible parameters.
|
||||
Pick a new name and retry. */
|
||||
debug_printf ("pipe busy, retrying");
|
||||
continue;
|
||||
case ERROR_ACCESS_DENIED:
|
||||
/* The pipe is already open with incompatible parameters.
|
||||
Pick a new name and retry. */
|
||||
debug_printf ("pipe access denied, retrying");
|
||||
continue;
|
||||
case ERROR_CALL_NOT_IMPLEMENTED:
|
||||
/* We are on an older Win9x platform without named pipes.
|
||||
Return an anonymous pipe as the best approximation. */
|
||||
debug_printf ("CreateNamedPipe not implemented, resorting to "
|
||||
"CreatePipe size %lu", psize);
|
||||
if (CreatePipe (read_pipe_ptr, write_pipe_ptr, sa_ptr, psize))
|
||||
{
|
||||
debug_printf ("pipe read handle %p", *read_pipe_ptr);
|
||||
debug_printf ("pipe write handle %p", *write_pipe_ptr);
|
||||
return NO_ERROR;
|
||||
}
|
||||
err = GetLastError ();
|
||||
debug_printf ("CreatePipe failed, %E");
|
||||
return err;
|
||||
default:
|
||||
debug_printf ("CreateNamedPipe failed, %E");
|
||||
return err;
|
||||
}
|
||||
{
|
||||
case ERROR_PIPE_BUSY:
|
||||
/* The pipe is already open with compatible parameters.
|
||||
Pick a new name and retry. */
|
||||
debug_printf ("pipe busy, retrying");
|
||||
continue;
|
||||
case ERROR_ACCESS_DENIED:
|
||||
/* The pipe is already open with incompatible parameters.
|
||||
Pick a new name and retry. */
|
||||
debug_printf ("pipe access denied, retrying");
|
||||
continue;
|
||||
case ERROR_CALL_NOT_IMPLEMENTED:
|
||||
/* We are on an older Win9x platform without named pipes.
|
||||
Return an anonymous pipe as the best approximation. */
|
||||
debug_printf ("CreateNamedPipe not implemented, resorting to "
|
||||
"CreatePipe size %lu", psize);
|
||||
if (CreatePipe (read_pipe_ptr, write_pipe_ptr, sa_ptr, psize))
|
||||
{
|
||||
debug_printf ("pipe read handle %p", *read_pipe_ptr);
|
||||
debug_printf ("pipe write handle %p", *write_pipe_ptr);
|
||||
return NO_ERROR;
|
||||
}
|
||||
err = GetLastError ();
|
||||
debug_printf ("CreatePipe failed, %E");
|
||||
return err;
|
||||
default:
|
||||
debug_printf ("CreateNamedPipe failed, %E");
|
||||
return err;
|
||||
}
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
@@ -315,12 +315,12 @@ create_selectable_pipe (PHANDLE read_pipe_ptr,
|
||||
/* Open the named pipe for writing.
|
||||
Be sure to permit FILE_READ_ATTRIBUTES access. */
|
||||
write_pipe = CreateFile (pipename,
|
||||
GENERIC_WRITE | FILE_READ_ATTRIBUTES,
|
||||
0, /* share mode */
|
||||
sa_ptr,
|
||||
OPEN_EXISTING,
|
||||
0, /* flags and attributes */
|
||||
0); /* handle to template file */
|
||||
GENERIC_WRITE | FILE_READ_ATTRIBUTES,
|
||||
0, /* share mode */
|
||||
sa_ptr,
|
||||
OPEN_EXISTING,
|
||||
0, /* flags and attributes */
|
||||
0); /* handle to template file */
|
||||
|
||||
if (write_pipe == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
|
Reference in New Issue
Block a user