提交 27ddee73 编写于 作者: W Will Smith 提交者: Phillip Carter

Added SafeUnmanagedMemoryStream for AsStream/AsReadOnlyStream (#8005)

* Added SafeUnmanagedMemoryStream for AsStream/AsReadOnlyStream on RawByteMemory

* Disposed should be true
上级 230f82b4
......@@ -116,6 +116,36 @@ type ByteArrayMemory(bytes: byte[], offset, length) =
override _.AsReadOnlyStream() =
new MemoryStream(bytes, offset, length, false) :> Stream
[<Sealed>]
type SafeUnmanagedMemoryStream =
inherit UnmanagedMemoryStream
val mutable private hold: obj
val mutable private isDisposed: bool
new (addr, length, hold) =
{
inherit UnmanagedMemoryStream(addr, length)
hold = hold
isDisposed = false
}
new (addr: nativeptr<byte>, length: int64, capacity: int64, access: FileAccess, hold) =
{
inherit UnmanagedMemoryStream(addr, length, capacity, access)
hold = hold
isDisposed = false
}
override x.Finalize() =
x.Dispose false
override x.Dispose disposing =
base.Dispose disposing
if not x.isDisposed then
x.hold <- null // Null out so it can be collected.
x.isDisposed <- true
[<Sealed>]
type RawByteMemory(addr: nativeptr<byte>, length: int, hold: obj) =
inherit ByteMemory ()
......@@ -170,7 +200,7 @@ type RawByteMemory(addr: nativeptr<byte>, length: int, hold: obj) =
use stream2 = x.AsStream()
stream2.CopyTo stream
override x.Copy(srcOffset, dest, destOffset, count) =
override _.Copy(srcOffset, dest, destOffset, count) =
check srcOffset
Marshal.Copy(NativePtr.toNativeInt addr + nativeint srcOffset, dest, destOffset, count)
......@@ -180,10 +210,10 @@ type RawByteMemory(addr: nativeptr<byte>, length: int, hold: obj) =
res
override _.AsStream() =
new UnmanagedMemoryStream(addr, int64 length) :> Stream
new SafeUnmanagedMemoryStream(addr, int64 length, hold) :> Stream
override _.AsReadOnlyStream() =
new UnmanagedMemoryStream(addr, int64 length, int64 length, FileAccess.Read) :> Stream
new SafeUnmanagedMemoryStream(addr, int64 length, int64 length, FileAccess.Read, hold) :> Stream
[<Struct;NoEquality;NoComparison>]
type ReadOnlyByteMemory(bytes: ByteMemory) =
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册