diff --git a/src/dotnet/design/Mil/Navy/Nrl/Norm/NormApi.puml b/src/dotnet/design/Mil/Navy/Nrl/Norm/NormApi.puml index 1be3b84..1cdc009 100644 --- a/src/dotnet/design/Mil/Navy/Nrl/Norm/NormApi.puml +++ b/src/dotnet/design/Mil/Navy/Nrl/Norm/NormApi.puml @@ -56,7 +56,7 @@ class NormApi <> { + {static} <> NormRequeueObject(sessionHandle:long, objectHandle:long) : bool + {static} <> NormStreamOpen(sessionHandle:long, bufferSize:long, infoPtr:nint, infoLen:int) : long + {static} <> NormStreamClose(streamHandle:long, graceful:bool) : void - <> {static} <> NormStreamWrite(streamHandle:long, buffer:nint, numBytes:int) : int + + <> {static} <> NormStreamWrite(streamHandle:long, buffer:byte*, numBytes:int) : int + {static} <> NormStreamFlush(streamHandle:long, eom:bool, flushMode:NormFlushMode) : void + {static} <> NormStreamSetAutoFlush(streamHandle:long, flushMode:NormFlushMode) : void + {static} <> NormStreamSetPushEnable(streamHandle:long, pushEnable:bool) : void @@ -85,7 +85,7 @@ class NormApi <> { + {static} <> NormNodeSetRepairBoundary(remoteSender:long, repairBoundary:NormRepairBoundary) : void + {static} <> NormSetDefaultRxRobustFactor(sessionHandle:long, robustFactor:int) : void + {static} <> NormNodeSetRxRobustFactor(remoteSender:long, robustFactor:int) : void - + {static} <> NormStreamRead(streamHandle:long, buffer:nint, numBytes:int) : bool + + <> {static} <> NormStreamRead(streamHandle:long, buffer:byte*, numBytes:int) : bool + {static} <> NormStreamSeekMsgStart(streamHandle:long) : bool + {static} <> NormStreamGetReadOffset(streamHandle:long) : long + {static} <> NormObjectGetType(objectHandle:long) : NormObjectType diff --git a/src/dotnet/src/Mil.Navy.Nrl.Norm/NormApi.cs b/src/dotnet/src/Mil.Navy.Nrl.Norm/NormApi.cs index 876941f..ab63936 100644 --- a/src/dotnet/src/Mil.Navy.Nrl.Norm/NormApi.cs +++ b/src/dotnet/src/Mil.Navy.Nrl.Norm/NormApi.cs @@ -591,7 +591,7 @@ namespace Mil.Navy.Nrl.Norm /// The numBytes parameter indicates the length of the data content. /// This function returns the number of bytes of data successfully enqueued for NORM stream transmission. [DllImport(NORM_LIBRARY)] - internal static extern int NormStreamWrite(long streamHandle, nint buffer, int numBytes); + public unsafe static extern int NormStreamWrite(long streamHandle, byte* buffer, int numBytes); /// /// This function causes an immediate "flush" of the transmit stream specified by the streamHandle parameter. @@ -895,7 +895,7 @@ namespace Mil.Navy.Nrl.Norm /// This function normally returns a value of true. However, if a break in the integrity of the reliable received stream /// occurs(or the stream has been ended by the sender), a value of false is returned to indicate the break. [DllImport(NORM_LIBRARY)] - public static extern bool NormStreamRead(long streamHandle, nint buffer, ref int numBytes); + public unsafe static extern bool NormStreamRead(long streamHandle, byte* buffer, ref int numBytes); /// /// This function advances the read offset of the receive stream referenced by the streamHandle parameter to align diff --git a/src/dotnet/src/Mil.Navy.Nrl.Norm/NormStream.cs b/src/dotnet/src/Mil.Navy.Nrl.Norm/NormStream.cs index c6b39d1..a0eb365 100644 --- a/src/dotnet/src/Mil.Navy.Nrl.Norm/NormStream.cs +++ b/src/dotnet/src/Mil.Navy.Nrl.Norm/NormStream.cs @@ -59,16 +59,12 @@ namespace Mil.Navy.Nrl.Norm } int numBytes; - var bufferHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned); - - try + unsafe { - var bufferPtr = bufferHandle.AddrOfPinnedObject() + offset; - numBytes = NormStreamWrite(_handle, bufferPtr, length); - } - finally - { - bufferHandle.Free(); + fixed (byte* bufferPtr = buffer) + { + numBytes = NormStreamWrite(_handle, bufferPtr + offset, length); + } } return numBytes; @@ -158,20 +154,16 @@ namespace Mil.Navy.Nrl.Norm throw new ArgumentOutOfRangeException(nameof(length), "The length is out of range"); } - var bufferHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned); - - try + unsafe { - var bufferPtr = bufferHandle.AddrOfPinnedObject() + offset; - if (!NormStreamRead(_handle, bufferPtr, ref length)) + fixed (byte* bufferPtr = buffer) { - length = -1; + if (!NormStreamRead(_handle, bufferPtr + offset, ref length)) + { + length = -1; + } } } - finally - { - bufferHandle.Free(); - } return length; }