fix GC killing rcheevo callbacks

This commit is contained in:
CasualPokePlayer 2023-01-27 02:47:05 -08:00
parent c4f2bed9fd
commit cf0ce0f5bb
2 changed files with 12 additions and 4 deletions

View File

@ -53,7 +53,7 @@ namespace BizHawk.Client.EmuHawk
{
if (RichPresenceActive)
{
var len = _lib.rc_runtime_get_richpresence(ref _runtime, _richPresenceBuffer, _richPresenceBuffer.Length, PeekCallback, IntPtr.Zero, IntPtr.Zero);
var len = _lib.rc_runtime_get_richpresence(ref _runtime, _richPresenceBuffer, _richPresenceBuffer.Length, _peekcb, IntPtr.Zero, IntPtr.Zero);
CurrentRichPresence = Encoding.UTF8.GetString(_richPresenceBuffer, 0, len);
}
else

View File

@ -25,6 +25,9 @@ namespace BizHawk.Client.EmuHawk
private LibRCheevos.rc_runtime_t _runtime;
private readonly LibRCheevos.rc_runtime_event_handler_t _eventcb;
private readonly LibRCheevos.rc_peek_t _peekcb;
private readonly Dictionary<int, (ReadMemoryFunc Func, int Start)> _readMap = new();
private ToolStripMenuItem _hardcoreModeMenuItem;
@ -195,6 +198,9 @@ namespace BizHawk.Client.EmuHawk
Login();
InitLoginDone.WaitOne();
_eventcb = EventHandlerCallback;
_peekcb = PeekCallback;
var config = _getConfig();
CheevosActive = config.RACheevosActive;
LBoardsActive = config.RALBoardsActive;
@ -385,7 +391,9 @@ namespace BizHawk.Client.EmuHawk
}
// validate addresses now that we have cheevos init
_lib.rc_runtime_validate_addresses(ref _runtime, EventHandlerCallback, address => _readMap.ContainsKey(address));
// ReSharper disable once ConvertToLocalFunction
LibRCheevos.rc_runtime_validate_address_t peekcb = address => _readMap.ContainsKey(address);
_lib.rc_runtime_validate_addresses(ref _runtime, _eventcb, peekcb);
_gameInfoForm.Restart(_gameData.Title, _gameData.TotalCheevoPoints(HardcoreMode), CurrentRichPresence ?? "N/A");
_cheevoListForm.Restart(_gameData.GameID == 0 ? Array.Empty<Cheevo>() : _gameData.CheevoEnumerable, GetCheevoProgress);
@ -600,12 +608,12 @@ namespace BizHawk.Client.EmuHawk
// we want to EnterExit to prevent wbx host spam when peeks are spammed
using (Domains.MainMemory.EnterExit())
{
_lib.rc_runtime_do_frame(ref _runtime, EventHandlerCallback, PeekCallback, IntPtr.Zero, IntPtr.Zero);
_lib.rc_runtime_do_frame(ref _runtime, _eventcb, _peekcb, IntPtr.Zero, IntPtr.Zero);
}
}
else
{
_lib.rc_runtime_do_frame(ref _runtime, EventHandlerCallback, PeekCallback, IntPtr.Zero, IntPtr.Zero);
_lib.rc_runtime_do_frame(ref _runtime, _eventcb, _peekcb, IntPtr.Zero, IntPtr.Zero);
}
if (_gameInfoForm.IsShown)