changeset 8530:431b1333b1c1

8054386: Allow Java debugging when CDS is enabled Summary: Map archive RW when debugging is enabled Reviewed-by: sspitsyn, iklam, mseledtsov, dholmes
author cjplummer
date Fri, 05 Jun 2015 13:40:09 -0700
parents 23cc50392e04
children b28271afc952
files src/share/vm/memory/filemap.cpp
diffstat 1 files changed, 11 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/memory/filemap.cpp	Fri Jun 05 10:27:41 2015 +0200
+++ b/src/share/vm/memory/filemap.cpp	Fri Jun 05 13:40:09 2015 -0700
@@ -32,6 +32,7 @@
 #include "memory/metadataFactory.hpp"
 #include "memory/oopFactory.hpp"
 #include "oops/objArrayOop.hpp"
+#include "prims/jvmtiExport.hpp"
 #include "runtime/arguments.hpp"
 #include "runtime/java.hpp"
 #include "runtime/os.hpp"
@@ -568,10 +569,19 @@
   size_t alignment = os::vm_allocation_granularity();
   size_t size = align_size_up(used, alignment);
   char *requested_addr = si->_base;
+  bool read_only;
+
+  // If a tool agent is in use (debugging enabled), we must map the address space RW
+  if (JvmtiExport::can_modify_any_class() || JvmtiExport::can_walk_any_space()) {
+    read_only = false;
+  } else {
+    read_only = si->_read_only;
+  }
+
 
   // map the contents of the CDS archive in this memory
   char *base = os::map_memory(_fd, _full_path, si->_file_offset,
-                              requested_addr, size, si->_read_only,
+                              requested_addr, size, read_only,
                               si->_allow_exec);
   if (base == NULL || base != si->_base) {
     fail_continue("Unable to map %s shared space at required address.", shared_region_name[i]);
@@ -637,11 +647,6 @@
 bool FileMapInfo::initialize() {
   assert(UseSharedSpaces, "UseSharedSpaces expected.");
 
-  if (JvmtiExport::can_modify_any_class() || JvmtiExport::can_walk_any_space()) {
-    fail_continue("Tool agent requires sharing to be disabled.");
-    return false;
-  }
-
   if (!open_for_read()) {
     return false;
   }