public virtual void Close() { if (IsOwnerOfSharedMemory && View != null) { // Indicates to any open instances that the owner is no longer open #pragma warning disable 0420 // ignore ref to volatile warning - Interlocked API Interlocked.Exchange(ref Header->Shutdown, 1); #pragma warning restore 0420 } DoClose(); if (View != null) { View.SafeMemoryMappedViewHandle.ReleaseIntPtr(); View.Dispose(); } if (Mmf != null) { Mmf.Dispose(); } Header = null; ViewPtr = null; BufferStartPtr = null; View = null; Mmf = null; }
protected void CreateView() { View = Mmf.CreateViewAccessor(0, SharedMemorySize, MemoryMappedFileAccess.ReadWrite); View.SafeMemoryMappedViewHandle.AcquireIntPtr(ref ViewPtr); Header = (StockHeader *)(ViewPtr + HeaderOffset); if (!IsOwnerOfSharedMemory) { BufferStartPtr = ViewPtr + HeaderOffset + Marshal.SizeOf(typeof(StockHeader)); } else { BufferStartPtr = ViewPtr + BufferOffset; } }
public void PreReadHeader() { using (MemoryMappedViewAccessor headerView = Mmf.CreateViewAccessor(0, HeaderOffset + Marshal.SizeOf(typeof(StockHeader)), MemoryMappedFileAccess.Read)) { byte *headerPtr = null; headerView.SafeMemoryMappedViewHandle.AcquireIntPtr(ref headerPtr); StockHeader *_header = (StockHeader *)(headerPtr + HeaderOffset); StockHeader header = (StockHeader)Marshal.PtrToStructure((IntPtr)_header, typeof(StockHeader)); int headerSize = Marshal.SizeOf(typeof(StockHeader)); BufferSize = header.SharedMemorySize - headerSize; UsedSize = header.UsedMemorySize - headerSize; FreeSize = header.FreeMemorySize - headerSize; ItemCapacity = header.ItemCapacity; ItemSize = header.ItemSize; ItemCount = header.ItemCount; StockId = header.StockId; SectorId = header.SectorId; headerView.SafeMemoryMappedViewHandle.ReleaseIntPtr(); } }