Skip to content

[WIP] GC bridge integration for CoreCLR #10185

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

Closed
wants to merge 17 commits into from
Closed
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
4 changes: 2 additions & 2 deletions packages/Microsoft.NETCore.App.Ref.10.0.0-dev.nupkg
Git LFS file not shown
Git LFS file not shown

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,11 @@ static void init (IntPtr jnienv, IntPtr klass, IntPtr classLoader)
var settings = new DiagnosticSettings ();
settings.AddDebugDotnetLog ();

var typeManager = new ManagedTypeManager ();
var options = new NativeAotRuntimeOptions {
EnvironmentPointer = jnienv,
ClassLoader = new JniObjectReference (classLoader),
TypeManager = typeManager,
ValueManager = new ManagedValueManager (),
TypeManager = new ManagedTypeManager (),
ValueManager = ManagedValueManager.GetOrCreateInstance (), // TODO this will likely blow up in AOT at runtime currently
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 ??= ManagedValueManager.GetOrCreateInstance ();
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
8 changes: 3 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,12 @@ 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 ();
}
// TODO is there any reason why the ManagedTypeMap would need ManagedValueManager?
// ManagedValueManager is specifically tied to the CoreCLR JavaMarshal APIs and it does not work with MonoVM.
valueManager = RuntimeType == DotNetRuntimeType.MonoVM ? new AndroidValueManager () : ManagedValueManager.GetOrCreateInstance ();
androidRuntime = new AndroidRuntime (
args->env,
args->javaVm,
Expand All @@ -128,7 +127,6 @@ internal static unsafe void Initialize (JnienvInitializeArgs* args)
valueManager,
args->jniAddNativeMethodRegistrationAttributePresent != 0
);
ValueManager = androidRuntime.ValueManager;

IsRunningOnDesktop = args->isRunningOnDesktop == 1;

Expand Down
14 changes: 4 additions & 10 deletions src/Mono.Android/Android.Runtime/RuntimeNativeMethods.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,16 +93,10 @@ internal unsafe static class RuntimeNativeMethods
[DllImport (RuntimeConstants.InternalDllName, CallingConvention = CallingConvention.Cdecl)]
internal static extern bool clr_typemap_java_to_managed (string java_type_name, out IntPtr managed_assembly_name, out uint managed_type_token_id);

/// <summary>
/// TODO: implement this in the native side.
/// Initializes the "GC Bridge" implementation for the CoreCLR runtime.
/// </summary>
/// <param name="bridge_processing_finished_callback">A function pointer to a C# callback that will be invoked when bridge processing has completed.</param>
/// <returns>A function pointer that should be passed to JavaMarshal.Initialize() on startup.</returns>
[DllImport (RuntimeConstants.InternalDllName, CallingConvention = CallingConvention.Cdecl)]
internal static extern delegate* unmanaged<MarkCrossReferences*, void> clr_initialize_gc_bridge (
delegate* unmanaged<MarkCrossReferences*, void> bridge_processing_finished_callback
);
[DllImport (RuntimeConstants.InternalDllName, CallingConvention = CallingConvention.Cdecl)]
internal static extern delegate* unmanaged<MarkCrossReferencesArgs*, void> clr_initialize_gc_bridge (
delegate* unmanaged<void> bridge_processing_started_callback,
delegate* unmanaged<MarkCrossReferencesArgs*, void> bridge_processing_finished_callback);

[MethodImplAttribute(MethodImplOptions.InternalCall)]
internal static extern void monodroid_unhandled_exception (Exception javaException);
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
Loading
Loading