Skip to content

Commit

Permalink
Use the default marshalling for strings
Browse files Browse the repository at this point in the history
  • Loading branch information
mgnsm committed Apr 6, 2023
1 parent b873ab4 commit 95e9bf5
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 130 deletions.
12 changes: 12 additions & 0 deletions Source/Millistream.Streaming/Interop/NativeImplementation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,22 +30,27 @@ unsafe internal sealed class NativeImplementation
internal readonly delegate* unmanaged[Cdecl]<IntPtr, int> mdf_message_del;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, ulong, int, int> mdf_message_add;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, uint, IntPtr, int> mdf_message_add_numeric;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, uint, string, int> mdf_message_add_numeric_str;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, uint, long, int, int> mdf_message_add_int;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, uint, ulong, int, int> mdf_message_add_uint;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, uint, IntPtr, int> mdf_message_add_string;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, uint, IntPtr, int, int> mdf_message_add_string2;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, uint, IntPtr, int> mdf_message_add_date;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, uint, string, int> mdf_message_add_date_str;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, uint, int, int, int, int> mdf_message_add_date2;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, uint, IntPtr, int> mdf_message_add_time;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, uint, string, int> mdf_message_add_time_str;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, uint, int, int, int, int, int> mdf_message_add_time2;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, uint, int, int, int, int, int> mdf_message_add_time3;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, uint, IntPtr, int> mdf_message_add_list;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, uint, string, int> mdf_message_add_list_str;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, IntPtr, int> mdf_message_send;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, int> mdf_message_get_num;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, int> mdf_message_get_num_active;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, IntPtr, ulong, ulong, int> mdf_message_move;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, ref IntPtr, int> mdf_message_serialize;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, IntPtr, int> mdf_message_deserialize;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, string, int> mdf_message_deserialize_str;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, MDF_MSG_OPTION, int, int> mdf_message_set_property;
internal readonly delegate* unmanaged[Cdecl]<IntPtr, int> mdf_message_get_num_fields;
// Removed in libmdf-1.0.26:
Expand Down Expand Up @@ -101,10 +106,14 @@ internal NativeImplementation(string libraryPath)
mdf_message_del = (delegate* unmanaged[Cdecl]<IntPtr, int>)nativeLibrary.GetExport(lib, nameof(mdf_message_del));
mdf_message_add = (delegate* unmanaged[Cdecl]<IntPtr, ulong, int, int>)nativeLibrary.GetExport(lib, nameof(mdf_message_add));
mdf_message_add_numeric = (delegate* unmanaged[Cdecl]<IntPtr, uint, IntPtr, int>)nativeLibrary.GetExport(lib, nameof(mdf_message_add_numeric));
mdf_message_add_numeric_str = (delegate* unmanaged[Cdecl]<IntPtr, uint, string, int>)nativeLibrary.GetExport(lib, nameof(mdf_message_add_numeric));
mdf_message_add_string = (delegate* unmanaged[Cdecl]<IntPtr, uint, IntPtr, int>)nativeLibrary.GetExport(lib, nameof(mdf_message_add_string));
mdf_message_add_date = (delegate* unmanaged[Cdecl]<IntPtr, uint, IntPtr, int>)nativeLibrary.GetExport(lib, nameof(mdf_message_add_date));
mdf_message_add_date_str = (delegate* unmanaged[Cdecl]<IntPtr, uint, string, int>)nativeLibrary.GetExport(lib, nameof(mdf_message_add_date));
mdf_message_add_time = (delegate* unmanaged[Cdecl]<IntPtr, uint, IntPtr, int>)nativeLibrary.GetExport(lib, nameof(mdf_message_add_time));
mdf_message_add_time_str = (delegate* unmanaged[Cdecl]<IntPtr, uint, string, int>)nativeLibrary.GetExport(lib, nameof(mdf_message_add_time));
mdf_message_add_list = (delegate* unmanaged[Cdecl]<IntPtr, uint, IntPtr, int>)nativeLibrary.GetExport(lib, nameof(mdf_message_add_list));
mdf_message_add_list_str = (delegate* unmanaged[Cdecl]<IntPtr, uint, string, int>)nativeLibrary.GetExport(lib, nameof(mdf_message_add_list));
mdf_message_send = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, int>)nativeLibrary.GetExport(lib, nameof(mdf_message_send));
mdf_message_get_num = (delegate* unmanaged[Cdecl]<IntPtr, int>)nativeLibrary.GetExport(lib, nameof(mdf_message_get_num));
mdf_message_get_num_active = (delegate* unmanaged[Cdecl]<IntPtr, int>)nativeLibrary.GetExport(lib, nameof(mdf_message_get_num_active));
Expand Down Expand Up @@ -132,7 +141,10 @@ internal NativeImplementation(string libraryPath)
if (nativeLibrary.TryGetExport(lib, nameof(mdf_message_serialize), out address))
mdf_message_serialize = (delegate* unmanaged[Cdecl]<IntPtr, ref IntPtr, int>)address;
if (nativeLibrary.TryGetExport(lib, nameof(mdf_message_deserialize), out address))
{
mdf_message_deserialize = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, int>)address;
mdf_message_deserialize_str = (delegate* unmanaged[Cdecl]<IntPtr, string, int>)address;
}
if (nativeLibrary.TryGetExport(lib, nameof(mdf_message_set_property), out address))
mdf_message_set_property = (delegate* unmanaged[Cdecl]<IntPtr, MDF_MSG_OPTION, int, int>)address;
if (nativeLibrary.TryGetExport(lib, nameof(mdf_message_get_num_fields), out address))
Expand Down
108 changes: 5 additions & 103 deletions Source/Millistream.Streaming/Message.cs
Original file line number Diff line number Diff line change
Expand Up @@ -212,24 +212,7 @@ public bool Add(ulong insref, MessageReference mref) =>
public bool AddNumeric(uint tag, string value)
{
ThrowIfDisposed();
if (value == null)
return _nativeImplementation.mdf_message_add_numeric(Handle, tag, IntPtr.Zero) == 1;

byte[] bytes = ArrayPool<byte>.Shared.Rent(value.Length + 1);
try
{
fixed (byte* b = bytes)
{
if (!TryGetAsciiBytes(value, b))
return false;
b[value.Length] = 0;
return _nativeImplementation.mdf_message_add_numeric(Handle, tag, (IntPtr)b) == 1;
}
}
finally
{
ArrayPool<byte>.Shared.Return(bytes);
}
return _nativeImplementation.mdf_message_add_numeric_str(Handle, tag, value) == 1;
}

/// <summary>
Expand Down Expand Up @@ -409,24 +392,7 @@ public bool AddString(Field tag, string value, int length) =>
public bool AddDate(uint tag, string value)
{
ThrowIfDisposed();
if (value == null)
return _nativeImplementation.mdf_message_add_date(Handle, tag, IntPtr.Zero) == 1;

byte[] bytes = ArrayPool<byte>.Shared.Rent(value.Length + 1);
try
{
fixed (byte* b = bytes)
{
if (!TryGetAsciiBytes(value, b))
return false;
b[value.Length] = 0;
return _nativeImplementation.mdf_message_add_date(Handle, tag, (IntPtr)b) == 1;
}
}
finally
{
ArrayPool<byte>.Shared.Return(bytes);
}
return _nativeImplementation.mdf_message_add_date_str(Handle, tag, value) == 1;
}

/// <summary>
Expand Down Expand Up @@ -483,24 +449,7 @@ public bool AddDate(Field tag, int year, int month, int day) =>
public bool AddTime(uint tag, string value)
{
ThrowIfDisposed();
if (string.IsNullOrEmpty(value))
return false;

byte[] bytes = ArrayPool<byte>.Shared.Rent(value.Length + 1);
try
{
fixed (byte* b = bytes)
{
if (!TryGetAsciiBytes(value, b))
return false;
b[value.Length] = 0;
return _nativeImplementation.mdf_message_add_time(Handle, tag, (IntPtr)b) == 1;
}
}
finally
{
ArrayPool<byte>.Shared.Return(bytes);
}
return _nativeImplementation.mdf_message_add_time_str(Handle, tag, value) == 1;
}

/// <summary>
Expand Down Expand Up @@ -597,25 +546,7 @@ public bool AddTime3(Field tag, int hour, int minute, int second, int nanosecond
public bool AddList(uint tag, string value)
{
ThrowIfDisposed();
if (value == null)
return _nativeImplementation.mdf_message_add_list(Handle, tag, IntPtr.Zero) == 1;

byte[] bytes = ArrayPool<byte>.Shared.Rent(value.Length + 1);
try
{
fixed (byte* b = bytes)
{
if (!TryGetAsciiBytes(value, b))
return false;
b[value.Length] = 0;
return _nativeImplementation.mdf_message_add_list(Handle, tag, (IntPtr)b) == 1;

}
}
finally
{
ArrayPool<byte>.Shared.Return(bytes);
}
return _nativeImplementation.mdf_message_add_list_str(Handle, tag, value) == 1;
}

/// <summary>
Expand Down Expand Up @@ -710,23 +641,7 @@ public bool Deserialize(string data)

ThrowIfDisposed();
ThrowIfNativeFunctionIsMissing(_nativeImplementation.mdf_message_deserialize, nameof(_nativeImplementation.mdf_message_deserialize));

byte[] bytes = ArrayPool<byte>.Shared.Rent(data.Length + 1);
try
{
fixed (byte* b = bytes)
{
if (!TryGetAsciiBytes(data, b))
return false;
b[data.Length] = 0;
return _nativeImplementation.mdf_message_deserialize(Handle, (IntPtr)b) == 1;

}
}
finally
{
ArrayPool<byte>.Shared.Return(bytes);
}
return _nativeImplementation.mdf_message_deserialize_str(Handle, data) == 1;
}

/// <summary>
Expand Down Expand Up @@ -770,18 +685,5 @@ private void ThrowIfDisposed()
if (_isDisposed)
throw new ObjectDisposedException(typeof(Message).FullName);
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static bool TryGetAsciiBytes(string value, byte* bytes)
{
for (int i = 0; i < value.Length; ++i)
{
char c = value[i];
if (c > 127)
return false;
bytes[i] = (byte)c;
}
return true;
}
}
}
Loading

0 comments on commit 95e9bf5

Please sign in to comment.