mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 14:54:52 +02:00
8079205: CallSite dependency tracking is broken after sun.misc.Cleaner became automatically cleared
Reviewed-by: roland, psandoz, plevart, kbarrett, jrose
This commit is contained in:
parent
18f7135255
commit
e5a92a9fb9
18 changed files with 320 additions and 256 deletions
|
@ -2967,47 +2967,42 @@ int java_lang_invoke_MethodType::rtype_slot_count(oop mt) {
|
|||
|
||||
int java_lang_invoke_CallSite::_target_offset;
|
||||
int java_lang_invoke_CallSite::_context_offset;
|
||||
int java_lang_invoke_CallSite::_default_context_offset;
|
||||
|
||||
void java_lang_invoke_CallSite::compute_offsets() {
|
||||
Klass* k = SystemDictionary::CallSite_klass();
|
||||
if (k != NULL) {
|
||||
compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_lang_invoke_MethodHandle_signature());
|
||||
compute_offset(_context_offset, k, vmSymbols::context_name(), vmSymbols::sun_misc_Cleaner_signature());
|
||||
compute_offset(_default_context_offset, k,
|
||||
vmSymbols::DEFAULT_CONTEXT_name(), vmSymbols::sun_misc_Cleaner_signature(),
|
||||
/*is_static=*/true, /*allow_super=*/false);
|
||||
compute_offset(_context_offset, k, vmSymbols::context_name(),
|
||||
vmSymbols::java_lang_invoke_MethodHandleNatives_CallSiteContext_signature());
|
||||
}
|
||||
}
|
||||
|
||||
oop java_lang_invoke_CallSite::context_volatile(oop call_site) {
|
||||
oop java_lang_invoke_CallSite::context(oop call_site) {
|
||||
assert(java_lang_invoke_CallSite::is_instance(call_site), "");
|
||||
|
||||
oop dep_oop = call_site->obj_field_volatile(_context_offset);
|
||||
oop dep_oop = call_site->obj_field(_context_offset);
|
||||
return dep_oop;
|
||||
}
|
||||
|
||||
void java_lang_invoke_CallSite::set_context_volatile(oop call_site, oop context) {
|
||||
assert(java_lang_invoke_CallSite::is_instance(call_site), "");
|
||||
call_site->obj_field_put_volatile(_context_offset, context);
|
||||
}
|
||||
// Support for java_lang_invoke_MethodHandleNatives_CallSiteContext
|
||||
|
||||
bool java_lang_invoke_CallSite::set_context_cas(oop call_site, oop context, oop expected) {
|
||||
assert(java_lang_invoke_CallSite::is_instance(call_site), "");
|
||||
HeapWord* context_addr = call_site->obj_field_addr<HeapWord>(_context_offset);
|
||||
oop res = oopDesc::atomic_compare_exchange_oop(context, context_addr, expected, true);
|
||||
bool success = (res == expected);
|
||||
if (success) {
|
||||
update_barrier_set((void*)context_addr, context);
|
||||
int java_lang_invoke_MethodHandleNatives_CallSiteContext::_vmdependencies_offset;
|
||||
|
||||
void java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets() {
|
||||
Klass* k = SystemDictionary::Context_klass();
|
||||
if (k != NULL) {
|
||||
CALLSITECONTEXT_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
oop java_lang_invoke_CallSite::default_context() {
|
||||
InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::CallSite_klass());
|
||||
oop def_context_oop = ik->java_mirror()->obj_field(_default_context_offset);
|
||||
assert(!oopDesc::is_null(def_context_oop), "");
|
||||
return def_context_oop;
|
||||
nmethodBucket* java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(oop call_site) {
|
||||
assert(java_lang_invoke_MethodHandleNatives_CallSiteContext::is_instance(call_site), "");
|
||||
return (nmethodBucket*) (address) call_site->long_field(_vmdependencies_offset);
|
||||
}
|
||||
|
||||
void java_lang_invoke_MethodHandleNatives_CallSiteContext::set_vmdependencies(oop call_site, nmethodBucket* context) {
|
||||
assert(java_lang_invoke_MethodHandleNatives_CallSiteContext::is_instance(call_site), "");
|
||||
call_site->long_field_put(_vmdependencies_offset, (jlong) (address) context);
|
||||
}
|
||||
|
||||
// Support for java_security_AccessControlContext
|
||||
|
@ -3403,6 +3398,7 @@ void JavaClasses::compute_offsets() {
|
|||
java_lang_invoke_LambdaForm::compute_offsets();
|
||||
java_lang_invoke_MethodType::compute_offsets();
|
||||
java_lang_invoke_CallSite::compute_offsets();
|
||||
java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets();
|
||||
java_security_AccessControlContext::compute_offsets();
|
||||
// Initialize reflection classes. The layouts of these classes
|
||||
// changed with the new reflection implementation in JDK 1.4, and
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue