Skip to content

Commit 0919d85

Browse files
committed
[Foundation] Fix NSObjectData leak.
1 parent 702b903 commit 0919d85

File tree

1 file changed

+13
-4
lines changed

1 file changed

+13
-4
lines changed

src/Foundation/NSObject2.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ struct NSObjectData {
7676
public NSObject.Flags flags;
7777
}
7878

79-
class NSObjectDataHandle : CriticalHandle {
79+
class NSObjectDataHandle : SafeHandle {
8080
public NSObjectDataHandle ()
81-
: base (IntPtr.Zero)
81+
: base (IntPtr.Zero, true)
8282
{
8383
unsafe {
8484
this.handle = (IntPtr) NativeMemory.AllocZeroed ((nuint) sizeof (NSObjectData));
@@ -90,7 +90,7 @@ public unsafe NSObjectData* Data {
9090
}
9191

9292
public override bool IsInvalid {
93-
get => handle != IntPtr.Zero;
93+
get => handle == IntPtr.Zero;
9494
}
9595

9696
protected override bool ReleaseHandle ()
@@ -1000,6 +1000,8 @@ protected virtual void Dispose (bool disposing)
10001000
} else {
10011001
NSObject_Disposer.Add (this);
10021002
}
1003+
// DO NOT dispose data_handle here, we rely on it being disposed by the GC in a later garbage collection
1004+
// data_handle.Dispose ();
10031005
}
10041006
}
10051007

@@ -1025,6 +1027,11 @@ private NSObject_Disposer ()
10251027
static internal void Add (NSObject handle)
10261028
{
10271029
bool call_drain;
1030+
1031+
var success = false;
1032+
handle.data_handle.DangerousAddRef (ref success);
1033+
// 'success' will never be false here, because DangerousAddRef will throw an exception in case of failure.
1034+
10281035
lock (lock_obj) {
10291036
handles.Add (handle);
10301037
call_drain = handles.Count == 1;
@@ -1064,8 +1071,10 @@ static void Drain (NSObject ctx)
10641071
handles = drainList1;
10651072
}
10661073

1067-
foreach (NSObject x in drainList)
1074+
foreach (NSObject x in drainList) {
10681075
x.ReleaseManagedRef ();
1076+
x.DangerousRelease ();
1077+
}
10691078
drainList.Clear ();
10701079

10711080
lock (lock_obj) {

0 commit comments

Comments
 (0)