* dcrt0.cc (dll_crt0_1): Move set_os_type.

(_dll_crt0): To here.
(cygwin_dll_init): And here.
* external.cc (fillout_pinfo): Use more foolproof method for scanning for pids.
* pinfo.cc (set_myself): Eliminate myself_identity.init.
* sigproc.cc (wait_sig): Do it here instead to reduce the amount of time where
there could potentially be two processes with the same pid.
* spawn.cc (spawn_guts): Eliminate duplicate initialization.
* include/sys/cygwin.h: Mark unused PID_* elements.
This commit is contained in:
Christopher Faylor 2000-08-26 01:36:20 +00:00
parent 14d3488d1f
commit 3c2c374555
7 changed files with 74 additions and 68 deletions

View File

@ -1,3 +1,16 @@
Fri Aug 25 21:25:32 2000 Christopher Faylor <cgf@cygnus.com>
* dcrt0.cc (dll_crt0_1): Move set_os_type.
(_dll_crt0): To here.
(cygwin_dll_init): And here.
* external.cc (fillout_pinfo): Use more foolproof method for scanning
for pids.
* pinfo.cc (set_myself): Eliminate myself_identity.init.
* sigproc.cc (wait_sig): Do it here instead to reduce the amount of
time where there could potentially be two processes with the same pid.
* spawn.cc (spawn_guts): Eliminate duplicate initialization.
* include/sys/cygwin.h: Mark unused PID_* elements.
Fri Aug 25 21:49:00 2000 Corinna Vinschen <corinna@vinschen.de>
* exec.cc (_execve): Change definition according to declaration in

View File

@ -646,9 +646,6 @@ dll_crt0_1 ()
user_data->threadinterface->Init0();
#endif
/* Set the os_being_run global. */
set_os_type ();
/* Initialize the host dependent constants object. */
host_dependent.init ();
@ -811,6 +808,9 @@ _dll_crt0 ()
init_exceptions (&cygwin_except_entry);
do_global_ctors (&__CTOR_LIST__, 1);
/* Set the os_being_run global. */
set_os_type ();
#ifdef DEBUGGING
char buf[80];
if (GetEnvironmentVariable ("CYGWIN_SLEEP", buf, sizeof (buf)))
@ -922,6 +922,9 @@ cygwin_dll_init ()
init_exceptions (&cygwin_except_entry);
do_global_ctors (&__CTOR_LIST__, 1);
/* Set the os_being_run global. */
set_os_type ();
user_data->heapbase = user_data->heapptr = user_data->heaptop = NULL;
if (!DuplicateHandle (GetCurrentProcess (), GetCurrentProcess (),

View File

@ -31,64 +31,54 @@ fillout_pinfo (pid_t pid, int winpid)
if (!pids.npids)
pids.init ();
static unsigned int i = 0;
if (!pid)
i = 0;
memset (&ep, 0, sizeof ep);
for (unsigned i = 0; i < pids.npids; i++)
for (; i < pids.npids; )
{
if (!pids[i])
DWORD thispid = pids[i++];
if (!thispid)
continue;
pinfo p (pids[i]);
pid_t thispid;
pinfo p (thispid);
if (p)
thispid = p->pid;
else if (winpid)
thispid = pids[i];
else
continue;
if (!pid || thispid == pid)
if (!p)
{
if (nextpid && pid)
{
pid = 0;
nextpid = 0;
continue;
}
if (!p)
{
ep.pid = pids[i];
ep.dwProcessId = cygwin_pid (pids[i]);
ep.process_state = PID_IN_USE;
ep.ctty = -1;
}
else if (p->pid && NOTSTATE(p, PID_CLEAR))
{
ep.ctty = tty_attached (p) ? p->ctty : -1;
ep.pid = p->pid;
ep.ppid = p->ppid;
ep.hProcess = p->hProcess;
ep.dwProcessId = p->dwProcessId;
ep.uid = p->uid;
ep.gid = p->gid;
ep.pgid = p->pgid;
ep.sid = p->sid;
ep.umask = p->umask;
ep.start_time = p->start_time;
ep.rusage_self = p->rusage_self;
ep.rusage_children = p->rusage_children;
strcpy (ep.progname, p->progname);
ep.strace_mask = 0;
ep.strace_file = 0;
ep.process_state = p->process_state;
}
break;
if (!winpid)
continue;
ep.pid = thispid;
ep.dwProcessId = cygwin_pid (thispid);
ep.process_state = PID_IN_USE;
ep.ctty = -1;
}
else if (p->pid)
{
ep.ctty = tty_attached (p) ? p->ctty : -1;
ep.pid = p->pid;
ep.ppid = p->ppid;
ep.hProcess = p->hProcess;
ep.dwProcessId = p->dwProcessId;
ep.uid = p->uid;
ep.gid = p->gid;
ep.pgid = p->pgid;
ep.sid = p->sid;
ep.umask = p->umask;
ep.start_time = p->start_time;
ep.rusage_self = p->rusage_self;
ep.rusage_children = p->rusage_children;
strcpy (ep.progname, p->progname);
ep.strace_mask = 0;
ep.strace_file = 0;
ep.process_state = p->process_state;
}
break;
}
if (!ep.pid)
{
i = 0;
pids.reset ();
return 0;
}

View File

@ -81,14 +81,14 @@ enum
PID_CYGPARENT = 0x0080, // Set if parent was a cygwin app.
PID_SPLIT_HEAP = 0x0100, // Set if the heap has been split,
// which means we can't fork again.
PID_CLEAR = 0x0200, // Flag that pid should be cleared from parent's
PID_UNUSED = 0x0200, // Flag that pid should be cleared from parent's
// wait list
PID_SOCKETS_USED = 0x0400, // Set if process uses Winsock.
PID_UNUSED1 = 0x0400, // Set if process uses Winsock.
PID_INITIALIZING = 0x0800, // Set until ready to receive signals.
PID_USETTY = 0x1000, // Setting this enables or disables cygwin's
// tty support. This is inherited by
// all execed or forked processes.
PID_REPARENT = 0x2000, // child has execed
PID_UNUSED2 = 0x2000, // child has execed
PID_EXECED = 0x4000, // redirect to original pid info block
PID_NOREDIR = 0x8000 // don't redirect if execed
};

View File

@ -24,7 +24,6 @@ details. */
static char NO_COPY pinfo_dummy[sizeof(pinfo)] = {0};
pinfo NO_COPY myself ((_pinfo *)&pinfo_dummy); // Avoid myself != NULL checks
static pinfo NO_COPY myself_identity ((_pinfo *)&pinfo_dummy);
/* Initialize the process table.
This is done once when the dll is first loaded. */
@ -39,9 +38,6 @@ set_myself (pid_t pid, HANDLE h)
myself->dwProcessId = winpid;
myself->process_state |= PID_IN_USE;
myself->start_time = time (NULL); /* Register our starting time. */
pid_t myself_cyg_pid = cygwin_pid (myself->dwProcessId);
if (pid != myself_cyg_pid && parent_alive)
myself_identity.init (myself_cyg_pid, PID_EXECED);
char buf[30];
__small_sprintf (buf, "cYg%8x %x", _STRACE_INTERFACE_ACTIVATE_ADDR,
@ -95,7 +91,7 @@ pinfo_init (LPBYTE info)
{
/* Invent our own pid. */
set_myself (1, NULL);
set_myself (1);
myself->ppid = 1;
myself->pgid = myself->sid = myself->pid;
myself->ctty = -1;

View File

@ -1202,6 +1202,11 @@ wait_sig (VOID *)
if (!SetEvent (child_proc_info->subproc_ready))
system_printf ("SetEvent (subproc_ready) failed, %E");
ForceCloseHandle (child_proc_info->subproc_ready);
/* Initialize an "indirect" pid block so that if someone looks up this
process via its Windows PID it will be redirected to the appropriate
Cygwin PID shared memory block. */
static pinfo NO_COPY myself_identity;
myself_identity.init (cygwin_pid (myself->dwProcessId), PID_EXECED);
}
SetEvent (wait_sig_inited);

View File

@ -655,14 +655,14 @@ skip_arg_parsing:
proc_terminate ();
hExeced = pi.hProcess;
/* Set up child's signal handlers */
/* CGF FIXME - consolidate with signal stuff below */
for (i = 0; i < NSIG; i++)
{
myself->getsig(i).sa_mask = 0;
if (myself->getsig(i).sa_handler != SIG_IGN || (mode != _P_OVERLAY))
myself->getsig(i).sa_handler = SIG_DFL;
}
/* Set up child's signal handlers */
/* CGF FIXME - consolidate with signal stuff below */
for (i = 0; i < NSIG; i++)
{
myself->getsig(i).sa_mask = 0;
if (myself->getsig(i).sa_handler != SIG_IGN || (mode != _P_OVERLAY))
myself->getsig(i).sa_handler = SIG_DFL;
}
}
else
{
@ -696,7 +696,6 @@ skip_arg_parsing:
child->rootlen = myself->rootlen;
child->dwProcessId = pi.dwProcessId;
child->hProcess = pi.hProcess;
child->process_state |= PID_INITIALIZING;
for (i = 0; i < NSIG; i++)
{
child->getsig(i).sa_mask = 0;