Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NFC: simplify C# FFI definitions #2149

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -1149,7 +1149,7 @@ public static void __describe_module__(SpacetimeDB.Internal.BytesSink d) =>

[UnmanagedCallersOnly(EntryPoint = "__call_reducer__")]
public static SpacetimeDB.Internal.Errno __call_reducer__(
uint id,
int id,
ulong sender_0,
ulong sender_1,
ulong sender_2,
Expand Down
2 changes: 1 addition & 1 deletion crates/bindings-csharp/Codegen/Module.cs
Original file line number Diff line number Diff line change
Expand Up @@ -876,7 +876,7 @@ public static void Main() {

[UnmanagedCallersOnly(EntryPoint = "__call_reducer__")]
public static SpacetimeDB.Internal.Errno __call_reducer__(
uint id,
int id,
ulong sender_0,
ulong sender_1,
ulong sender_2,
Expand Down
56 changes: 28 additions & 28 deletions crates/bindings-csharp/Runtime/Internal/FFI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -128,15 +128,15 @@ public readonly record struct RowIter(uint Handle)

[LibraryImport(StdbNamespace)]
public static partial CheckedStatus table_id_from_name(
[In] byte[] name,
uint name_len,
ReadOnlySpan<byte> name,
int name_len,
out TableId out_
);

[LibraryImport(StdbNamespace)]
public static partial CheckedStatus index_id_from_name(
[In] byte[] name,
uint name_len,
ReadOnlySpan<byte> name,
int name_len,
out IndexId out_
);

Expand All @@ -153,20 +153,20 @@ out RowIter out_
public static partial CheckedStatus datastore_btree_scan_bsatn(
IndexId index_id,
ReadOnlySpan<byte> prefix,
uint prefix_len,
int prefix_len,
ColId prefix_elems,
ReadOnlySpan<byte> rstart,
uint rstart_len,
int rstart_len,
ReadOnlySpan<byte> rend,
uint rend_len,
int rend_len,
out RowIter out_
);

[LibraryImport(StdbNamespace)]
public static partial Errno row_iter_bsatn_advance(
RowIter iter_handle,
[MarshalUsing(CountElementName = nameof(buffer_len))] [Out] byte[] buffer,
ref uint buffer_len
Span<byte> buffer,
ref int buffer_len
);

[LibraryImport(StdbNamespace)]
Expand All @@ -176,42 +176,42 @@ ref uint buffer_len
public static partial CheckedStatus datastore_insert_bsatn(
TableId table_id,
Span<byte> row,
ref uint row_len
ref int row_len
);

[LibraryImport(StdbNamespace)]
public static partial CheckedStatus datastore_delete_by_btree_scan_bsatn(
IndexId index_id,
ReadOnlySpan<byte> prefix,
uint prefix_len,
int prefix_len,
ColId prefix_elems,
ReadOnlySpan<byte> rstart,
uint rstart_len,
int rstart_len,
ReadOnlySpan<byte> rend,
uint rend_len,
int rend_len,
out uint out_
);

[LibraryImport(StdbNamespace)]
public static partial CheckedStatus datastore_delete_all_by_eq_bsatn(
TableId table_id,
[In] byte[] relation,
uint relation_len,
ReadOnlySpan<byte> relation,
int relation_len,
out uint out_
);

[LibraryImport(StdbNamespace)]
public static partial Errno bytes_source_read(
BytesSource source,
Span<byte> buffer,
ref uint buffer_len
ref int buffer_len
);

[LibraryImport(StdbNamespace)]
public static partial CheckedStatus bytes_sink_write(
BytesSink sink,
ReadOnlySpan<byte> buffer,
ref uint buffer_len
ref int buffer_len
);

public enum LogLevel : byte
Expand All @@ -227,13 +227,13 @@ public enum LogLevel : byte
[LibraryImport(StdbNamespace)]
public static partial void console_log(
LogLevel level,
[In] byte[] target,
uint target_len,
[In] byte[] filename,
uint filename_len,
ReadOnlySpan<byte> target,
int target_len,
ReadOnlySpan<byte> filename,
int filename_len,
uint line_number,
[In] byte[] message,
uint message_len
ReadOnlySpan<byte> message,
int message_len
);

[NativeMarshalling(typeof(ConsoleTimerIdMarshaller))]
Expand Down Expand Up @@ -262,17 +262,17 @@ internal static class ConsoleTimerIdMarshaller
}

[LibraryImport(StdbNamespace)]
public static partial ConsoleTimerId console_timer_start([In] byte[] name, uint name_len);
public static partial ConsoleTimerId console_timer_start(ReadOnlySpan<byte> name, int name_len);

[LibraryImport(StdbNamespace)]
public static partial CheckedStatus console_timer_end(ConsoleTimerId stopwatch_id);

[LibraryImport(StdbNamespace)]
public static partial void volatile_nonatomic_schedule_immediate(
[In] byte[] name,
uint name_len,
[In] byte[] args,
uint args_len
ReadOnlySpan<byte> name,
int name_len,
ReadOnlySpan<byte> args,
int args_len
);

// Note #1: our Identity type has the same layout as a fixed-size 32-byte little-endian buffer,
Expand Down
14 changes: 7 additions & 7 deletions crates/bindings-csharp/Runtime/Internal/IIndex.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public abstract class IndexBase<Row>
public IndexBase(string name)
{
var name_bytes = System.Text.Encoding.UTF8.GetBytes(name);
FFI.index_id_from_name(name_bytes, (uint)name_bytes.Length, out indexId);
FFI.index_id_from_name(name_bytes, name_bytes.Length, out indexId);
}

private static void ToParams<Bounds>(
Expand Down Expand Up @@ -50,12 +50,12 @@ protected uint DoDelete<Bounds>(Bounds bounds)
FFI.datastore_delete_by_btree_scan_bsatn(
indexId,
prefix,
(uint)prefix.Length,
prefix.Length,
prefixElems,
rstart,
(uint)rstart.Length,
rstart.Length,
rend,
(uint)rend.Length,
rend.Length,
out var out_
);
return out_;
Expand All @@ -70,12 +70,12 @@ protected override void IterStart(out FFI.RowIter handle)
FFI.datastore_btree_scan_bsatn(
indexId,
prefix,
(uint)prefix.Length,
prefix.Length,
prefixElems,
rstart,
(uint)rstart.Length,
rstart.Length,
rend,
(uint)rend.Length,
rend.Length,
out handle
);
}
Expand Down
4 changes: 2 additions & 2 deletions crates/bindings-csharp/Runtime/Internal/IReducer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ public static void VolatileNonatomicScheduleImmediate(string name, MemoryStream

FFI.volatile_nonatomic_schedule_immediate(
name_bytes,
(uint)name_bytes.Length,
name_bytes.Length,
args_bytes,
(uint)args_bytes.Length
args_bytes.Length
);
}
}
11 changes: 5 additions & 6 deletions crates/bindings-csharp/Runtime/Internal/ITable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,9 @@ public bool MoveNext()
return false;
}

uint buffer_len;
while (true)
{
buffer_len = (uint)buffer.Length;
var buffer_len = buffer.Length;
var ret = FFI.row_iter_bsatn_advance(handle, buffer, ref buffer_len);
if (ret == Errno.EXHAUSTED)
{
Expand Down Expand Up @@ -116,7 +115,7 @@ protected override void IterStart(out FFI.RowIter handle) =>
new(() =>
{
var name_bytes = System.Text.Encoding.UTF8.GetBytes(tableName);
FFI.table_id_from_name(name_bytes, (uint)name_bytes.Length, out var out_);
FFI.table_id_from_name(name_bytes, name_bytes.Length, out var out_);
return out_;
});

Expand All @@ -142,19 +141,19 @@ protected static T DoInsert(T row)
{
// Insert the row.
var bytes = IStructuralReadWrite.ToBytes(row);
var bytes_len = (uint)bytes.Length;
var bytes_len = bytes.Length;
FFI.datastore_insert_bsatn(tableId, bytes, ref bytes_len);

// Write back any generated column values.
using var stream = new MemoryStream(bytes, 0, (int)bytes_len);
using var stream = new MemoryStream(bytes, 0, bytes_len);
using var reader = new BinaryReader(stream);
return View.ReadGenFields(reader, row);
}

protected static bool DoDelete(T row)
{
var bytes = IStructuralReadWrite.ToBytes(row);
FFI.datastore_delete_all_by_eq_bsatn(tableId, bytes, (uint)bytes.Length, out var out_);
FFI.datastore_delete_all_by_eq_bsatn(tableId, bytes, bytes.Length, out var out_);
return out_ > 0;
}

Expand Down
28 changes: 12 additions & 16 deletions crates/bindings-csharp/Runtime/Internal/Module.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,12 +102,12 @@ private static byte[] Consume(this BytesSource source)
return [];
}
var buffer = new byte[0x20_000];
var written = 0U;
var written = 0;
while (true)
{
// Write into the spare capacity of the buffer.
var spare = buffer.AsSpan((int)written);
var buf_len = (uint)spare.Length;
var spare = buffer.AsSpan(written);
var buf_len = spare.Length;
var ret = FFI.bytes_source_read(source, spare, ref buf_len);
written += buf_len;
switch (ret)
Expand Down Expand Up @@ -135,15 +135,13 @@ private static byte[] Consume(this BytesSource source)
}
}

private static void Write(this BytesSink sink, byte[] bytes)
private static void Write(this BytesSink sink, Span<byte> bytes)
{
var start = 0U;
while (start != bytes.Length)
while (!bytes.IsEmpty)
{
var written = (uint)bytes.Length;
var buffer = bytes.AsSpan((int)start);
FFI.bytes_sink_write(sink, buffer, ref written);
start += written;
var written = bytes.Length;
FFI.bytes_sink_write(sink, bytes, ref written);
bytes = bytes[written..];
}
}

Expand All @@ -165,7 +163,7 @@ public static void __describe_module__(BytesSink description)
}

public static Errno __call_reducer__(
uint id,
int id,
ulong sender_0,
ulong sender_1,
ulong sender_2,
Expand All @@ -180,19 +178,17 @@ BytesSink error
try
{
var senderIdentity = Identity.From(
MemoryMarshal.AsBytes([sender_0, sender_1, sender_2, sender_3]).ToArray()
);
var senderAddress = Address.From(
MemoryMarshal.AsBytes([address_0, address_1]).ToArray()
MemoryMarshal.AsBytes([sender_0, sender_1, sender_2, sender_3])
);
var senderAddress = Address.From(MemoryMarshal.AsBytes([address_0, address_1]));
var random = new Random((int)timestamp.MicrosecondsSinceEpoch);
var time = timestamp.ToStd();

var ctx = newContext!(senderIdentity, senderAddress, random, time);

using var stream = new MemoryStream(args.Consume());
using var reader = new BinaryReader(stream);
reducers[(int)id].Invoke(reader, ctx);
reducers[id].Invoke(reader, ctx);
if (stream.Position != stream.Length)
{
throw new Exception("Unrecognised extra bytes in the reducer arguments");
Expand Down
6 changes: 3 additions & 3 deletions crates/bindings-csharp/Runtime/Log.cs
Original file line number Diff line number Diff line change
Expand Up @@ -168,12 +168,12 @@ uint lineNumber
FFI.console_log(
level,
target_bytes,
(uint)target_bytes.Length,
target_bytes.Length,
filename_bytes,
(uint)filename_bytes.Length,
filename_bytes.Length,
lineNumber,
text_bytes,
(uint)text_bytes.Length
text_bytes.Length
);
}
}
2 changes: 1 addition & 1 deletion crates/bindings-csharp/Runtime/LogStopwatch.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public sealed class LogStopwatch : IDisposable
public LogStopwatch(string name)
{
var name_bytes = Encoding.UTF8.GetBytes(name);
StopwatchId = FFI.console_timer_start(name_bytes, (uint)name_bytes.Length);
StopwatchId = FFI.console_timer_start(name_bytes, name_bytes.Length);
}

void IDisposable.Dispose()
Expand Down