Skip to content

Commit b5e7803

Browse files
committed
Use dedicated System.Threading.Lock for RegisteredInstances
Replace lock(RegisteredInstances) with a dedicated Lock instance. Benchmark: neutral (30,580 vs 30,220 iterations in 2min stress test).
1 parent 166aee8 commit b5e7803

File tree

1 file changed

+6
-5
lines changed

1 file changed

+6
-5
lines changed

src/Mono.Android/Microsoft.Android.Runtime/ManagedValueManager.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class ManagedValueManager : JniRuntime.JniValueManager
2323
{
2424
const DynamicallyAccessedMemberTypes Constructors = DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors;
2525

26+
readonly Lock _registeredInstancesLock = new ();
2627
readonly Dictionary<int, List<ReferenceTrackingHandle>> RegisteredInstances = new ();
2728
readonly ConcurrentQueue<IntPtr> CollectedContexts = new ();
2829

@@ -62,7 +63,7 @@ public unsafe override void CollectPeers ()
6263
Debug.Assert (contextPtr != IntPtr.Zero, "CollectedContexts should not contain null pointers.");
6364
HandleContext* context = (HandleContext*)contextPtr;
6465

65-
lock (RegisteredInstances) {
66+
lock (_registeredInstancesLock) {
6667
Remove (context);
6768
}
6869

@@ -101,7 +102,7 @@ public override void AddPeer (IJavaPeerable value)
101102
JniObjectReference.Dispose (ref r, JniObjectReferenceOptions.CopyAndDispose);
102103
}
103104
int key = value.JniIdentityHashCode;
104-
lock (RegisteredInstances) {
105+
lock (_registeredInstancesLock) {
105106
List<ReferenceTrackingHandle>? peers;
106107
if (!RegisteredInstances.TryGetValue (key, out peers)) {
107108
peers = [new ReferenceTrackingHandle (value)];
@@ -154,7 +155,7 @@ void WarnNotReplacing (int key, IJavaPeerable ignoreValue, IJavaPeerable keepVal
154155

155156
int key = GetJniIdentityHashCode (reference);
156157

157-
lock (RegisteredInstances) {
158+
lock (_registeredInstancesLock) {
158159
if (!RegisteredInstances.TryGetValue (key, out List<ReferenceTrackingHandle>? peers))
159160
return null;
160161

@@ -182,7 +183,7 @@ public override void RemovePeer (IJavaPeerable value)
182183
if (value == null)
183184
throw new ArgumentNullException (nameof (value));
184185

185-
lock (RegisteredInstances) {
186+
lock (_registeredInstancesLock) {
186187
int key = value.JniIdentityHashCode;
187188
if (!RegisteredInstances.TryGetValue (key, out List<ReferenceTrackingHandle>? peers))
188189
return;
@@ -278,7 +279,7 @@ public override List<JniSurfacedPeerInfo> GetSurfacedPeers ()
278279
// Remove any collected contexts before iterating over all the registered instances
279280
CollectPeers ();
280281

281-
lock (RegisteredInstances) {
282+
lock (_registeredInstancesLock) {
282283
var peers = new List<JniSurfacedPeerInfo> (RegisteredInstances.Count);
283284
foreach (var (identityHashCode, referenceTrackingHandles) in RegisteredInstances) {
284285
foreach (var peer in referenceTrackingHandles) {

0 commit comments

Comments
 (0)