Skip to content

Commit 49e01de

Browse files
committed
Remove support for using Java's WeakReference instead of JNI's weak handles
1 parent 5bd93ae commit 49e01de

File tree

3 files changed

+12
-118
lines changed

3 files changed

+12
-118
lines changed

src/Java.Runtime.Environment/Java.Interop/MonoRuntimeValueManager.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,6 @@
99

1010
namespace Java.Interop {
1111

12-
enum GCBridgeUseWeakReferenceKind {
13-
Java,
14-
Jni,
15-
}
16-
1712
class MonoRuntimeValueManager : JniRuntime.JniValueManager {
1813

1914
#pragma warning disable 0649
@@ -52,7 +47,7 @@ public override void OnSetRuntime (JniRuntime runtime)
5247
bridge = IntPtr.Zero;
5348
throw;
5449
}
55-
if (JreNativeMethods.java_interop_gc_bridge_register_hooks (bridge, GCBridgeUseWeakReferenceKind.Jni) < 0)
50+
if (JreNativeMethods.java_interop_gc_bridge_register_hooks (bridge) < 0)
5651
throw new NotSupportedException ("Could not register GC Bridge with Mono!");
5752
}
5853

@@ -393,7 +388,7 @@ partial class JreNativeMethods {
393388
internal static extern int java_interop_gc_bridge_set_current_once (IntPtr bridge);
394389

395390
[DllImport (JavaInteropLib, CallingConvention=CallingConvention.Cdecl)]
396-
internal static extern int java_interop_gc_bridge_register_hooks (IntPtr bridge, GCBridgeUseWeakReferenceKind weak_ref_kind);
391+
internal static extern int java_interop_gc_bridge_register_hooks (IntPtr bridge);
397392

398393
[DllImport (JavaInteropLib, CallingConvention=CallingConvention.Cdecl)]
399394
internal static extern IntPtr java_interop_gc_bridge_new (IntPtr jvm);

src/java-interop/java-interop-gc-bridge-mono.cc

Lines changed: 9 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,6 @@ struct JavaInteropGCBridge {
6060
jobject Runtime_instance;
6161
jmethodID Runtime_gc;
6262

63-
jclass WeakReference_class;
64-
jmethodID WeakReference_init;
65-
jmethodID WeakReference_get;
66-
6763
jclass GCUserPeerable_class;
6864
jmethodID GCUserPeerable_add;
6965
jmethodID GCUserPeerable_clear;
@@ -106,12 +102,9 @@ java_interop_gc_bridge_destroy (JavaInteropGCBridge *bridge)
106102
JNIEnv *env = ensure_jnienv (bridge);
107103
if (env != NULL) {
108104
env->DeleteGlobalRef (bridge->Runtime_instance);
109-
env->DeleteGlobalRef (bridge->WeakReference_class);
110105
env->DeleteGlobalRef (bridge->GCUserPeerable_class);
111106

112-
bridge->Runtime_instance = NULL;
113-
bridge->WeakReference_class = NULL;
114-
107+
bridge->Runtime_instance = NULL;
115108
bridge->GCUserPeerable_class = NULL;
116109
}
117110

@@ -277,13 +270,6 @@ java_interop_gc_bridge_new (JavaVM *jvm)
277270
env->DeleteLocalRef (Runtime_class);
278271
}
279272

280-
jclass WeakReference_class = env->FindClass ("java/lang/ref/WeakReference");
281-
if (WeakReference_class != NULL) {
282-
bridge.WeakReference_init = env->GetMethodID (WeakReference_class, "<init>", "(Ljava/lang/Object;)V");
283-
bridge.WeakReference_get = env->GetMethodID (WeakReference_class, "get", "()Ljava/lang/Object;");
284-
bridge.WeakReference_class = static_cast<jclass>(lref_to_gref (env, WeakReference_class));
285-
}
286-
287273
jclass GCUserPeerable_class = env->FindClass ("net/dot/jni/GCUserPeerable");
288274
if (GCUserPeerable_class) {
289275
bridge.GCUserPeerable_add = env->GetMethodID (GCUserPeerable_class, "jiAddManagedReference", "(Ljava/lang/Object;)V");
@@ -295,8 +281,7 @@ java_interop_gc_bridge_new (JavaVM *jvm)
295281
JavaInteropGCBridge *p = static_cast<JavaInteropGCBridge*>(calloc (1, sizeof (JavaInteropGCBridge)));
296282

297283
if (p == NULL || bridge.jvm == NULL ||
298-
bridge.Runtime_instance == NULL || bridge.Runtime_gc == NULL ||
299-
bridge.WeakReference_class == NULL || bridge.WeakReference_init == NULL || bridge.WeakReference_get == NULL) {
284+
bridge.Runtime_instance == NULL || bridge.Runtime_gc == NULL) {
300285
java_interop_gc_bridge_destroy (&bridge);
301286
free (p);
302287
return NULL;
@@ -772,72 +757,8 @@ get_gc_bridge_info_for_object (JavaInteropGCBridge *bridge, MonoObject *object)
772757
return get_gc_bridge_info_for_class (bridge, mono_object_get_class (object));
773758
}
774759

775-
typedef mono_bool (*MonodroidGCTakeRefFunc) (JavaInteropGCBridge *bridge, JNIEnv *env, MonoObject *obj, const char *thread_name, int64_t thread_id);
776-
777-
static MonodroidGCTakeRefFunc take_global_ref;
778-
static MonodroidGCTakeRefFunc take_weak_global_ref;
779-
780-
static mono_bool
781-
take_global_ref_java (JavaInteropGCBridge *bridge, JNIEnv *env, MonoObject *obj, const char *thread_name, int64_t thread_id)
782-
{
783-
MonoJavaGCBridgeInfo *bridge_info = get_gc_bridge_info_for_object (bridge, obj);
784-
if (bridge_info == NULL)
785-
return 0;
786-
787-
jobject weak;
788-
mono_field_get_value (obj, bridge_info->weak_handle, &weak);
789-
790-
jobject handle = env->CallObjectMethod (weak, bridge->WeakReference_get);
791-
log_gref (bridge, "*try_take_global_2_1 obj=%p -> wref=%p handle=%p\n", obj, weak, handle);
792-
793-
if (handle) {
794-
jobject h = env->NewGlobalRef (handle);
795-
env->DeleteLocalRef (handle);
796-
handle = h;
797-
java_interop_gc_bridge_gref_log_new (bridge, weak, get_object_ref_type (env, weak),
798-
handle, get_object_ref_type (env, handle), thread_name, thread_id, "take_global_ref_java");
799-
}
800-
java_interop_gc_bridge_weak_gref_log_delete (bridge, weak, get_object_ref_type (env, weak), thread_name, thread_id, "take_global_ref_java");
801-
env->DeleteGlobalRef (weak);
802-
weak = NULL;
803-
mono_field_set_value (obj, bridge_info->weak_handle, &weak);
804-
805-
mono_field_set_value (obj, bridge_info->handle, &handle);
806-
807-
int type = JNIGlobalRefType;
808-
mono_field_set_value (obj, bridge_info->handle_type, &type);
809-
810-
return handle != NULL;
811-
}
812-
813-
static mono_bool
814-
take_weak_global_ref_java (JavaInteropGCBridge *bridge, JNIEnv *env, MonoObject *obj, const char *thread_name, int64_t thread_id)
815-
{
816-
MonoJavaGCBridgeInfo *bridge_info = get_gc_bridge_info_for_object (bridge, obj);
817-
if (bridge_info == NULL)
818-
return 0;
819-
820-
jobject handle;
821-
mono_field_get_value (obj, bridge_info->handle, &handle);
822-
823-
jobject weaklocal = env->NewObject (bridge->WeakReference_class, bridge->WeakReference_init, handle);
824-
jobject weakglobal = env->NewGlobalRef (weaklocal);
825-
env->DeleteLocalRef (weaklocal);
826-
827-
log_gref (bridge, "*take_weak_2_1 obj=%p -> wref=%p handle=%p\n", obj, weakglobal, handle);
828-
java_interop_gc_bridge_weak_gref_log_new (bridge, handle, get_object_ref_type (env, handle),
829-
weakglobal, get_object_ref_type (env, weakglobal), thread_name, thread_id, "take_weak_global_ref_2_1_compat");
830-
831-
java_interop_gc_bridge_gref_log_delete (bridge, handle, get_object_ref_type (env, handle), thread_name, thread_id, "take_weak_global_ref_2_1_compat");
832-
env->DeleteGlobalRef (handle);
833-
834-
mono_field_set_value (obj, bridge_info->weak_handle, &weakglobal);
835-
836-
return 1;
837-
}
838-
839760
static mono_bool
840-
take_global_ref_jni (JavaInteropGCBridge *bridge, JNIEnv *env, MonoObject *obj, const char *thread_name, int64_t thread_id)
761+
take_global_ref (JavaInteropGCBridge *bridge, JNIEnv *env, MonoObject *obj, const char *thread_name, int64_t thread_id)
841762
{
842763
MonoJavaGCBridgeInfo *bridge_info = get_gc_bridge_info_for_object (bridge, obj);
843764
if (bridge_info == NULL)
@@ -853,11 +774,11 @@ take_global_ref_jni (JavaInteropGCBridge *bridge, JNIEnv *env, MonoObject *obj,
853774
java_interop_gc_bridge_gref_log_new (bridge, weak, get_object_ref_type (env, weak),
854775
handle, get_object_ref_type (env, handle),
855776
thread_name, thread_id,
856-
"take_global_ref_jni");
777+
"take_global_ref");
857778
}
858779

859780
java_interop_gc_bridge_weak_gref_log_delete (bridge, weak, 'W',
860-
thread_name, thread_id, "take_global_ref_jni");
781+
thread_name, thread_id, "take_global_ref");
861782
env->DeleteWeakGlobalRef (weak);
862783

863784
mono_field_set_value (obj, bridge_info->handle, &handle);
@@ -868,7 +789,7 @@ take_global_ref_jni (JavaInteropGCBridge *bridge, JNIEnv *env, MonoObject *obj,
868789
}
869790

870791
static mono_bool
871-
take_weak_global_ref_jni (JavaInteropGCBridge *bridge, JNIEnv *env, MonoObject *obj, const char *thread_name, int64_t thread_id)
792+
take_weak_global_ref (JavaInteropGCBridge *bridge, JNIEnv *env, MonoObject *obj, const char *thread_name, int64_t thread_id)
872793
{
873794
MonoJavaGCBridgeInfo *bridge_info = get_gc_bridge_info_for_object (bridge, obj);
874795
if (bridge_info == NULL)
@@ -882,10 +803,10 @@ take_weak_global_ref_jni (JavaInteropGCBridge *bridge, JNIEnv *env, MonoObject *
882803
jobject weak = env->NewWeakGlobalRef (handle);
883804
java_interop_gc_bridge_weak_gref_log_new (bridge, handle, get_object_ref_type (env, handle),
884805
weak, get_object_ref_type (env, weak),
885-
thread_name, thread_id, "take_weak_global_ref_jni");
806+
thread_name, thread_id, "take_weak_global_ref");
886807

887808
java_interop_gc_bridge_gref_log_delete (bridge, handle, get_object_ref_type (env, handle),
888-
thread_name, thread_id, "take_weak_global_ref_jni");
809+
thread_name, thread_id, "take_weak_global_ref");
889810
env->DeleteGlobalRef (handle);
890811

891812
mono_field_set_value (obj, bridge_info->handle, &weak);
@@ -1272,7 +1193,7 @@ gc_cross_references (int num_sccs, MonoGCBridgeSCC **sccs, int num_xrefs, MonoGC
12721193
}
12731194

12741195
int
1275-
java_interop_gc_bridge_register_hooks (JavaInteropGCBridge *bridge, int weak_ref_kind)
1196+
java_interop_gc_bridge_register_hooks (JavaInteropGCBridge *bridge, [[maybe_unused]] int weak_ref_kind)
12761197
{
12771198
if (bridge == NULL)
12781199
return -1;
@@ -1284,23 +1205,6 @@ java_interop_gc_bridge_register_hooks (JavaInteropGCBridge *bridge, int weak_ref
12841205
MonoGCBridgeCallbacks bridge_cbs;
12851206
memset (&bridge_cbs, 0, sizeof (bridge_cbs));
12861207

1287-
switch (weak_ref_kind) {
1288-
case JAVA_INTEROP_GC_BRIDGE_USE_WEAK_REFERENCE_KIND_JAVA:
1289-
message = "Using java.lang.ref.WeakReference for JNI Weak References.";
1290-
take_global_ref = take_global_ref_java;
1291-
take_weak_global_ref = take_weak_global_ref_java;
1292-
break;
1293-
case JAVA_INTEROP_GC_BRIDGE_USE_WEAK_REFERENCE_KIND_JNI:
1294-
message = "Using JNIEnv::NewWeakGlobalRef() for JNI Weak References.";
1295-
take_global_ref = take_global_ref_jni;
1296-
take_weak_global_ref = take_weak_global_ref_jni;
1297-
break;
1298-
default:
1299-
return -1;
1300-
}
1301-
1302-
log_gref (mono_bridge, "%s\n", message);
1303-
13041208
bridge_cbs.bridge_version = SGEN_BRIDGE_VERSION;
13051209
bridge_cbs.bridge_class_kind = gc_bridge_class_kind;
13061210
bridge_cbs.is_bridge_object = gc_is_bridge_object;

src/java-interop/java-interop-gc-bridge.h

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,6 @@ JAVA_INTEROP_BEGIN_DECLS
1010

1111
typedef struct JavaInteropGCBridge JavaInteropGCBridge;
1212

13-
typedef enum JavaInteropGCBridgeUseWeakReferenceKind {
14-
JAVA_INTEROP_GC_BRIDGE_USE_WEAK_REFERENCE_KIND_JAVA,
15-
JAVA_INTEROP_GC_BRIDGE_USE_WEAK_REFERENCE_KIND_JNI,
16-
} JavaInteropGCBridgeUseWeakReferenceKind;
17-
1813
struct JavaInterop_System_RuntimeTypeHandle {
1914
void *value;
2015
};
@@ -25,7 +20,7 @@ JAVA_INTEROP_API int java_interop_gc_bridge_set_current_o
2520
JAVA_INTEROP_API JavaInteropGCBridge *java_interop_gc_bridge_new (JavaVM *jvm);
2621
JAVA_INTEROP_API int java_interop_gc_bridge_free (JavaInteropGCBridge *bridge);
2722

28-
JAVA_INTEROP_API int java_interop_gc_bridge_register_hooks (JavaInteropGCBridge *bridge, int weak_ref_kind);
23+
JAVA_INTEROP_API int java_interop_gc_bridge_register_hooks (JavaInteropGCBridge *bridge);
2924
JAVA_INTEROP_API int java_interop_gc_bridge_wait_for_bridge_processing (JavaInteropGCBridge *bridge);
3025

3126
JAVA_INTEROP_API int java_interop_gc_bridge_add_current_app_domain (JavaInteropGCBridge *bridge);

0 commit comments

Comments
 (0)