OSDN Git Service

* shared.cc (open_shared): Revert to "old" method for shared memory location if
authorcgf <cgf>
Tue, 15 Oct 2002 17:04:19 +0000 (17:04 +0000)
committercgf <cgf>
Tue, 15 Oct 2002 17:04:19 +0000 (17:04 +0000)
!wincap.needs_memory_protection.
* wincap.cc: Implement needs_memory_protection throughout.
* wincap.h: Ditto.

winsup/cygwin/ChangeLog
winsup/cygwin/shared.cc
winsup/cygwin/wincap.cc
winsup/cygwin/wincap.h

index bd35ed1..0915a9e 100644 (file)
@@ -1,5 +1,12 @@
 2002-10-15  Christopher Faylor  <cgf@redhat.com>
 
+       * shared.cc (open_shared): Revert to "old" method for shared memory
+       location if !wincap.needs_memory_protection.
+       * wincap.cc: Implement needs_memory_protection throughout.
+       * wincap.h: Ditto.
+
+2002-10-15  Christopher Faylor  <cgf@redhat.com>
+
        * child_info.h (CURR_CHILD_INFO_MAGIC): Reset.
        (child_info_fork::mount_table): Remove.
        (child_info_fork::myself_addr): Remove.
index 113e7f5..59ca349 100644 (file)
@@ -70,20 +70,15 @@ open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, shared_locat
       + pround (sizeof (_pinfo))
   };
 
-  if (m == SH_CYGWIN_SHARED)
+  void *addr;
+  if (!wincap.needs_memory_protection ())
+    addr = NULL;
+  else
     {
-      for (int i = SH_CYGWIN_SHARED; i < SH_TOTAL_SIZE; i++)
-       if (!VirtualAlloc (offsets[i], offsets[i + 1] - offsets[i],
-                          MEM_RESERVE, PAGE_NOACCESS))
-         continue;  /* oh well */
-      if (!child_proc_info)
-       for (DWORD s = 0x950000; s <= 0xa40000; s += 0x1000)
-         VirtualAlloc ((void *) s, 4, MEM_RESERVE, PAGE_NOACCESS);
+      addr = offsets[m];
+      (void) VirtualFree (addr, 0, MEM_RELEASE);
     }
 
-  void *addr = offsets[m];
-  (void) VirtualFree (addr, 0, MEM_RELEASE);
-
   if (!size)
     return addr;
 
@@ -118,6 +113,22 @@ open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, shared_locat
   if (!shared)
     api_fatal ("MapViewOfFileEx '%s'(%p), %E.  Terminating.", name, shared_h);
 
+  if (m == SH_CYGWIN_SHARED)
+    {
+      for (int i = SH_CYGWIN_SHARED + 1; i < SH_TOTAL_SIZE; i++)
+       {
+         offsets[i] += (char *) shared - offsets[0];
+         if (!VirtualAlloc (offsets[i], offsets[i + 1] - offsets[i],
+                            MEM_RESERVE, PAGE_NOACCESS))
+           continue;  /* oh well */
+         offsets[0] = (char *) shared;
+       }
+
+      if (!child_proc_info && wincap.needs_memory_protection ())
+       for (DWORD s = 0x950000; s <= 0xa40000; s += 0x1000)
+         VirtualAlloc ((void *) s, 4, MEM_RESERVE, PAGE_NOACCESS);
+    }
+
   debug_printf ("name %s, shared %p (wanted %p), h %p", name, shared, addr, shared_h);
 
   /* FIXME: I couldn't find anywhere in the documentation a note about
index 01b6660..e70a362 100644 (file)
@@ -47,6 +47,7 @@ static NO_COPY wincaps wincap_unknown = {
   has_64bit_file_access:false,
   has_process_io_counters:false,
   supports_reading_modem_output_lines:false,
+  needs_memory_protection:false
 };
 
 static NO_COPY wincaps wincap_95 = {
@@ -85,6 +86,7 @@ static NO_COPY wincaps wincap_95 = {
   has_64bit_file_access:false,
   has_process_io_counters:false,
   supports_reading_modem_output_lines:false,
+  needs_memory_protection:false
 };
 
 static NO_COPY wincaps wincap_95osr2 = {
@@ -123,6 +125,7 @@ static NO_COPY wincaps wincap_95osr2 = {
   has_64bit_file_access:false,
   has_process_io_counters:false,
   supports_reading_modem_output_lines:false,
+  needs_memory_protection:false
 };
 
 static NO_COPY wincaps wincap_98 = {
@@ -161,6 +164,7 @@ static NO_COPY wincaps wincap_98 = {
   has_64bit_file_access:false,
   has_process_io_counters:false,
   supports_reading_modem_output_lines:false,
+  needs_memory_protection:false
 };
 
 static NO_COPY wincaps wincap_98se = {
@@ -199,6 +203,7 @@ static NO_COPY wincaps wincap_98se = {
   has_64bit_file_access:false,
   has_process_io_counters:false,
   supports_reading_modem_output_lines:false,
+  needs_memory_protection:false
 };
 
 static NO_COPY wincaps wincap_me = {
@@ -237,6 +242,7 @@ static NO_COPY wincaps wincap_me = {
   has_64bit_file_access:false,
   has_process_io_counters:false,
   supports_reading_modem_output_lines:false,
+  needs_memory_protection:false
 };
 
 static NO_COPY wincaps wincap_nt3 = {
@@ -275,6 +281,7 @@ static NO_COPY wincaps wincap_nt3 = {
   has_64bit_file_access:true,
   has_process_io_counters:false,
   supports_reading_modem_output_lines:true,
+  needs_memory_protection:true
 };
 
 static NO_COPY wincaps wincap_nt4 = {
@@ -313,6 +320,7 @@ static NO_COPY wincaps wincap_nt4 = {
   has_64bit_file_access:true,
   has_process_io_counters:false,
   supports_reading_modem_output_lines:true,
+  needs_memory_protection:true
 };
 
 static NO_COPY wincaps wincap_nt4sp4 = {
@@ -351,6 +359,7 @@ static NO_COPY wincaps wincap_nt4sp4 = {
   has_64bit_file_access:true,
   has_process_io_counters:false,
   supports_reading_modem_output_lines:true,
+  needs_memory_protection:true
 };
 
 static NO_COPY wincaps wincap_2000 = {
@@ -389,6 +398,7 @@ static NO_COPY wincaps wincap_2000 = {
   has_64bit_file_access:true,
   has_process_io_counters:true,
   supports_reading_modem_output_lines:true,
+  needs_memory_protection:true
 };
 
 static NO_COPY wincaps wincap_xp = {
@@ -427,6 +437,7 @@ static NO_COPY wincaps wincap_xp = {
   has_64bit_file_access:true,
   has_process_io_counters:true,
   supports_reading_modem_output_lines:true,
+  needs_memory_protection:true
 };
 
 wincapc wincap;
index c24b36a..a89f0a5 100644 (file)
@@ -48,6 +48,7 @@ struct wincaps
   unsigned has_64bit_file_access                       : 1;
   unsigned has_process_io_counters                      : 1;
   unsigned supports_reading_modem_output_lines          : 1;
+  unsigned needs_memory_protection                     : 1;
 };
 
 class wincapc
@@ -100,6 +101,7 @@ public:
   bool  IMPLEMENT (has_64bit_file_access)
   bool  IMPLEMENT (has_process_io_counters)
   bool  IMPLEMENT (supports_reading_modem_output_lines)
+  bool  IMPLEMENT (needs_memory_protection)
 
 #undef IMPLEMENT
 };