Skip to content

Commit 27ddee7

Browse files
TIHancartermp
authored andcommitted
Added SafeUnmanagedMemoryStream for AsStream/AsReadOnlyStream (#8005)
* Added SafeUnmanagedMemoryStream for AsStream/AsReadOnlyStream on RawByteMemory * Disposed should be true
1 parent 230f82b commit 27ddee7

File tree

1 file changed

+33
-3
lines changed

1 file changed

+33
-3
lines changed

src/absil/bytes.fs

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,36 @@ type ByteArrayMemory(bytes: byte[], offset, length) =
116116
override _.AsReadOnlyStream() =
117117
new MemoryStream(bytes, offset, length, false) :> Stream
118118

119+
[<Sealed>]
120+
type SafeUnmanagedMemoryStream =
121+
inherit UnmanagedMemoryStream
122+
123+
val mutable private hold: obj
124+
val mutable private isDisposed: bool
125+
126+
new (addr, length, hold) =
127+
{
128+
inherit UnmanagedMemoryStream(addr, length)
129+
hold = hold
130+
isDisposed = false
131+
}
132+
133+
new (addr: nativeptr<byte>, length: int64, capacity: int64, access: FileAccess, hold) =
134+
{
135+
inherit UnmanagedMemoryStream(addr, length, capacity, access)
136+
hold = hold
137+
isDisposed = false
138+
}
139+
140+
override x.Finalize() =
141+
x.Dispose false
142+
143+
override x.Dispose disposing =
144+
base.Dispose disposing
145+
if not x.isDisposed then
146+
x.hold <- null // Null out so it can be collected.
147+
x.isDisposed <- true
148+
119149
[<Sealed>]
120150
type RawByteMemory(addr: nativeptr<byte>, length: int, hold: obj) =
121151
inherit ByteMemory ()
@@ -170,7 +200,7 @@ type RawByteMemory(addr: nativeptr<byte>, length: int, hold: obj) =
170200
use stream2 = x.AsStream()
171201
stream2.CopyTo stream
172202

173-
override x.Copy(srcOffset, dest, destOffset, count) =
203+
override _.Copy(srcOffset, dest, destOffset, count) =
174204
check srcOffset
175205
Marshal.Copy(NativePtr.toNativeInt addr + nativeint srcOffset, dest, destOffset, count)
176206

@@ -180,10 +210,10 @@ type RawByteMemory(addr: nativeptr<byte>, length: int, hold: obj) =
180210
res
181211

182212
override _.AsStream() =
183-
new UnmanagedMemoryStream(addr, int64 length) :> Stream
213+
new SafeUnmanagedMemoryStream(addr, int64 length, hold) :> Stream
184214

185215
override _.AsReadOnlyStream() =
186-
new UnmanagedMemoryStream(addr, int64 length, int64 length, FileAccess.Read) :> Stream
216+
new SafeUnmanagedMemoryStream(addr, int64 length, int64 length, FileAccess.Read, hold) :> Stream
187217

188218
[<Struct;NoEquality;NoComparison>]
189219
type ReadOnlyByteMemory(bytes: ByteMemory) =

0 commit comments

Comments
 (0)