}
EventPipeFile::EventPipeFile(StreamWriter *pStreamWriter, EventPipeSerializationFormat format) :
- FastSerializableObject(GetFileVersion(format), GetFileMinVersion(format), format >= EventPipeSerializationFormat::NetTraceV4)
+ FastSerializableObject(GetFileVersion(format), GetFileMinVersion(format), format >= EventPipeSerializationFormat::NetTraceV4),
+ m_pSerializer(nullptr),
+ m_pStreamWriter(pStreamWriter)
{
CONTRACTL
{
m_samplingRateInNs = SampleProfiler::GetSamplingRate();
- bool fSuccess = true;
- if (m_format >= EventPipeSerializationFormat::NetTraceV4)
- {
- const char* pHeader = "Nettrace";
- uint32_t bytesWritten = 0;
- fSuccess = pStreamWriter->Write(pHeader, 8, bytesWritten) && bytesWritten == 8;
- }
- if (fSuccess)
- {
- // Create the file stream and write the FastSerialization header.
- m_pSerializer = new FastSerializer(pStreamWriter);
- }
- else
- {
- m_pSerializer = nullptr;
- }
+
m_serializationLock.Init(LOCK_TYPE_DEFAULT);
QueryPerformanceCounter(&m_lastSortedTimestamp);
#endif
- // Write the first object to the file.
- m_pSerializer->WriteObject(this);
+
+}
+
+void EventPipeFile::InitializeFile()
+{
+ CONTRACTL
+ {
+ THROWS;
+ GC_TRIGGERS;
+ MODE_PREEMPTIVE;
+ PRECONDITION(m_pStreamWriter != nullptr);
+ PRECONDITION(m_pSerializer == nullptr);
+ }
+ CONTRACTL_END;
+
+ bool fSuccess = true;
+ if (m_format >= EventPipeSerializationFormat::NetTraceV4)
+ {
+ const char* pHeader = "Nettrace";
+ uint32_t bytesWritten = 0;
+ fSuccess = m_pStreamWriter->Write(pHeader, 8, bytesWritten) && bytesWritten == 8;
+ }
+ if (fSuccess)
+ {
+ // Create the file stream and write the FastSerialization header.
+ m_pSerializer = new FastSerializer(m_pStreamWriter);
+
+ // Write the first object to the file.
+ m_pSerializer->WriteObject(this);
+ }
}
EventPipeFile::~EventPipeFile()
THROWS;
GC_NOTRIGGER;
MODE_ANY;
+ PRECONDITION(!HasErrors());
}
CONTRACTL_END;
GC_NOTRIGGER;
MODE_ANY;
PRECONDITION(pSequencePoint != nullptr);
+ PRECONDITION(!HasErrors());
}
CONTRACTL_END;
NOTHROW;
GC_NOTRIGGER;
MODE_ANY;
+ PRECONDITION(!HasErrors());
+ PRECONDITION(m_pMetadataBlock != nullptr);
+ PRECONDITION(m_pStackBlock != nullptr);
+ PRECONDITION(m_pBlock != nullptr);
}
CONTRACTL_END;
+
// we write current blocks to the disk, whether they are full or not
if ((m_pMetadataBlock->GetBytesWritten() != 0) && ((flags & FlushMetadataBlock) != 0))
{
NOTHROW;
GC_NOTRIGGER;
MODE_ANY;
+ PRECONDITION(!HasErrors());
}
CONTRACTL_END;
THROWS;
GC_NOTRIGGER;
MODE_ANY;
+ PRECONDITION(m_pBlock != nullptr);
+ PRECONDITION(m_pMetadataBlock != nullptr);
}
CONTRACTL_END;
NOTHROW;
GC_NOTRIGGER;
MODE_ANY;
+ PRECONDITION(m_pMetadataIds != nullptr);
}
CONTRACTL_END;
GC_NOTRIGGER;
MODE_ANY;
PRECONDITION(metadataId > 0);
+ PRECONDITION(m_pMetadataIds != nullptr);
}
CONTRACTL_END;
GC_NOTRIGGER;
MODE_ANY;
PRECONDITION(m_format >= EventPipeSerializationFormat::NetTraceV4);
+ PRECONDITION(m_pStackBlock != nullptr);
}
CONTRACTL_END;
EventPipeFile(StreamWriter *pStreamWriter, EventPipeSerializationFormat format);
~EventPipeFile();
+ void InitializeFile();
EventPipeSerializationFormat GetSerializationFormat() const;
void WriteEvent(EventPipeEventInstance &instance, ULONGLONG captureThreadId, unsigned int sequenceNumber, BOOL isSortedEvent);
void WriteSequencePoint(EventPipeSequencePoint* pSequencePoint);
// The frequency of the timestamps used for this file.
LARGE_INTEGER m_timeStampFrequency;
+ StreamWriter * const m_pStreamWriter;
+
unsigned int m_pointerSize;
unsigned int m_currentProcessId;
}
CONTRACTL_END;
- const EventPipeCollectTracingCommandPayload* payload = message.TryParsePayload<EventPipeCollectTracingCommandPayload>();
+ NewHolder<const EventPipeCollectTracingCommandPayload> payload = message.TryParsePayload<EventPipeCollectTracingCommandPayload>();
if (payload == nullptr)
{
DiagnosticsIpc::IpcMessage::SendErrorMessage(pStream, CORDIAGIPC_E_BAD_ENCODING);
- delete payload;
delete pStream;
return;
}
if (sessionId == 0)
{
DiagnosticsIpc::IpcMessage::SendErrorMessage(pStream, E_FAIL);
- delete payload;
delete pStream;
}
+ else
+ {
+ DiagnosticsIpc::IpcMessage successResponse;
+ if (successResponse.Initialize(DiagnosticsIpc::GenericSuccessHeader, sessionId))
+ successResponse.Send(pStream);
+ EventPipe::StartStreaming(sessionId);
+ }
}
void EventPipeProtocolHelper::CollectTracing2(DiagnosticsIpc::IpcMessage& message, IpcStream *pStream)