public MappedFileBuffer(byte[] data) { _file = MemoryMappedFile.CreateNew(Guid.NewGuid().ToString(), data.Length); _stream = _file.CreateViewStream(); _stream.Write(data, 0, data.Length); //File.WriteAllBytes(_file.Name, data); _size = (uint)data.Length; }
public void RunProcess(Action<Action<StringDictionary>> process) { var key = Guid.NewGuid().GetHashCode().ToString("X"); var processMgmt = new AutoResetEvent(false); var queueMgmt = new AutoResetEvent(false); var environmentKeyRead = new AutoResetEvent(false); var handles = new List<WaitHandle> { processMgmt }; _profilerRequestsInformation = new EventWaitHandle(false, EventResetMode.ManualReset, @"Local\OpenCover_Profiler_Communication_SendData_Event_" + key); _informationReadyForProfiler = new EventWaitHandle(false, EventResetMode.ManualReset, @"Local\OpenCover_Profiler_Communication_ReceiveData_Event_" + key); _informationReadByProfiler = new EventWaitHandle(false, EventResetMode.ManualReset, @"Local\OpenCover_Profiler_Communication_ChunkData_Event_" + key); handles.Add(_profilerRequestsInformation); _profilerHasResults = new EventWaitHandle(false, EventResetMode.ManualReset, @"Local\OpenCover_Profiler_Communication_SendResults_Event_" + key); _resultsHaveBeenReceived = new EventWaitHandle(false, EventResetMode.ManualReset, @"Local\OpenCover_Profiler_Communication_ReceiveResults_Event_" + key); handles.Add(_profilerHasResults); _messageQueue = new ConcurrentQueue<byte[]>(); using (var mmfComms = MemoryMappedFile.CreateNew(@"Local\OpenCover_Profiler_Communication_MemoryMapFile_" + key, maxMsgSize)) using (var mmfResults = MemoryMappedFile.CreateNew(@"Local\OpenCover_Profiler_Results_MemoryMapFile_" + key, maxMsgSize)) using (_streamAccessorComms = mmfComms.CreateViewStream(0, maxMsgSize, MemoryMappedFileAccess.ReadWrite)) using (_streamAccessorResults = mmfResults.CreateViewStream(0, maxMsgSize, MemoryMappedFileAccess.ReadWrite)) { _streamAccessorResults.Write(BitConverter.GetBytes(0), 0, 4); ThreadPool.QueueUserWorkItem((state) => { try { process(dictionary => { if (dictionary == null) return; dictionary[@"OpenCover_Profiler_Key"] = key; dictionary["Cor_Profiler"] = "{1542C21D-80C3-45E6-A56C-A9C1E4BEB7B8}"; dictionary["Cor_Enable_Profiling"] = "1"; environmentKeyRead.Set(); }); } finally { processMgmt.Set(); } }); ThreadPool.QueueUserWorkItem((state) => { while (true) { byte[] data; while (!_messageQueue.TryDequeue(out data)) Thread.Yield(); if (data.Length == 0) { _messageHandler.Complete(); queueMgmt.Set(); return; } _persistance.SaveVisitData(data); } }); // wait for the environment key to be read if (WaitHandle.WaitAny(new[] { environmentKeyRead }, new TimeSpan(0, 0, 0, 10)) == -1) return; _dataCommunication = new byte[maxMsgSize]; var pinnedComms = GCHandle.Alloc(_dataCommunication, GCHandleType.Pinned); try { ProcessMessages(handles, pinnedComms); } finally { pinnedComms.Free(); } queueMgmt.WaitOne(); } }