Skip to content

Commit

Permalink
fix(Native): cache long-lived native callbacks in C# to avoid random …
Browse files Browse the repository at this point in the history
…GC-related crashes
  • Loading branch information
lmichaelis committed Dec 24, 2023
1 parent 96834dd commit 05fa809
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 4 deletions.
13 changes: 10 additions & 3 deletions ZenKit/DaedalusVm.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using ZenKit.Daedalus;

namespace ZenKit
Expand Down Expand Up @@ -205,10 +206,12 @@ public void Call<TP0, TP1, TP2, TP3>(string name, TP0 p0, TP1 p1, TP2 p2, TP3 p3
Call(name);
}

private Native.Callbacks.ZkDaedalusVmExternalDefaultCallback? _externalDefaultCallback = null;

public void RegisterExternalDefault(ExternalDefaultFunction cb)
{
Native.ZkDaedalusVm_registerExternalDefault(Handle, (_0, _1, sym) => cb(this, new DaedalusSymbol(sym)),
UIntPtr.Zero);
_externalDefaultCallback = (_0, _1, sym) => cb(this, new DaedalusSymbol(sym));
Native.ZkDaedalusVm_registerExternalDefault(Handle, _externalDefaultCallback, UIntPtr.Zero);
}

public void RegisterExternal<TR>(string name, ExternalFunc<TR> cb)
Expand Down Expand Up @@ -381,10 +384,14 @@ private void RegisterExternalUnsafe(string name, ExternalFunc cb)
RegisterExternalUnsafe(sym, cb);
}

private List<Native.Callbacks.ZkDaedalusVmExternalCallback> _externalCallbacks = new List<Native.Callbacks.ZkDaedalusVmExternalCallback>();

private void RegisterExternalUnsafe(DaedalusSymbol sym, ExternalFunc cb)
{
Native.ZkDaedalusVm_registerExternal(Handle, sym.Handle, (_0, _1) => cb(), UIntPtr.Zero);
Native.Callbacks.ZkDaedalusVmExternalCallback handle = (_0, _1) => cb();
_externalCallbacks.Add(handle);

Native.ZkDaedalusVm_registerExternal(Handle, sym.Handle, handle, UIntPtr.Zero);
}

private delegate void ExternalFunc();
Expand Down
6 changes: 5 additions & 1 deletion ZenKit/Logger.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;

namespace ZenKit
{
Expand All @@ -14,10 +15,13 @@ public enum LogLevel : uint
public static class Logger
{
public delegate void Callback(LogLevel level, string name, string message);
private static List<Native.Callbacks.ZkLogger> _callbacks = new List<Native.Callbacks.ZkLogger>();

public static void Set(LogLevel lvl, Callback callback)
{
Native.ZkLogger_set(lvl, (_, level, name, message) => callback(level, name, message), UIntPtr.Zero);
Native.Callbacks.ZkLogger cb = (_, level, name, message) => callback(level, name, message);
_callbacks.Add(cb);
Native.ZkLogger_set(lvl, cb, UIntPtr.Zero);
}

public static void SetDefault(LogLevel level)
Expand Down

0 comments on commit 05fa809

Please sign in to comment.