Skip to content

Commit

Permalink
Caller allocated buffer
Browse files Browse the repository at this point in the history
  • Loading branch information
ThadHouse committed Jan 24, 2024
1 parent 15e8607 commit 6e3f017
Showing 1 changed file with 10 additions and 6 deletions.
16 changes: 10 additions & 6 deletions src/ntcore/Natives/RefNetworkTableValueMarshaller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.Marshalling;
using System.Text;
using WPIUtil;
using WPIUtil.Marshal;

namespace NetworkTables.Natives;

[CustomMarshaller(typeof(RefNetworkTableValue), MarshalMode.ManagedToUnmanagedIn, typeof(RefNetworkTableValueMarshaller))]
public unsafe ref struct RefNetworkTableValueMarshaller
{
public static int BufferSize => 256;
private ref byte m_toPin;

private ref byte* m_toAssignPin;
Expand All @@ -19,7 +19,7 @@ public unsafe ref struct RefNetworkTableValueMarshaller

private NetworkTableValueMarshaller.NativeNetworkTableValue m_nativeValue;

public void FromManaged(in RefNetworkTableValue managed)
public void FromManaged(in RefNetworkTableValue managed, Span<byte> callerAllocatedBuffer)
{
m_nativeValue.type = managed.Type;
m_nativeValue.lastChange = managed.Time;
Expand Down Expand Up @@ -64,12 +64,16 @@ public void FromManaged(in RefNetworkTableValue managed)
m_doAssignment = true;
break;
case NetworkTableType.BooleanArray:
int[] boolArrayData = new int[managed.m_boolSpan.Length];
for (int i = 0; i < boolArrayData.Length; i++)
Span<int> boolArraySpan = MemoryMarshal.Cast<byte, int>(callerAllocatedBuffer);
if (boolArraySpan.Length < managed.m_boolSpan.Length)
{
boolArrayData[i] = managed.m_boolSpan[i] ? 1 : 0;
boolArraySpan = new int[managed.m_boolSpan.Length];
}
m_toPin = MemoryMarshal.AsBytes(boolArrayData.AsSpan()).GetPinnableReference();
for (int i = 0; i < boolArraySpan.Length; i++)
{
boolArraySpan[i] = managed.m_boolSpan[i] ? 1 : 0;
}
m_toPin = MemoryMarshal.AsBytes(boolArraySpan).GetPinnableReference();
m_toAssignPin = (byte*)m_nativeValue.data.arrBoolean.arr;
m_nativeValue.data.arrBoolean.size = (nuint)managed.m_boolSpan.Length;
m_doAssignment = true;
Expand Down

0 comments on commit 6e3f017

Please sign in to comment.