using System;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;
namespace TimeMocker.UI.Core
{
///
/// Creates a named Memory-Mapped File so the injected hook can read
/// the fake time without any IPC latency on the hot path.
/// One SharedMemoryManager per injected process.
///
public class SharedMemoryManager : IDisposable
{
public const string MmfPrefix = "TimeMocker_";
private MemoryMappedFile _mmf;
private MemoryMappedViewAccessor _view;
private readonly int _size;
private bool _disposed;
public string MmfName { get; }
public SharedMemoryManager(int processId)
{
MmfName = MmfPrefix + processId;
_size = Marshal.SizeOf();
_mmf = MemoryMappedFile.CreateOrOpen(MmfName, _size,
MemoryMappedFileAccess.ReadWrite);
_view = _mmf.CreateViewAccessor(0, _size);
}
public void Write(MockTimeInfo info)
{
_view.Write(0, ref info);
_view.Flush();
}
public void Dispose()
{
if (_disposed) return;
_disposed = true;
_view?.Dispose();
_mmf?.Dispose();
}
}
[StructLayout(LayoutKind.Sequential)]
public struct MockTimeInfo
{
public long DeltaTicks; // Offset to add to DateTime.UtcNow.Ticks (can be negative)
public int Enabled; // 1 = mock active, 0 = passthrough
}
}