diff --git a/crates/bindings-cpp/include/spacetimedb/internal/runtime_registration.h b/crates/bindings-cpp/include/spacetimedb/internal/runtime_registration.h index 4d84cb975d4..66d827616ff 100644 --- a/crates/bindings-cpp/include/spacetimedb/internal/runtime_registration.h +++ b/crates/bindings-cpp/include/spacetimedb/internal/runtime_registration.h @@ -1,9 +1,12 @@ #ifndef SPACETIMEDB_RUNTIME_REGISTRATION_H #define SPACETIMEDB_RUNTIME_REGISTRATION_H +#include #include #include #include +#include +#include #include #include "../abi/opaque_types.h" #include "autogen/Lifecycle.g.h" @@ -33,6 +36,18 @@ std::vector ConsumeBytes(BytesSource source); void SetMultiplePrimaryKeyError(const std::string& table_name); void SetConstraintRegistrationError(const std::string& code, const std::string& details); +template +__attribute__((noinline)) decltype(auto) __spacetimedb_begin_short_backtrace(F&& f) { + if constexpr (std::is_void_v>) { + std::forward(f)(); + std::atomic_signal_fence(std::memory_order_seq_cst); + } else { + decltype(auto) result = std::forward(f)(); + std::atomic_signal_fence(std::memory_order_seq_cst); + return result; + } +} + } // namespace Internal } // namespace SpacetimeDB diff --git a/crates/bindings-cpp/include/spacetimedb/internal/v10_builder.h b/crates/bindings-cpp/include/spacetimedb/internal/v10_builder.h index 9de0f0a2312..7cbecc097e7 100644 --- a/crates/bindings-cpp/include/spacetimedb/internal/v10_builder.h +++ b/crates/bindings-cpp/include/spacetimedb/internal/v10_builder.h @@ -337,7 +337,9 @@ class V10Builder { std::function handler; if constexpr (traits::arity == 1) { handler = [func](ReducerContext& ctx, BytesSource) { - auto result = func(ctx); + auto result = __spacetimedb_begin_short_backtrace([&] { + return func(ctx); + }); if (result.is_err()) { ::SpacetimeDB::fail_reducer(result.error()); } @@ -349,7 +351,9 @@ class V10Builder { bsatn::Reader reader(bytes.data(), bytes.size()); auto args = std::make_tuple(bsatn::deserialize>(reader)...); std::apply([&ctx_inner, fn](auto&&... unpacked) { - auto result = fn(ctx_inner, std::forward(unpacked)...); + auto result = __spacetimedb_begin_short_backtrace([&] { + return fn(ctx_inner, std::forward(unpacked)...); + }); if (result.is_err()) { ::SpacetimeDB::fail_reducer(result.error()); } @@ -406,7 +410,9 @@ class V10Builder { std::function handler; if constexpr (traits::arity == 1) { handler = [func](ReducerContext& ctx, BytesSource) { - auto result = func(ctx); + auto result = __spacetimedb_begin_short_backtrace([&] { + return func(ctx); + }); if (result.is_err()) { ::SpacetimeDB::fail_reducer(result.error()); } @@ -418,7 +424,9 @@ class V10Builder { bsatn::Reader reader(bytes.data(), bytes.size()); auto args = std::make_tuple(bsatn::deserialize>(reader)...); std::apply([&ctx_inner, fn](auto&&... unpacked) { - auto result = fn(ctx_inner, std::forward(unpacked)...); + auto result = __spacetimedb_begin_short_backtrace([&] { + return fn(ctx_inner, std::forward(unpacked)...); + }); if (result.is_err()) { ::SpacetimeDB::fail_reducer(result.error()); } @@ -461,7 +469,9 @@ class V10Builder { std::function(ViewContext&, BytesSource)> handler = [func](ViewContext& ctx, BytesSource args_source) -> std::vector { (void)args_source; - auto result = func(ctx); + auto result = __spacetimedb_begin_short_backtrace([&] { + return func(ctx); + }); auto result_vec = view_result_to_vec(std::move(result)); IterBuf buf = IterBuf::take(); { @@ -475,7 +485,9 @@ class V10Builder { std::function(AnonymousViewContext&, BytesSource)> handler = [func](AnonymousViewContext& ctx, BytesSource args_source) -> std::vector { (void)args_source; - auto result = func(ctx); + auto result = __spacetimedb_begin_short_backtrace([&] { + return func(ctx); + }); auto result_vec = view_result_to_vec(std::move(result)); IterBuf buf = IterBuf::take(); { @@ -525,7 +537,9 @@ class V10Builder { std::function(ProcedureContext&, BytesSource)> handler; if constexpr (traits::arity == 1) { handler = [func](ProcedureContext& ctx, BytesSource) -> std::vector { - auto result = func(ctx); + auto result = __spacetimedb_begin_short_backtrace([&] { + return func(ctx); + }); IterBuf buf = IterBuf::take(); { bsatn::Writer writer(buf.get()); @@ -539,9 +553,11 @@ class V10Builder { return [](std::index_sequence, Func fn, ProcedureContext& ctx_inner, const std::vector& bytes) -> std::vector { bsatn::Reader reader(bytes.data(), bytes.size()); auto args = std::make_tuple(bsatn::deserialize>(reader)...); - auto result = std::apply([&ctx_inner, fn](auto&&... unpacked) { - return fn(ctx_inner, std::forward(unpacked)...); - }, args); + auto result = __spacetimedb_begin_short_backtrace([&] { + return std::apply([&ctx_inner, fn](auto&&... unpacked) { + return fn(ctx_inner, std::forward(unpacked)...); + }, args); + }); IterBuf buf = IterBuf::take(); { bsatn::Writer writer(buf.get()); diff --git a/crates/bindings-cpp/include/spacetimedb/procedure_macros.h b/crates/bindings-cpp/include/spacetimedb/procedure_macros.h index 5c6728a9f5f..4ec02222f90 100644 --- a/crates/bindings-cpp/include/spacetimedb/procedure_macros.h +++ b/crates/bindings-cpp/include/spacetimedb/procedure_macros.h @@ -105,7 +105,8 @@ struct is_valid_procedure_return_type : std::integral_constant::value, \ @@ -120,4 +121,4 @@ struct is_valid_procedure_return_type : std::integral_constant> \ /* TODO: When parameters are supported, function definition becomes: */ \ /* return_type view_name(ctx_param, __VA_ARGS__) */ \ - return_type view_name(ctx_param) + /* noinline ensures this function appears as a named frame in backtraces */ \ + __attribute__((noinline)) return_type view_name(ctx_param) #define SPACETIMEDB_VIEW_NAMED(return_type, view_name, canonical_name, access_enum, ctx_param) \ static_assert(access_enum == SpacetimeDB::Internal::TableAccess::Public, \ @@ -130,4 +131,4 @@ struct is_valid_view_return_type> #view_name, view_name, is_public, param_names); \ SpacetimeDB::Module::RegisterExplicitFunctionName(#view_name, canonical_name); \ } \ - return_type view_name(ctx_param) + __attribute__((noinline)) return_type view_name(ctx_param) diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs index 3ce055b4bc7..2cbe19e808c 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs @@ -2053,6 +2053,14 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx ) { try @@ -2103,6 +2111,14 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx ) { try @@ -2147,6 +2163,14 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx ) { try @@ -2189,6 +2213,14 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx ) { try @@ -2231,6 +2263,14 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx ) { try @@ -2271,6 +2311,14 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx ) { try @@ -2312,6 +2360,14 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx ) { try @@ -2357,6 +2413,14 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx ) { try @@ -2402,6 +2466,14 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IAnonymousViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IAnonymousViewContext ctx ) { try @@ -2447,6 +2519,14 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IAnonymousViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IAnonymousViewContext ctx ) { try @@ -2492,6 +2572,14 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IAnonymousViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IAnonymousViewContext ctx ) { try @@ -2539,6 +2627,14 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IAnonymousViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IAnonymousViewContext ctx ) { try @@ -2981,7 +3077,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.__ReducerWithReservedPrefix((SpacetimeDB.ReducerContext)ctx); } @@ -3004,7 +3106,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { TestScheduleIssues.DummyScheduledReducer( (SpacetimeDB.ReducerContext)ctx, @@ -3028,7 +3136,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.OnReducerWithReservedPrefix((SpacetimeDB.ReducerContext)ctx); } @@ -3049,7 +3163,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => SpacetimeDB.Internal.Lifecycle.Init; - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.TestDuplicateReducerKind1((SpacetimeDB.ReducerContext)ctx); } @@ -3070,7 +3190,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => SpacetimeDB.Internal.Lifecycle.Init; - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.TestDuplicateReducerKind2((SpacetimeDB.ReducerContext)ctx); } @@ -3091,7 +3217,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.TestDuplicateReducerName((SpacetimeDB.ReducerContext)ctx); } @@ -3112,7 +3244,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.TestReducerReturnType((SpacetimeDB.ReducerContext)ctx); } @@ -3133,7 +3271,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { throw new System.InvalidOperationException(); } diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs index a9774bfc69e..3f7a744bf32 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs @@ -370,6 +370,14 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx ) { try @@ -477,7 +485,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.DemoReducer((SpacetimeDB.ReducerContext)ctx, valueRW.Read(reader)); } @@ -495,7 +509,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar Visibility: SpacetimeDB.Internal.FunctionVisibility.ClientCallable ); - public byte[] Invoke(BinaryReader reader, SpacetimeDB.Internal.IProcedureContext ctx) + public byte[] Invoke(BinaryReader reader, SpacetimeDB.Internal.IProcedureContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static byte[] __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IProcedureContext ctx) { Reducers.DemoProcedure((SpacetimeDB.ProcedureContext)ctx); return System.Array.Empty(); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs index 4632875e05f..24ab61d6a44 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs @@ -1725,6 +1725,14 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx ) { try @@ -1767,6 +1775,14 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx ) { try @@ -1814,6 +1830,14 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IAnonymousViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IAnonymousViewContext ctx ) { try @@ -2286,7 +2310,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => SpacetimeDB.Internal.Lifecycle.Init; - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Timers.Init((SpacetimeDB.ReducerContext)ctx); } @@ -2309,7 +2339,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.InsertData((SpacetimeDB.ReducerContext)ctx, dataRW.Read(reader)); } @@ -2332,7 +2368,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Test.NestingNamespaces.AndClasses.InsertData2( (SpacetimeDB.ReducerContext)ctx, @@ -2358,7 +2400,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { MultiTableRow.InsertMultiData((SpacetimeDB.ReducerContext)ctx, dataRW.Read(reader)); } @@ -2381,7 +2429,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.ScheduleImmediate((SpacetimeDB.ReducerContext)ctx, dataRW.Read(reader)); } @@ -2404,7 +2458,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Timers.SendScheduledMessage((SpacetimeDB.ReducerContext)ctx, argRW.Read(reader)); } diff --git a/crates/bindings-csharp/Codegen/Module.cs b/crates/bindings-csharp/Codegen/Module.cs index e778b6d69cc..415d403e9a0 100644 --- a/crates/bindings-csharp/Codegen/Module.cs +++ b/crates/bindings-csharp/Codegen/Module.cs @@ -1389,6 +1389,12 @@ sealed class {{{Name}}}ViewDispatcher : {{{interfaceName}}} { public byte[] Invoke( System.IO.BinaryReader reader, {{{interfaceContext}}} ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + {{{interfaceContext}}} ctx ) { try { {{{paramReads}}} @@ -1491,7 +1497,11 @@ class {{Identifier}}: SpacetimeDB.Internal.IReducer { _ => "null" }}}; - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { {{invocation}}; } } @@ -1713,7 +1723,11 @@ class {{{Identifier}}} : SpacetimeDB.Internal.IProcedure { Visibility: SpacetimeDB.Internal.FunctionVisibility.ClientCallable ); - public byte[] Invoke(BinaryReader reader, SpacetimeDB.Internal.IProcedureContext ctx) { + public byte[] Invoke(BinaryReader reader, SpacetimeDB.Internal.IProcedureContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] + private static byte[] __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IProcedureContext ctx) { {{{paramReads}}}{{{invokeBody}}} } } diff --git a/crates/bindings-csharp/Runtime/Internal/Module.cs b/crates/bindings-csharp/Runtime/Internal/Module.cs index 8dcf6cebb4e..145179829c1 100644 --- a/crates/bindings-csharp/Runtime/Internal/Module.cs +++ b/crates/bindings-csharp/Runtime/Internal/Module.cs @@ -469,6 +469,7 @@ BytesSink error } catch (Exception e) { + Log.Error($"Error while invoking reducer: {e}"); var error_str = e.Message ?? e.GetType().FullName; var error_bytes = System.Text.Encoding.UTF8.GetBytes(error_str); error.Write(error_bytes); diff --git a/crates/bindings/src/rt.rs b/crates/bindings/src/rt.rs index f64b46f7ec4..08330070887 100644 --- a/crates/bindings/src/rt.rs +++ b/crates/bindings/src/rt.rs @@ -628,7 +628,7 @@ macro_rules! impl_reducer_procedure_view { #[inline(always)] fn invoke(&self, ctx: &ReducerContext, args: ($($T,)*)) -> Result<(), Box> { let ($($T,)*) = args; - __rust_begin_short_backtrace(|| self(ctx, $($T),*).into_result()) + __spacetimedb_begin_short_backtrace(|| self(ctx, $($T),*).into_result()) } } @@ -642,7 +642,7 @@ macro_rules! impl_reducer_procedure_view { #[inline(always)] fn invoke(&self, ctx: &mut ProcedureContext, args: ($($T,)*)) -> Ret { let ($($T,)*) = args; - __rust_begin_short_backtrace(|| self(ctx, $($T),*)) + __spacetimedb_begin_short_backtrace(|| self(ctx, $($T),*)) } } @@ -658,7 +658,7 @@ macro_rules! impl_reducer_procedure_view { #[inline(always)] fn invoke(&self, ctx: &ViewContext, args: ($($T,)*)) -> Retn { let ($($T,)*) = args; - __rust_begin_short_backtrace(|| self(ctx, $($T),*)) + __spacetimedb_begin_short_backtrace(|| self(ctx, $($T),*)) } } @@ -674,7 +674,7 @@ macro_rules! impl_reducer_procedure_view { #[inline(always)] fn invoke(&self, ctx: &AnonymousViewContext, args: ($($T,)*)) -> Retn { let ($($T,)*) = args; - __rust_begin_short_backtrace(|| self(ctx, $($T),*)) + __spacetimedb_begin_short_backtrace(|| self(ctx, $($T),*)) } } }; @@ -1339,7 +1339,7 @@ pub trait ExplicitNames { // Used to tidy up the backtrace in `crates/core/src/host/wasmtime/wasmtime_instance_env.rs` #[inline(never)] -pub(crate) fn __rust_begin_short_backtrace(f: F) -> T +pub(crate) fn __spacetimedb_begin_short_backtrace(f: F) -> T where F: FnOnce() -> T, { diff --git a/crates/core/src/host/wasmtime/wasm_instance_env.rs b/crates/core/src/host/wasmtime/wasm_instance_env.rs index 00f42f34ae8..3b1838257f2 100644 --- a/crates/core/src/host/wasmtime/wasm_instance_env.rs +++ b/crates/core/src/host/wasmtime/wasm_instance_env.rs @@ -1980,8 +1980,13 @@ impl BacktraceProvider for wasmtime::StoreContext<'_, T> { impl ModuleBacktrace for wasmtime::WasmBacktrace { fn frames(&self) -> Box> + '_> { - let is_end_short_backtrace = |func_name: &str| func_name.contains("__rust_end_short_backtrace"); - let is_begin_short_backtrace = |func_name: &str| func_name.contains("__rust_begin_short_backtrace"); + let is_end_short_backtrace = |func_name: &str| { + func_name.contains("__spacetimedb_end_short_backtrace") || func_name.contains("__rust_end_short_backtrace") + }; + let is_begin_short_backtrace = |func_name: &str| { + func_name.contains("__spacetimedb_begin_short_backtrace") + || func_name.contains("__rust_begin_short_backtrace") + }; let frames = self.frames();