1
1
/*
2
- * Copyright (c) 2003, 2019 , Oracle and/or its affiliates. All rights reserved.
2
+ * Copyright (c) 2003, 2020 , Oracle and/or its affiliates. All rights reserved.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* This code is free software; you can redistribute it and/or modify it
35
35
#include " compiler/compileBroker.hpp"
36
36
#include " interpreter/oopMapCache.hpp"
37
37
#include " interpreter/rewriter.hpp"
38
+ #include " jfr/jfrEvents.hpp"
38
39
#include " logging/logStream.hpp"
39
40
#include " memory/metadataFactory.hpp"
40
41
#include " memory/metaspaceShared.hpp"
51
52
#include " prims/jvmtiThreadState.inline.hpp"
52
53
#include " prims/resolvedMethodTable.hpp"
53
54
#include " prims/methodComparator.hpp"
55
+ #include " runtime/atomic.hpp"
54
56
#include " runtime/deoptimization.hpp"
55
57
#include " runtime/handles.inline.hpp"
56
58
#include " runtime/jniHandles.inline.hpp"
@@ -70,7 +72,7 @@ int VM_RedefineClasses::_deleted_methods_length = 0;
70
72
int VM_RedefineClasses::_added_methods_length = 0 ;
71
73
bool VM_RedefineClasses::_has_redefined_Object = false ;
72
74
bool VM_RedefineClasses::_has_null_class_loader = false ;
73
-
75
+ u8 VM_RedefineClasses::_id_counter = 0 ;
74
76
75
77
VM_RedefineClasses::VM_RedefineClasses (jint class_count,
76
78
const jvmtiClassDefinition *class_defs,
@@ -83,6 +85,7 @@ VM_RedefineClasses::VM_RedefineClasses(jint class_count,
83
85
_the_class = NULL ;
84
86
_has_redefined_Object = false ;
85
87
_has_null_class_loader = false ;
88
+ _id = next_id ();
86
89
}
87
90
88
91
static inline InstanceKlass* get_ik (jclass def) {
@@ -4294,6 +4297,15 @@ void VM_RedefineClasses::redefine_single_class(jclass the_jclass,
4294
4297
}
4295
4298
4296
4299
increment_class_counter ((InstanceKlass *)the_class, THREAD);
4300
+
4301
+ if (EventClassRedefinition::is_enabled ()) {
4302
+ EventClassRedefinition event;
4303
+ event.set_classModificationCount (java_lang_Class::classRedefinedCount (the_class->java_mirror ()));
4304
+ event.set_redefinedClass (the_class);
4305
+ event.set_redefinitionId (_id);
4306
+ event.commit ();
4307
+ }
4308
+
4297
4309
{
4298
4310
ResourceMark rm (THREAD);
4299
4311
// increment the classRedefinedCount field in the_class and in any
@@ -4307,6 +4319,7 @@ void VM_RedefineClasses::redefine_single_class(jclass the_jclass,
4307
4319
4308
4320
}
4309
4321
_timer_rsc_phase2.stop ();
4322
+
4310
4323
} // end redefine_single_class()
4311
4324
4312
4325
@@ -4393,6 +4406,16 @@ void VM_RedefineClasses::CheckClass::do_klass(Klass* k) {
4393
4406
}
4394
4407
}
4395
4408
4409
+ u8 VM_RedefineClasses::next_id () {
4410
+ while (true ) {
4411
+ u8 id = _id_counter;
4412
+ u8 next_id = id + 1 ;
4413
+ u8 result = Atomic::cmpxchg (&_id_counter, id, next_id);
4414
+ if (result == id) {
4415
+ return next_id;
4416
+ }
4417
+ }
4418
+ }
4396
4419
4397
4420
void VM_RedefineClasses::dump_methods () {
4398
4421
int j;
0 commit comments