aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2002-10-15 17:04:20 +0000
committerChristopher Faylor <me@cgf.cx>2002-10-15 17:04:20 +0000
commit6c6c3b90e9a8f0b0ffa9d6f1e064613afe43ccb6 (patch)
tree65694f4ae6e38b635fcfee55a0adf63fb45ed587
parentfdb28b5e5f813721add3ba2b261dfe78f3b895cb (diff)
downloadnewlib-6c6c3b90e9a8f0b0ffa9d6f1e064613afe43ccb6.zip
newlib-6c6c3b90e9a8f0b0ffa9d6f1e064613afe43ccb6.tar.gz
newlib-6c6c3b90e9a8f0b0ffa9d6f1e064613afe43ccb6.tar.bz2
* 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.
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/shared.cc33
-rw-r--r--winsup/cygwin/wincap.cc11
-rw-r--r--winsup/cygwin/wincap.h2
4 files changed, 42 insertions, 11 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index bd35ed1..0915a9e 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -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.
diff --git a/winsup/cygwin/shared.cc b/winsup/cygwin/shared.cc
index 113e7f5..59ca349 100644
--- a/winsup/cygwin/shared.cc
+++ b/winsup/cygwin/shared.cc
@@ -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
diff --git a/winsup/cygwin/wincap.cc b/winsup/cygwin/wincap.cc
index 01b6660..e70a362 100644
--- a/winsup/cygwin/wincap.cc
+++ b/winsup/cygwin/wincap.cc
@@ -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;
diff --git a/winsup/cygwin/wincap.h b/winsup/cygwin/wincap.h
index c24b36a..a89f0a5 100644
--- a/winsup/cygwin/wincap.h
+++ b/winsup/cygwin/wincap.h
@@ -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
};