Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog13
-rw-r--r--winsup/cygwin/dcrt0.cc9
-rw-r--r--winsup/cygwin/external.cc86
-rw-r--r--winsup/cygwin/include/sys/cygwin.h6
-rw-r--r--winsup/cygwin/pinfo.cc6
-rw-r--r--winsup/cygwin/sigproc.cc5
-rw-r--r--winsup/cygwin/spawn.cc17
7 files changed, 74 insertions, 68 deletions
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 <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
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])
- continue;
- pinfo p (pids[i]);
- pid_t thispid;
-
- if (p)
- thispid = p->pid;
- else if (winpid)
- thispid = pids[i];
- else
+ DWORD thispid = pids[i++];
+ if (!thispid)
continue;
+ pinfo p (thispid);
- if (!pid || thispid == pid)
+ if (!p)
+ {
+ if (!winpid)
+ continue;
+ ep.pid = thispid;
+ ep.dwProcessId = cygwin_pid (thispid);
+ ep.process_state = PID_IN_USE;
+ ep.ctty = -1;
+ }
+ else if (p->pid)
{
- 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;
+ 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;