OSDN Git Service

* dcrt0.cc (dll_crt0_1): Move set_os_type.
authorcgf <cgf>
Sat, 26 Aug 2000 01:36:20 +0000 (01:36 +0000)
committercgf <cgf>
Sat, 26 Aug 2000 01:36:20 +0000 (01:36 +0000)
(_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.

winsup/cygwin/ChangeLog
winsup/cygwin/dcrt0.cc
winsup/cygwin/external.cc
winsup/cygwin/include/sys/cygwin.h
winsup/cygwin/pinfo.cc
winsup/cygwin/sigproc.cc
winsup/cygwin/spawn.cc

index 9f67f40..2e85093 100644 (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
index 95b0a57..4033936 100644 (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 (),
index 566293b..16303f5 100644 (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])
-       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;
     }
index 0cbd736..bf3fee9 100644 (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
 };
index 0d52ec9..08d34df 100644 (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;
index 1023101..0d573fc 100644 (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);
index c9a9c3a..63e9a7a 100644 (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;