diff --git a/src/Microsoft.Android.Sdk.ILLink/PreserveLists/Java.Interop.xml b/src/Microsoft.Android.Sdk.ILLink/PreserveLists/Java.Interop.xml index bfb2cfa1802..7ee32570100 100644 --- a/src/Microsoft.Android.Sdk.ILLink/PreserveLists/Java.Interop.xml +++ b/src/Microsoft.Android.Sdk.ILLink/PreserveLists/Java.Interop.xml @@ -5,13 +5,11 @@ - - diff --git a/src/Microsoft.Android.Sdk.ILLink/PreserveLists/Mono.Android.xml b/src/Microsoft.Android.Sdk.ILLink/PreserveLists/Mono.Android.xml index 8347a1dda49..fa71749e460 100644 --- a/src/Microsoft.Android.Sdk.ILLink/PreserveLists/Mono.Android.xml +++ b/src/Microsoft.Android.Sdk.ILLink/PreserveLists/Mono.Android.xml @@ -39,14 +39,12 @@ - - diff --git a/src/Mono.Android/Java.Lang/Object.cs b/src/Mono.Android/Java.Lang/Object.cs index d03b1fb9a4e..9df5b5bbee9 100644 --- a/src/Mono.Android/Java.Lang/Object.cs +++ b/src/Mono.Android/Java.Lang/Object.cs @@ -21,7 +21,6 @@ public partial class Object : IDisposable, IJavaObject, IJavaObjectEx { [NonSerialized] IntPtr key_handle; #pragma warning disable CS0649, CS0169, CS0414 // Suppress fields are never used warnings, these fields are used directly by monodroid-glue.cc - [NonSerialized] IntPtr weak_handle; [NonSerialized] int refs_added; #pragma warning restore CS0649, CS0169, CS0414 [NonSerialized] JObjectRefType handle_type; @@ -117,9 +116,6 @@ public virtual JniPeerMembers JniPeerMembers { [EditorBrowsable (EditorBrowsableState.Never)] public IntPtr Handle { get { - if (weak_handle != IntPtr.Zero) - Logger.Log (LogLevel.Warn, "Mono.Android.dll", "Accessing object which is out for collection via original handle"); - return handle; } } diff --git a/src/Mono.Android/Java.Lang/Throwable.cs b/src/Mono.Android/Java.Lang/Throwable.cs index ae668e24c27..498335e5d8e 100644 --- a/src/Mono.Android/Java.Lang/Throwable.cs +++ b/src/Mono.Android/Java.Lang/Throwable.cs @@ -21,7 +21,6 @@ public partial class Throwable : global::System.Exception, IJavaObject, IDisposa IntPtr key_handle; JObjectRefType handle_type; #pragma warning disable CS0649, CS0169, CS0414 // Suppress fields are never used warnings, these fields are used directly by monodroid-glue.cc - IntPtr weak_handle; int refs_added; #pragma warning restore CS0649, CS0169, CS0414 diff --git a/src/native/monodroid/monodroid-glue.cc b/src/native/monodroid/monodroid-glue.cc index 88ff6ada6ba..d5d1b67d00b 100644 --- a/src/native/monodroid/monodroid-glue.cc +++ b/src/native/monodroid/monodroid-glue.cc @@ -781,17 +781,15 @@ MonodroidRuntime::lookup_bridge_info (MonoClass *klass, const OSBridge::MonoJava info->handle = mono_class_get_field_from_name (info->klass, const_cast ("handle")); info->handle_type = mono_class_get_field_from_name (info->klass, const_cast ("handle_type")); info->refs_added = mono_class_get_field_from_name (info->klass, const_cast ("refs_added")); - info->weak_handle = mono_class_get_field_from_name (info->klass, const_cast ("weak_handle")); - if (info->klass == nullptr || info->handle == nullptr || info->handle_type == nullptr || info->refs_added == nullptr || info->weak_handle == nullptr) { + if (info->klass == nullptr || info->handle == nullptr || info->handle_type == nullptr || info->refs_added == nullptr) { Helpers::abort_application ( Util::monodroid_strdup_printf ( - "The type `%s.%s` is missing required instance fields! handle=%p handle_type=%p refs_added=%p weak_handle=%p", + "The type `%s.%s` is missing required instance fields! handle=%p handle_type=%p refs_added=%p", type->_namespace, type->_typename, info->handle, info->handle_type, - info->refs_added, - info->weak_handle + info->refs_added ) ); } diff --git a/src/native/monodroid/osbridge.cc b/src/native/monodroid/osbridge.cc index e4c268ba63b..0bbd1e4b4df 100644 --- a/src/native/monodroid/osbridge.cc +++ b/src/native/monodroid/osbridge.cc @@ -47,7 +47,6 @@ OSBridge::MonoJavaGCBridgeInfo OSBridge::empty_bridge_info = { nullptr, nullptr, nullptr, - nullptr, nullptr }; @@ -81,7 +80,6 @@ OSBridge::clear_mono_java_gc_bridge_info () info->handle = nullptr; info->handle_type = nullptr; info->refs_added = nullptr; - info->weak_handle = nullptr; } } @@ -443,67 +441,6 @@ OSBridge::monodroid_disable_gc_hooks () gc_disabled = 1; } -mono_bool -OSBridge::take_global_ref_2_1_compat (JNIEnv *env, MonoObject *obj) -{ - jobject handle, weak; - int type = JNIGlobalRefType; - - MonoJavaGCBridgeInfo *bridge_info = get_gc_bridge_info_for_object (obj); - if (bridge_info == nullptr) - return 0; - - mono_field_get_value (obj, bridge_info->weak_handle, &weak); - handle = env->CallObjectMethod (weak, weakrefGet); - if (gref_log) { - fprintf (gref_log, "*try_take_global_2_1 obj=%p -> wref=%p handle=%p\n", obj, weak, handle); - fflush (gref_log); - } - if (handle) { - void* h = env->NewGlobalRef (handle); - env->DeleteLocalRef (handle); - handle = reinterpret_cast (h); - _monodroid_gref_log_new (weak, get_object_ref_type (env, weak), - handle, get_object_ref_type (env, handle), "finalizer", gettid (), __PRETTY_FUNCTION__, 0); - } - _monodroid_weak_gref_delete (weak, get_object_ref_type (env, weak), "finalizer", gettid(), __PRETTY_FUNCTION__, 0); - env->DeleteGlobalRef (weak); - weak = nullptr; - mono_field_set_value (obj, bridge_info->weak_handle, &weak); - - mono_field_set_value (obj, bridge_info->handle, &handle); - mono_field_set_value (obj, bridge_info->handle_type, &type); - return handle != nullptr; -} - -mono_bool -OSBridge::take_weak_global_ref_2_1_compat (JNIEnv *env, MonoObject *obj) -{ - jobject weaklocal; - jobject handle, weakglobal; - - MonoJavaGCBridgeInfo *bridge_info = get_gc_bridge_info_for_object (obj); - if (bridge_info == nullptr) - return 0; - - mono_field_get_value (obj, bridge_info->handle, &handle); - weaklocal = env->NewObject (weakrefClass, weakrefCtor, handle); - weakglobal = env->NewGlobalRef (weaklocal); - env->DeleteLocalRef (weaklocal); - if (gref_log) { - fprintf (gref_log, "*take_weak_2_1 obj=%p -> wref=%p handle=%p\n", obj, weakglobal, handle); - fflush (gref_log); - } - _monodroid_weak_gref_new (handle, get_object_ref_type (env, handle), - weakglobal, get_object_ref_type (env, weakglobal), "finalizer", gettid (), __PRETTY_FUNCTION__, 0); - - _monodroid_gref_log_delete (handle, get_object_ref_type (env, handle), "finalizer", gettid (), __PRETTY_FUNCTION__, 0); - - env->DeleteGlobalRef (handle); - mono_field_set_value (obj, bridge_info->weak_handle, &weakglobal); - return 1; -} - mono_bool OSBridge::take_global_ref_jni (JNIEnv *env, MonoObject *obj) { @@ -1001,58 +938,13 @@ OSBridge::gc_cross_references (int num_sccs, MonoGCBridgeSCC **sccs, int num_xre set_bridge_processing_field (domains_list, 0); } -int -OSBridge::platform_supports_weak_refs (void) -{ - char *value; - int api_level = 0; - - if (AndroidSystem::monodroid_get_system_property ("ro.build.version.sdk", &value) > 0) { - api_level = atoi (value); - free (value); - } - - if (AndroidSystem::monodroid_get_system_property (SharedConstants::DEBUG_MONO_WREF_PROPERTY, &value) > 0) { - int use_weak_refs = 0; - if (!strcmp ("jni", value)) - use_weak_refs = 1; - else if (!strcmp ("java", value)) - use_weak_refs = 0; - else { - use_weak_refs = -1; - log_warn (LOG_GC, "Unsupported debug.mono.wref value '%s'; " - "supported values are 'jni' and 'java'. Ignoring...", - value); - } - free (value); - - if (use_weak_refs && api_level < 8) - log_warn (LOG_GC, "Using JNI weak references instead of " - "java.lang.WeakReference on API-%i. Are you sure you want to do this? " - "The GC may be compromised.", - api_level); - - if (use_weak_refs >= 0) - return use_weak_refs; - } - - return 1; -} - void OSBridge::register_gc_hooks (void) { MonoGCBridgeCallbacks bridge_cbs; - if (platform_supports_weak_refs ()) { - take_global_ref = &OSBridge::take_global_ref_jni; - take_weak_global_ref = &OSBridge::take_weak_global_ref_jni; - log_info (LOG_GC, "environment supports jni NewWeakGlobalRef"); - } else { - take_global_ref = &OSBridge::take_global_ref_2_1_compat; - take_weak_global_ref = &OSBridge::take_weak_global_ref_2_1_compat; - log_info (LOG_GC, "environment does not support jni NewWeakGlobalRef"); - } + take_global_ref = &OSBridge::take_global_ref_jni; + take_weak_global_ref = &OSBridge::take_weak_global_ref_jni; bridge_cbs.bridge_version = SGEN_BRIDGE_VERSION; bridge_cbs.bridge_class_kind = gc_bridge_class_kind_cb; diff --git a/src/native/monodroid/osbridge.hh b/src/native/monodroid/osbridge.hh index 217470e92c8..e49cdd25a30 100644 --- a/src/native/monodroid/osbridge.hh +++ b/src/native/monodroid/osbridge.hh @@ -40,7 +40,6 @@ namespace xamarin::android::internal MonoClassField *handle; MonoClassField *handle_type; MonoClassField *refs_added; - MonoClassField *weak_handle; }; // add_reference can work with objects which are either MonoObjects with java peers, or raw jobjects @@ -134,8 +133,6 @@ namespace xamarin::android::internal int _monodroid_gref_dec (); char* _get_stack_trace_line_end (char *m); void _write_stack_trace (FILE *to, char *from, LogCategories = LOG_NONE); - mono_bool take_global_ref_2_1_compat (JNIEnv *env, MonoObject *obj); - mono_bool take_weak_global_ref_2_1_compat (JNIEnv *env, MonoObject *obj); mono_bool take_global_ref_jni (JNIEnv *env, MonoObject *obj); mono_bool take_weak_global_ref_jni (JNIEnv *env, MonoObject *obj); mono_bool add_reference_jobject (JNIEnv *env, jobject handle, jobject reffed_handle); @@ -152,7 +149,6 @@ namespace xamarin::android::internal void gc_cleanup_after_java_collection (JNIEnv *env, int num_sccs, MonoGCBridgeSCC **sccs); void java_gc (JNIEnv *env); void set_bridge_processing_field (MonodroidBridgeProcessingInfo *list, mono_bool value); - int platform_supports_weak_refs (); #if DEBUG char* describe_target (AddReferenceTarget target);