mirror of
https://github.com/JetBrains/JetBrainsRuntime.git
synced 2025-12-06 09:29:38 +01:00
72 lines
3.1 KiB
Diff
72 lines
3.1 KiB
Diff
From 7ebad43ed45805b0a3736c510f708ff17697ba7e Mon Sep 17 00:00:00 2001
|
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
|
Date: Sun, 11 Oct 2020 10:43:28 +0200
|
|
Subject: [PATCH 13/34] Fix G1 nmethod registration
|
|
|
|
---
|
|
.../prims/jvmtiEnhancedRedefineClasses.cpp | 19 ++++++++++++++++---
|
|
.../prims/jvmtiEnhancedRedefineClasses.hpp | 3 ++-
|
|
2 files changed, 18 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
|
index b09ba554e07..718426f2819 100644
|
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
|
@@ -216,7 +216,14 @@ void VM_EnhancedRedefineClasses::mark_as_scavengable(nmethod* nm) {
|
|
}
|
|
}
|
|
|
|
-void VM_EnhancedRedefineClasses::mark_as_scavengable_g1(nmethod* nm) {
|
|
+void VM_EnhancedRedefineClasses::unregister_nmethod_g1(nmethod* nm) {
|
|
+ // It should work not only for G1 but also for another GCs, but this way is safer now
|
|
+ if (!nm->is_zombie() && !nm->is_unloaded()) {
|
|
+ Universe::heap()->unregister_nmethod(nm);
|
|
+ }
|
|
+}
|
|
+
|
|
+void VM_EnhancedRedefineClasses::register_nmethod_g1(nmethod* nm) {
|
|
// It should work not only for G1 but also for another GCs, but this way is safer now
|
|
if (!nm->is_zombie() && !nm->is_unloaded()) {
|
|
Universe::heap()->register_nmethod(nm);
|
|
@@ -521,8 +528,9 @@ void VM_EnhancedRedefineClasses::doit() {
|
|
// For now, mark all nmethod's as scavengable that are not scavengable already
|
|
if (ScavengeRootsInCode) {
|
|
if (UseG1GC) {
|
|
- // this should work also for other GCs
|
|
- CodeCache::nmethods_do(mark_as_scavengable_g1);
|
|
+ // G1 holds references to nmethods in regions based on oops values. Since oops in nmethod can be changed in ChangePointers* closures
|
|
+ // we unregister nmethods from G1 heap, then closures are processed (oops are changed) and finally we register nmethod to G1 again
|
|
+ CodeCache::nmethods_do(unregister_nmethod_g1);
|
|
} else {
|
|
CodeCache::nmethods_do(mark_as_scavengable);
|
|
}
|
|
@@ -545,6 +553,11 @@ void VM_EnhancedRedefineClasses::doit() {
|
|
|
|
Universe::root_oops_do(&oopClosureNoBarrier);
|
|
|
|
+ if (UseG1GC) {
|
|
+ // this should work also for other GCs
|
|
+ CodeCache::nmethods_do(register_nmethod_g1);
|
|
+ }
|
|
+
|
|
}
|
|
log_trace(redefine, class, obsolete, metadata)("After updating instances");
|
|
|
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
|
index 9755944d70b..4c0412d343d 100644
|
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
|
@@ -116,7 +116,8 @@ class VM_EnhancedRedefineClasses: public VM_GC_Operation {
|
|
|
|
void rollback();
|
|
static void mark_as_scavengable(nmethod* nm);
|
|
- static void mark_as_scavengable_g1(nmethod* nm);
|
|
+ static void unregister_nmethod_g1(nmethod* nm);
|
|
+ static void register_nmethod_g1(nmethod* nm);
|
|
static void unpatch_bytecode(Method* method);
|
|
static void fix_invoke_method(Method* method);
|
|
|
|
--
|
|
2.23.0
|
|
|