8199793: [Graal] runtime/CommandLine/PrintTouchedMethods.java crashes with assertion "reference count underflow for symbol"
Summary: Remove Symbol::set_permanent to avoid possible race conditions
Reviewed-by: coleenp, dholmes, thartmann
--- a/src/hotspot/share/oops/method.cpp Mon Mar 26 19:00:47 2018 -0400
+++ b/src/hotspot/share/oops/method.cpp Mon Mar 26 17:40:54 2018 -0700
@@ -2372,9 +2372,9 @@
ptr = ptr->_next;
}
TouchedMethodRecord* nptr = NEW_C_HEAP_OBJ(TouchedMethodRecord, mtTracing);
- my_class->set_permanent(); // prevent reclaimed by GC
- my_name->set_permanent();
- my_sig->set_permanent();
+ my_class->increment_refcount();
+ my_name->increment_refcount();
+ my_sig->increment_refcount();
nptr->_class_name = my_class;
nptr->_method_name = my_name;
nptr->_method_signature = my_sig;
--- a/src/hotspot/share/oops/symbol.hpp Mon Mar 26 19:00:47 2018 -0400
+++ b/src/hotspot/share/oops/symbol.hpp Mon Mar 26 17:40:54 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -165,13 +165,6 @@
int refcount() const { return _refcount; }
void increment_refcount();
void decrement_refcount();
- // Set _refcount non zero to avoid being reclaimed by GC.
- void set_permanent() {
- assert(LogTouchedMethods, "Should not be called with LogTouchedMethods off");
- if (_refcount != PERM_REFCOUNT) {
- _refcount = PERM_REFCOUNT;
- }
- }
bool is_permanent() {
return (_refcount == PERM_REFCOUNT);
}