Make crashhandler somewhat more stable, support multi boxing maybe?

This commit is contained in:
Ottermandias 2024-03-21 20:27:55 +01:00
parent c55d6966cd
commit f3ceb9034e
8 changed files with 105 additions and 61 deletions

View file

@ -88,18 +88,18 @@ internal sealed class AnimationInvocationBuffer : MemoryMappedBuffer, IAnimation
}
}
public static IBufferReader CreateReader()
=> new AnimationInvocationBuffer(false);
public static IBufferReader CreateReader(int pid)
=> new AnimationInvocationBuffer(false, pid);
public static IAnimationInvocationBufferWriter CreateWriter()
=> new AnimationInvocationBuffer();
public static IAnimationInvocationBufferWriter CreateWriter(int pid)
=> new AnimationInvocationBuffer(pid);
private AnimationInvocationBuffer(bool writer)
: base(_name, _version)
private AnimationInvocationBuffer(bool writer, int pid)
: base($"{_name}_{pid}_{_version}", _version)
{ }
private AnimationInvocationBuffer()
: base(_name, _version, _lineCount, _lineCapacity)
private AnimationInvocationBuffer(int pid)
: base($"{_name}_{pid}_{_version}", _version, _lineCount, _lineCapacity)
{ }
private static string ToName(AnimationInvocationType type)

View file

@ -69,17 +69,17 @@ internal sealed class CharacterBaseBuffer : MemoryMappedBuffer, ICharacterBaseBu
public uint TotalCount
=> TotalWrittenLines;
public static IBufferReader CreateReader()
=> new CharacterBaseBuffer(false);
public static IBufferReader CreateReader(int pid)
=> new CharacterBaseBuffer(false, pid);
public static ICharacterBaseBufferWriter CreateWriter()
=> new CharacterBaseBuffer();
public static ICharacterBaseBufferWriter CreateWriter(int pid)
=> new CharacterBaseBuffer(pid);
private CharacterBaseBuffer(bool writer)
: base(_name, _version)
private CharacterBaseBuffer(bool writer, int pid)
: base($"{_name}_{pid}_{_version}", _version)
{ }
private CharacterBaseBuffer()
: base(_name, _version, _lineCount, _lineCapacity)
private CharacterBaseBuffer(int pid)
: base($"{_name}_{pid}_{_version}", _version, _lineCount, _lineCapacity)
{ }
}

View file

@ -11,7 +11,7 @@ public class MemoryMappedBuffer : IDisposable
private readonly MemoryMappedFile _file;
private readonly MemoryMappedViewAccessor _header;
private readonly MemoryMappedViewAccessor[] _lines;
private readonly MemoryMappedViewAccessor[] _lines = [];
public readonly int Version;
public readonly uint LineCount;
@ -64,7 +64,8 @@ public class MemoryMappedBuffer : IDisposable
public MemoryMappedBuffer(string mapName, int? expectedVersion = null, uint? expectedMinLineCount = null,
uint? expectedMinLineCapacity = null)
{
_file = MemoryMappedFile.OpenExisting(mapName, MemoryMappedFileRights.ReadWrite, HandleInheritability.Inheritable);
_lines = [];
_file = MemoryMappedFile.OpenExisting(mapName, MemoryMappedFileRights.ReadWrite, HandleInheritability.Inheritable);
using var headerLine = _file.CreateViewAccessor(0, 4, MemoryMappedFileAccess.Read);
var headerLength = headerLine.ReadUInt32(0);
if (headerLength < MinHeaderLength)
@ -96,6 +97,7 @@ public class MemoryMappedBuffer : IDisposable
void Throw(string text)
{
_file.Dispose();
_header?.Dispose();
_disposed = true;
throw new Exception(text);
}
@ -204,10 +206,10 @@ public class MemoryMappedBuffer : IDisposable
if (_disposed)
return;
_header.Dispose();
_header?.Dispose();
foreach (var line in _lines)
line.Dispose();
_file.Dispose();
line?.Dispose();
_file?.Dispose();
}
~MemoryMappedBuffer()

View file

@ -83,17 +83,17 @@ internal sealed class ModdedFileBuffer : MemoryMappedBuffer, IModdedFileBufferWr
}
}
public static IBufferReader CreateReader()
=> new ModdedFileBuffer(false);
public static IBufferReader CreateReader(int pid)
=> new ModdedFileBuffer(false, pid);
public static IModdedFileBufferWriter CreateWriter()
=> new ModdedFileBuffer();
public static IModdedFileBufferWriter CreateWriter(int pid)
=> new ModdedFileBuffer(pid);
private ModdedFileBuffer(bool writer)
: base(_name, _version)
private ModdedFileBuffer(bool writer, int pid)
: base($"{_name}_{pid}_{_version}", _version)
{ }
private ModdedFileBuffer()
: base(_name, _version, _lineCount, _lineCapacity)
private ModdedFileBuffer(int pid)
: base($"{_name}_{pid}_{_version}", _version, _lineCount, _lineCapacity)
{ }
}

View file

@ -9,13 +9,13 @@ public interface IBufferReader
public IEnumerable<JsonObject> GetLines(DateTimeOffset crashTime);
}
public sealed class GameEventLogReader : IDisposable
public sealed class GameEventLogReader(int pid) : IDisposable
{
public readonly (IBufferReader Reader, string TypeSingular, string TypePlural)[] Readers =
[
(CharacterBaseBuffer.CreateReader(), "CharacterLoaded", "CharactersLoaded"),
(ModdedFileBuffer.CreateReader(), "ModdedFileLoaded", "ModdedFilesLoaded"),
(AnimationInvocationBuffer.CreateReader(), "VFXFuncInvoked", "VFXFuncsInvoked"),
(CharacterBaseBuffer.CreateReader(pid), "CharacterLoaded", "CharactersLoaded"),
(ModdedFileBuffer.CreateReader(pid), "ModdedFileLoaded", "ModdedFilesLoaded"),
(AnimationInvocationBuffer.CreateReader(pid), "VFXFuncInvoked", "VFXFuncsInvoked"),
];
public void Dispose()

View file

@ -2,11 +2,11 @@
namespace Penumbra.CrashHandler;
public sealed class GameEventLogWriter : IDisposable
public sealed class GameEventLogWriter(int pid) : IDisposable
{
public readonly ICharacterBaseBufferWriter CharacterBase = CharacterBaseBuffer.CreateWriter();
public readonly IModdedFileBufferWriter FileLoaded = ModdedFileBuffer.CreateWriter();
public readonly IAnimationInvocationBufferWriter AnimationFuncInvoked = AnimationInvocationBuffer.CreateWriter();
public readonly ICharacterBaseBufferWriter CharacterBase = CharacterBaseBuffer.CreateWriter(pid);
public readonly IModdedFileBufferWriter FileLoaded = ModdedFileBuffer.CreateWriter(pid);
public readonly IAnimationInvocationBufferWriter AnimationFuncInvoked = AnimationInvocationBuffer.CreateWriter(pid);
public void Dispose()
{

View file

@ -12,7 +12,7 @@ public class CrashHandler
try
{
using var reader = new GameEventLogReader();
using var reader = new GameEventLogReader(pid);
var parent = Process.GetProcessById(pid);
using var handle = parent.SafeHandle;
parent.WaitForExit();