--- a/src/hotspot/share/code/compiledMethod.cpp Thu Nov 22 09:44:02 2018 +0100
+++ b/src/hotspot/share/code/compiledMethod.cpp Thu Nov 22 09:46:24 2018 +0100
@@ -44,11 +44,9 @@
bool caller_must_gc_arguments)
: CodeBlob(name, type, layout, frame_complete_offset, frame_size, oop_maps, caller_must_gc_arguments),
_mark_for_deoptimization_status(not_marked),
- _is_unloading_state(0),
_method(method)
{
init_defaults();
- clear_unloading_state();
}
CompiledMethod::CompiledMethod(Method* method, const char* name, CompilerType type, int size,
@@ -57,11 +55,9 @@
: CodeBlob(name, type, CodeBlobLayout((address) this, size, header_size, cb), cb,
frame_complete_offset, frame_size, oop_maps, caller_must_gc_arguments),
_mark_for_deoptimization_status(not_marked),
- _is_unloading_state(0),
_method(method)
{
init_defaults();
- clear_unloading_state();
}
void CompiledMethod::init_defaults() {
@@ -546,74 +542,6 @@
DEBUG_ONLY(metadata_do(check_class));
}
-// The _is_unloading_state encodes a tuple comprising the unloading cycle
-// and the result of IsUnloadingBehaviour::is_unloading() fpr that cycle.
-// This is the bit layout of the _is_unloading_state byte: 00000CCU
-// CC refers to the cycle, which has 2 bits, and U refers to the result of
-// IsUnloadingBehaviour::is_unloading() for that unloading cycle.
-
-class IsUnloadingState: public AllStatic {
- static const uint8_t _is_unloading_mask = 1;
- static const uint8_t _is_unloading_shift = 0;
- static const uint8_t _unloading_cycle_mask = 6;
- static const uint8_t _unloading_cycle_shift = 1;
-
- static uint8_t set_is_unloading(uint8_t state, bool value) {
- state &= ~_is_unloading_mask;
- if (value) {
- state |= 1 << _is_unloading_shift;
- }
- assert(is_unloading(state) == value, "unexpected unloading cycle overflow");
- return state;
- }
-
- static uint8_t set_unloading_cycle(uint8_t state, uint8_t value) {
- state &= ~_unloading_cycle_mask;
- state |= value << _unloading_cycle_shift;
- assert(unloading_cycle(state) == value, "unexpected unloading cycle overflow");
- return state;
- }
-
-public:
- static bool is_unloading(uint8_t state) { return (state & _is_unloading_mask) >> _is_unloading_shift == 1; }
- static uint8_t unloading_cycle(uint8_t state) { return (state & _unloading_cycle_mask) >> _unloading_cycle_shift; }
-
- static uint8_t create(bool is_unloading, uint8_t unloading_cycle) {
- uint8_t state = 0;
- state = set_is_unloading(state, is_unloading);
- state = set_unloading_cycle(state, unloading_cycle);
- return state;
- }
-};
-
-bool CompiledMethod::is_unloading() {
- uint8_t state = RawAccess<MO_RELAXED>::load(&_is_unloading_state);
- bool state_is_unloading = IsUnloadingState::is_unloading(state);
- uint8_t state_unloading_cycle = IsUnloadingState::unloading_cycle(state);
- if (state_is_unloading) {
- return true;
- }
- if (state_unloading_cycle == CodeCache::unloading_cycle()) {
- return false;
- }
-
- // The IsUnloadingBehaviour is responsible for checking if there are any dead
- // oops in the CompiledMethod, by calling oops_do on it.
- state_unloading_cycle = CodeCache::unloading_cycle();
- state_is_unloading = IsUnloadingBehaviour::current()->is_unloading(this);
-
- state = IsUnloadingState::create(state_is_unloading, state_unloading_cycle);
-
- RawAccess<MO_RELAXED>::store(&_is_unloading_state, state);
-
- return state_is_unloading;
-}
-
-void CompiledMethod::clear_unloading_state() {
- uint8_t state = IsUnloadingState::create(false, CodeCache::unloading_cycle());
- RawAccess<MO_RELAXED>::store(&_is_unloading_state, state);
-}
-
// Called to clean up after class unloading for live nmethods and from the sweeper
// for all methods.
void CompiledMethod::cleanup_inline_caches_impl(bool unloading_occurred, bool clean_all) {