protected override Task LiveLogListen(CancellationToken stopEvt, LiveLogXMLWriter output) { using (this.trace.NewFrame) { try { bufferReadyEvt.Set(); long msgIdx = 1; WaitHandle[] evts = new WaitHandle[] { dataReadyEvt, stopEvt.WaitHandle }; while (true) { int evtIdx = WaitHandle.WaitAny(evts); if (evtIdx == 1) { break; } IntPtr addr = bufferAddress.DangerousGetHandle(); UInt32 appID = (UInt32)Marshal.ReadInt32(addr); long strAddr = addr.ToInt64() + sizeof(UInt32); string msg = string.Format("{0} [{1}] {2}", msgIdx, appID, Marshal.PtrToStringAnsi(new IntPtr(strAddr))); XmlWriter writer = output.BeginWriteMessage(false); writer.WriteStartElement("m"); writer.WriteAttributeString("d", Listener.FormatDate(DateTime.Now)); writer.WriteAttributeString("t", "Process " + appID.ToString()); writer.WriteString(msg); writer.WriteEndElement(); output.EndWriteMessage(); ++msgIdx; bufferReadyEvt.Set(); } } catch (Exception e) { this.trace.Error(e, "DebugOutput listening thread failed"); } } return(Task.CompletedTask); }
public LogProvider(ILogProviderHost host, Factory factory) : base(host, factory, ConnectionParamsUtils.CreateConnectionParamsWithIdentity(DebugOutput.Factory.connectionIdentity)) { using (trace.NewFrame) { try { dataReadyEvt = new EventWaitHandle(false, EventResetMode.AutoReset, "DBWIN_DATA_READY"); bufferReadyEvt = new EventWaitHandle(false, EventResetMode.AutoReset, "DBWIN_BUFFER_READY"); trace.Info("Events opened OK. DBWIN_DATA_READY={0}, DBWIN_BUFFER_READY={1}", dataReadyEvt.SafeWaitHandle.DangerousGetHandle(), bufferReadyEvt.SafeWaitHandle.DangerousGetHandle()); bufferFile = new SafeFileHandle( Unmanaged.CreateFileMapping(new IntPtr(-1), IntPtr.Zero, Unmanaged.PAGE_READWRITE, 0, 1024, "DBWIN_BUFFER"), true); if (bufferFile.IsInvalid) { throw new Win32Exception(Marshal.GetLastWin32Error()); } trace.Info("DBWIN_BUFFER shared file opened OK. Handle={0}", bufferFile.DangerousGetHandle()); bufferAddress = new SafeViewOfFileHandle( Unmanaged.MapViewOfFile(bufferFile, Unmanaged.FILE_MAP_READ, 0, 0, 512), true); if (bufferAddress.IsInvalid) { throw new Win32Exception(Marshal.GetLastWin32Error()); } trace.Info("View of file mapped OK. Ptr={0}", bufferAddress.DangerousGetHandle()); StartLiveLogThread("DebugOutput listening thread"); } catch (Exception e) { trace.Error(e, "Failed to inistalize DebugOutput reader. Disposing what has been created so far."); Cleanup(); throw; } } }