Skip to content

[GC Bridge] Split ManagedValueManager and SimpleValueManager #10222

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 18, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ static void init (IntPtr jnienv, IntPtr klass, IntPtr classLoader)
EnvironmentPointer = jnienv,
ClassLoader = new JniObjectReference (classLoader),
TypeManager = typeManager,
ValueManager = new ManagedValueManager (),
ValueManager = new SimpleValueManager (),
UseMarshalMemberBuilder = false,
JniGlobalReferenceLogWriter = settings.GrefLog,
JniLocalReferenceLogWriter = settings.LrefLog,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ static NativeAotRuntimeOptions CreateJreVM (NativeAotRuntimeOptions builder)
builder.TypeManager ??= new ManagedTypeManager ();
#endif // NET

builder.ValueManager ??= new ManagedValueManager ();
builder.ValueManager ??= new SimpleValueManager ();
builder.ObjectReferenceManager ??= new ManagedObjectReferenceManager (builder.JniGlobalReferenceLogWriter, builder.JniLocalReferenceLogWriter);

if (builder.InvocationPointer != IntPtr.Zero || builder.EnvironmentPointer != IntPtr.Zero)
Expand Down
4 changes: 2 additions & 2 deletions src/Mono.Android/Android.Runtime/AndroidRuntime.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,15 @@ public override string GetCurrentManagedThreadStackTrace (int skipFrames, bool f
{
if (!reference.IsValid)
return null;
var peeked = JNIEnvInit.ValueManager?.PeekPeer (reference);
var peeked = JniEnvironment.Runtime.ValueManager.PeekPeer (reference);
var peekedExc = peeked as Exception;
if (peekedExc == null) {
var throwable = Java.Lang.Object.GetObject<Java.Lang.Throwable> (reference.Handle, JniHandleOwnership.DoNotTransfer);
JniObjectReference.Dispose (ref reference, options);
return throwable;
}
JniObjectReference.Dispose (ref reference, options);
var unwrapped = JNIEnvInit.ValueManager?.PeekValue (peeked!.PeerReference) as Exception;
var unwrapped = JniEnvironment.Runtime.ValueManager.PeekValue (peeked!.PeerReference) as Exception;
if (unwrapped != null) {
return unwrapped;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mono.Android/Android.Runtime/JNIEnv.cs
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ internal static void PropagateUncaughtException (IntPtr env, IntPtr javaThreadPt

public static void WaitForBridgeProcessing ()
{
JNIEnvInit.ValueManager?.WaitForGCBridgeProcessing ();
JniEnvironment.Runtime.ValueManager.WaitForGCBridgeProcessing ();
}

public static IntPtr AllocObject (string jniClassName)
Expand Down
11 changes: 6 additions & 5 deletions src/Mono.Android/Android.Runtime/JNIEnvInit.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ internal struct JnienvInitializeArgs {
}
#pragma warning restore 0649

internal static JniRuntime.JniValueManager? ValueManager;
internal static bool IsRunningOnDesktop;
internal static bool jniRemappingInUse;
internal static bool MarshalMethodsEnabled;
Expand Down Expand Up @@ -88,7 +87,6 @@ static Type TypeGetType (string typeName) =>
internal static void InitializeJniRuntime (JniRuntime runtime)
{
androidRuntime = runtime;
ValueManager = runtime.ValueManager;
SetSynchronizationContext ();
}

Expand All @@ -115,11 +113,15 @@ internal static unsafe void Initialize (JnienvInitializeArgs* args)
JniRuntime.JniValueManager valueManager;
if (RuntimeFeature.ManagedTypeMap) {
typeManager = new ManagedTypeManager ();
valueManager = new ManagedValueManager ();
} else {
typeManager = new AndroidTypeManager (args->jniAddNativeMethodRegistrationAttributePresent != 0);
valueManager = RuntimeType == DotNetRuntimeType.MonoVM ? new AndroidValueManager () : new ManagedValueManager ();
}
valueManager = RuntimeType switch
{
DotNetRuntimeType.MonoVM => new AndroidValueManager(),
DotNetRuntimeType.CoreCLR => ManagedValueManager.GetOrCreateInstance(),
_ => throw new NotSupportedException ($"No value manager for runtime type: {RuntimeType}"),
};
androidRuntime = new AndroidRuntime (
args->env,
args->javaVm,
Expand All @@ -128,7 +130,6 @@ internal static unsafe void Initialize (JnienvInitializeArgs* args)
valueManager,
args->jniAddNativeMethodRegistrationAttributePresent != 0
);
ValueManager = androidRuntime.ValueManager;

IsRunningOnDesktop = args->isRunningOnDesktop == 1;

Expand Down
80 changes: 40 additions & 40 deletions src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/Mono.Android/Android.Runtime/JNINativeWrapper.g.tt
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ foreach (var info in delegateTypes) {
#>
internal static <#= info.Return #> Wrap<#= info.Type #> (this <#= info.Type #> callback, <#= info.Signature #>)
{
JNIEnvInit.ValueManager?.WaitForGCBridgeProcessing ();
Java.Interop.JniEnvironment.Runtime.ValueManager.WaitForGCBridgeProcessing ();
try {
<#= info.Return != "void" ? "return " : "" #>callback (<#= info.Invoke #>);
} catch (Exception e) when (_unhandled_exception (e)) {
Expand Down
2 changes: 1 addition & 1 deletion src/Mono.Android/Java.Interop/Runtime.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public static class Runtime {
[Obsolete ("Please use Java.Interop.JniEnvironment.Runtime.ValueManager.GetSurfacedPeers()")]
public static List<WeakReference> GetSurfacedObjects ()
{
var peers = JNIEnvInit.ValueManager!.GetSurfacedPeers ();
var peers = JniEnvironment.Runtime.ValueManager.GetSurfacedPeers ();
var r = new List<WeakReference> (peers.Count);
foreach (var p in peers) {
if (p.SurfacedPeer.TryGetTarget (out var target))
Expand Down
6 changes: 3 additions & 3 deletions src/Mono.Android/Java.Lang/Object.cs
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ protected void SetHandle (IntPtr value, JniHandleOwnership transfer)
{
var reference = new JniObjectReference (value);
var options = FromJniHandleOwnership (transfer);
JNIEnvInit.ValueManager?.ConstructPeer (
JniEnvironment.Runtime.ValueManager.ConstructPeer (
this,
ref reference,
value == IntPtr.Zero ? JniObjectReferenceOptions.None : options);
Expand All @@ -128,7 +128,7 @@ static JniObjectReferenceOptions FromJniHandleOwnership (JniHandleOwnership tran

internal static IJavaPeerable? PeekObject (IntPtr handle, Type? requiredType = null)
{
var peeked = JNIEnvInit.ValueManager?.PeekPeer (new JniObjectReference (handle));
var peeked = JniEnvironment.Runtime.ValueManager.PeekPeer (new JniObjectReference (handle));
if (peeked == null)
return null;
if (requiredType != null && !requiredType.IsAssignableFrom (peeked.GetType ()))
Expand Down Expand Up @@ -180,7 +180,7 @@ internal static T? _GetObject<
if (handle == IntPtr.Zero)
return null;

var r = JNIEnvInit.ValueManager!.GetPeer (new JniObjectReference (handle), type);
var r = JniEnvironment.Runtime.ValueManager.GetPeer (new JniObjectReference (handle), type);
JNIEnv.DeleteRef (handle, transfer);
return r;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@ class ManagedValueManager : JniRuntime.JniValueManager

Dictionary<int, List<IJavaPeerable>>? RegisteredInstances = new Dictionary<int, List<IJavaPeerable>>();

internal ManagedValueManager ()
static Lazy<ManagedValueManager> s_instance = new (() => new ManagedValueManager ());
public static ManagedValueManager GetOrCreateInstance () => s_instance.Value;

ManagedValueManager ()
{
}

Expand Down
Loading
Loading