diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 9f67f40d9..2e850931c 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,16 @@ +Fri Aug 25 21:25:32 2000 Christopher Faylor + + * 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 * exec.cc (_execve): Change definition according to declaration in diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 95b0a5720..40339366c 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -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 (), diff --git a/winsup/cygwin/external.cc b/winsup/cygwin/external.cc index 566293b63..16303f56e 100644 --- a/winsup/cygwin/external.cc +++ b/winsup/cygwin/external.cc @@ -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; } diff --git a/winsup/cygwin/include/sys/cygwin.h b/winsup/cygwin/include/sys/cygwin.h index 0cbd73686..bf3fee92c 100644 --- a/winsup/cygwin/include/sys/cygwin.h +++ b/winsup/cygwin/include/sys/cygwin.h @@ -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 }; diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index 0d52ec9f9..08d34dfb2 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -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; diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 102310175..0d573fc98 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -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); diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index c9a9c3a11..63e9a7a93 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -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;