Skip to content

Commit 22ffe25

Browse files
committed
Add a JniObjectReferenceControlBlock to JavaException
1 parent 628aa39 commit 22ffe25

File tree

3 files changed

+32
-24
lines changed

3 files changed

+32
-24
lines changed

src/Java.Interop/Java.Interop/JavaException.cs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,7 @@ unsafe public class JavaException : Exception, IJavaPeerable
1818
JniObjectReference reference;
1919
#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
2020
#if FEATURE_JNIOBJECTREFERENCE_INTPTRS
21-
IntPtr handle;
22-
JniObjectReferenceType handle_type;
23-
#pragma warning disable 0169
24-
// Used by JavaInteropGCBridge
25-
IntPtr weak_handle;
26-
int refs_added;
27-
#pragma warning restore 0169
21+
unsafe JniObjectReferenceControlBlock* jniObjectReferenceControlBlock;
2822
#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
2923

3024
protected static readonly JniObjectReference* InvalidJniObjectReference = null;
@@ -106,7 +100,11 @@ public JniObjectReference PeerReference {
106100
return reference;
107101
#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
108102
#if FEATURE_JNIOBJECTREFERENCE_INTPTRS
109-
return new JniObjectReference (handle, handle_type);
103+
var c = jniObjectReferenceControlBlock;
104+
if (c == null) {
105+
return default;
106+
}
107+
return new JniObjectReference (c->handle, (JniObjectReferenceType) c->handle_type);
110108
#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
111109
}
112110
}
@@ -137,8 +135,13 @@ protected void SetPeerReference (ref JniObjectReference reference, JniObjectRefe
137135
this.reference = reference;
138136
#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
139137
#if FEATURE_JNIOBJECTREFERENCE_INTPTRS
140-
this.handle = reference.Handle;
141-
this.handle_type = reference.Type;
138+
var c = jniObjectReferenceControlBlock;
139+
if (c == null) {
140+
c = jniObjectReferenceControlBlock =
141+
Java.Interop.JniObjectReferenceControlBlock.Alloc ();
142+
}
143+
c->handle = reference.Handle;
144+
c->handle_type = (int) reference.Type;
142145
#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
143146

144147
JniObjectReference.Dispose (ref reference, options);
@@ -167,6 +170,9 @@ protected virtual void Dispose (bool disposing)
167170
if (inner != null) {
168171
inner.Dispose ();
169172
}
173+
#if FEATURE_JNIOBJECTREFERENCE_INTPTRS
174+
Java.Interop.JniObjectReferenceControlBlock.Free (ref jniObjectReferenceControlBlock);
175+
#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
170176
}
171177

172178
public override bool Equals (object? obj)
@@ -282,6 +288,9 @@ void IJavaPeerable.SetPeerReference (JniObjectReference reference)
282288
{
283289
SetPeerReference (ref reference, JniObjectReferenceOptions.Copy);
284290
}
291+
292+
IntPtr IJavaPeerable.JniObjectReferenceControlBlock =>
293+
(IntPtr) jniObjectReferenceControlBlock;
285294
}
286295
}
287296

src/Java.Interop/Java.Interop/JavaObject.cs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@ unsafe public class JavaObject : IJavaPeerable
2525
[NonSerialized] JniObjectReference reference;
2626
#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
2727
#if FEATURE_JNIOBJECTREFERENCE_INTPTRS
28-
IntPtr jniObjectReferenceControlBlock;
29-
unsafe JniObjectReferenceControlBlock* JniObjectReferenceControlBlock =>
30-
(JniObjectReferenceControlBlock*) jniObjectReferenceControlBlock;
28+
unsafe JniObjectReferenceControlBlock* jniObjectReferenceControlBlock;
3129
#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
3230

3331
protected static readonly JniObjectReference* InvalidJniObjectReference = null;
@@ -43,7 +41,7 @@ public unsafe JniObjectReference PeerReference {
4341
return reference;
4442
#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
4543
#if FEATURE_JNIOBJECTREFERENCE_INTPTRS
46-
var c = JniObjectReferenceControlBlock;
44+
var c = jniObjectReferenceControlBlock;
4745
if (c == null) {
4846
return default;
4947
}
@@ -91,11 +89,10 @@ protected void SetPeerReference (ref JniObjectReference reference, JniObjectRefe
9189
this.reference = reference;
9290
#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
9391
#if FEATURE_JNIOBJECTREFERENCE_INTPTRS
94-
var c = JniObjectReferenceControlBlock;
92+
var c = jniObjectReferenceControlBlock;
9593
if (c == null) {
96-
jniObjectReferenceControlBlock =
94+
c = jniObjectReferenceControlBlock =
9795
Java.Interop.JniObjectReferenceControlBlock.Alloc ();
98-
c = JniObjectReferenceControlBlock;
9996
}
10097
c->handle = reference.Handle;
10198
c->handle_type = (int) reference.Type;
@@ -180,7 +177,7 @@ void IJavaPeerable.SetPeerReference (JniObjectReference reference)
180177
}
181178

182179
IntPtr IJavaPeerable.JniObjectReferenceControlBlock =>
183-
jniObjectReferenceControlBlock;
180+
(IntPtr) jniObjectReferenceControlBlock;
184181
}
185182
}
186183

src/Java.Interop/Java.Interop/JniObjectReferenceControlBlock.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,17 @@ internal struct JniObjectReferenceControlBlock {
1111

1212
public static readonly int Size = Marshal.SizeOf<JniObjectReferenceControlBlock>();
1313

14-
public static unsafe IntPtr Alloc () =>
15-
(IntPtr) NativeMemory.AllocZeroed (1, (uint) Size);
14+
public static unsafe JniObjectReferenceControlBlock* Alloc ()
15+
{
16+
return (JniObjectReferenceControlBlock*)NativeMemory.AllocZeroed (1, (uint) Size);
17+
}
1618

17-
public static unsafe void Free (ref IntPtr value)
19+
public static unsafe void Free (ref JniObjectReferenceControlBlock* value)
1820
{
19-
if (value == 0) {
21+
if (value == null) {
2022
return;
2123
}
22-
NativeMemory.Free ((void*) value);
23-
value = IntPtr.Zero;
24+
NativeMemory.Free (value);
25+
value = null;
2426
}
2527
}

0 commit comments

Comments
 (0)