OSDN Git Service

* exceptions.cc (set_process_mask): Set pending signals only when signals
authorcgf <cgf>
Wed, 3 Sep 2003 14:15:54 +0000 (14:15 +0000)
committercgf <cgf>
Wed, 3 Sep 2003 14:15:54 +0000 (14:15 +0000)
become unmasked.
* sigproc.cc (pending_signals): Flip back to a global.
(wait_sig): Don't set pending signals when there is an armed semaphore or
signal is blocked.
* shared.cc (shared_info::initialize): Add a username parameter for user-mode
mounts.  Reorganize to try to avoid startup race.
(memory_init): Move some stuff into shared_info::initialize.
* shared_info.h (shared_info::initialize): Change declaration.
(CURR_SHARED_MAGIC): Update.

winsup/cygwin/ChangeLog
winsup/cygwin/exceptions.cc
winsup/cygwin/shared.cc
winsup/cygwin/shared_info.h
winsup/cygwin/sigproc.cc

index a1e8650..8346715 100644 (file)
@@ -1,3 +1,17 @@
+2003-09-03  Christopher Faylor  <cgf@redhat.com>
+
+       * exceptions.cc (set_process_mask): Set pending signals only when
+       signals become unmasked.
+       * sigproc.cc (pending_signals): Flip back to a global.
+       (wait_sig): Don't set pending signals when there is an armed semaphore
+       or signal is blocked.
+
+       * shared.cc (shared_info::initialize): Add a username parameter for
+       user-mode mounts.  Reorganize to try to avoid startup race.
+       (memory_init): Move some stuff into shared_info::initialize.
+       * shared_info.h (shared_info::initialize): Change declaration.
+       (CURR_SHARED_MAGIC): Update.
+
 2003-09-01  Christopher Faylor  <cgf@redhat.com>
 
        * include/cygwin/version.h: Bump DLL minor number to 4.
index c63ed20..feffcd3 100644 (file)
@@ -963,11 +963,15 @@ set_process_mask (sigset_t newmask)
   sigproc_printf ("old mask = %x, new mask = %x", myself->getsigmask (), newmask);
   myself->setsigmask (newmask);        // Set a new mask
   mask_sync->release ();
-  if (oldmask != newmask)
-    sig_dispatch_pending ();
-  else
+  if (!(oldmask & ~newmask))
     sigproc_printf ("not calling sig_dispatch_pending.  sigtid %p current %p",
                    sigtid, GetCurrentThreadId ());
+  else
+    {
+      extern bool pending_signals;
+      pending_signals = true;
+      sig_dispatch_pending ();
+    }
   return;
 }
 
index 8bcf2b7..654ac57 100644 (file)
@@ -145,24 +145,40 @@ open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, shared_locat
 }
 
 void
-shared_info::initialize ()
+shared_info::initialize (const char *user_name)
 {
-  if (version)
+  DWORD sversion = (DWORD) InterlockedExchange ((LONG *) &version, SHARED_VERSION_MAGIC);
+  if (!sversion)
+    {
+      /* Initialize the queue of deleted files.  */
+      delqueue.init ();
+
+      /* Initialize tty table.  */
+      tty.init ();
+    }
+  else
     {
       if (version != SHARED_VERSION_MAGIC)
-       multiple_cygwin_problem ("shared", version, SHARED_VERSION_MAGIC);
-      else if (cb != SHARED_INFO_CB)
-       multiple_cygwin_problem ("shared size", cb, SHARED_INFO_CB);
-      return;
+       {
+         multiple_cygwin_problem ("shared", version, SHARED_VERSION_MAGIC);
+         InterlockedExchange ((LONG *) &version, sversion);
+       }
+      while (!cb)
+       low_priority_sleep (0); // Should be hit only very very rarely
+    }
+
+  /* Initialize the Cygwin heap, if necessary */
+  if (!cygheap)
+    {
+      cygheap_init ();
+      cygheap->user.set_name (user_name);
     }
 
-  /* Initialize the queue of deleted files.  */
-  delqueue.init ();
+  heap_init ();
+
+  if (!sversion)
+    cb = sizeof (*this);       // Do last, after all shared memory initializion
 
-  /* Initialize tty table.  */
-  tty.init ();
-  version = SHARED_VERSION_MAGIC;
-  cb = sizeof (*this);
   if (cb != SHARED_INFO_CB)
     system_printf ("size of shared memory region changed from %u to %u",
                   SHARED_INFO_CB, cb);
@@ -172,6 +188,13 @@ void __stdcall
 memory_init ()
 {
   getpagesize ();
+
+  char user_name[UNLEN + 1];
+  DWORD user_name_len = UNLEN + 1;
+
+  if (!GetUserName (user_name, &user_name_len))
+    strcpy (user_name, "unknown");
+
   /* Initialize general shared memory */
   HANDLE shared_h = cygheap ? cygheap->shared_h : NULL;
   cygwin_shared = (shared_info *) open_shared ("shared",
@@ -180,27 +203,12 @@ memory_init ()
                                               sizeof (*cygwin_shared),
                                               SH_CYGWIN_SHARED);
 
-  cygwin_shared->initialize ();
-
-  /* Allocate memory for the per-user mount table */
-  char user_name[UNLEN + 1];
-  DWORD user_name_len = UNLEN + 1;
-
-  if (!GetUserName (user_name, &user_name_len))
-    strcpy (user_name, "unknown");
-
-  /* Initialize the Cygwin heap, if necessary */
-  if (!cygheap)
-    {
-      cygheap_init ();
-      cygheap->user.set_name (user_name);
-    }
+  cygwin_shared->initialize (user_name);
 
   cygheap->shared_h = shared_h;
   ProtectHandleINH (cygheap->shared_h);
 
-  heap_init ();
-
+  /* Allocate memory for the per-user mount table */
   mount_table = (mount_info *) open_shared (user_name, MOUNT_VERSION,
                                            cygwin_mount_h, sizeof (mount_info),
                                            SH_MOUNT_TABLE);
index c1ab3d5..d73d0b0 100644 (file)
@@ -140,7 +140,7 @@ public:
 
 #define SHARED_INFO_CB 47112
 
-#define CURR_SHARED_MAGIC 0x359218a2U
+#define CURR_SHARED_MAGIC 0x53f1a7f4U
 
 /* NOTE: Do not make gratuitous changes to the names or organization of the
    below class.  The layout is checksummed to determine compatibility between
@@ -155,7 +155,7 @@ class shared_info
 
   tty_list tty;
   delqueue_list delqueue;
-  void initialize ();
+  void initialize (const char *);
   unsigned heap_chunk_size ();
 };
 
index b14fbac..383de21 100644 (file)
@@ -147,7 +147,7 @@ muto NO_COPY *sync_proc_subproc = NULL;     // Control access to subproc stuff
 
 DWORD NO_COPY sigtid = 0;              // ID of the signal thread
 
-static bool NO_COPY pending_signals = false;   // true if signals pending
+bool NO_COPY pending_signals = false;  // true if signals pending
 
 /* Functions
  */
@@ -1190,7 +1190,7 @@ wait_sig (VOID *self)
                {
                  /* If x > 0, we have to deal with a signal at some later point */
                  if (rc != RC_NOSYNC && x > 0)
-                   pending_signals = true;     // There should be an armed semaphore, in this case
+                   /*pending_signals = true*/; // There should be an armed semaphore, in this case
 
                  if (sig > 0 && sig != SIGKILL && sig != SIGSTOP &&
                      (sigismember (&myself->getsigmask (), sig) ||
@@ -1199,7 +1199,7 @@ wait_sig (VOID *self)
                    {
                      sigproc_printf ("signal %d blocked", sig);
                      x = InterlockedIncrement (myself->getsigtodo (sig));
-                     pending_signals = true;
+                     /* pending_signals = true;*/  // will be set by set_process_mask
                    }
                  else
                    {
@@ -1229,9 +1229,9 @@ wait_sig (VOID *self)
                          sigproc_printf ("Got signal %d", sig);
                          if (!sig_handle (sig))
                            {
+                             pending_signals = true;
                              saw_failed_interrupt = true;
                              x = InterlockedIncrement (myself->getsigtodo (sig));
-                             pending_signals = true;
                            }
                        }
                      if (rc == RC_NOSYNC && x > 0)