diff options
author | Christopher Faylor <me@cgf.cx> | 2002-10-15 17:04:20 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2002-10-15 17:04:20 +0000 |
commit | 6c6c3b90e9a8f0b0ffa9d6f1e064613afe43ccb6 (patch) | |
tree | 65694f4ae6e38b635fcfee55a0adf63fb45ed587 | |
parent | fdb28b5e5f813721add3ba2b261dfe78f3b895cb (diff) | |
download | newlib-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/ChangeLog | 7 | ||||
-rw-r--r-- | winsup/cygwin/shared.cc | 33 | ||||
-rw-r--r-- | winsup/cygwin/wincap.cc | 11 | ||||
-rw-r--r-- | winsup/cygwin/wincap.h | 2 |
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 }; |