diff options
Diffstat (limited to 'src/vm/eventpipe.cpp')
-rw-r--r-- | src/vm/eventpipe.cpp | 137 |
1 files changed, 59 insertions, 78 deletions
diff --git a/src/vm/eventpipe.cpp b/src/vm/eventpipe.cpp index c8f2655a41..361fe837c3 100644 --- a/src/vm/eventpipe.cpp +++ b/src/vm/eventpipe.cpp @@ -246,28 +246,21 @@ EventPipeSessionID EventPipe::Enable( CONTRACTL_END; EventPipeSessionID sessionId; - EventPipeProviderCallbackDataQueue eventPipeProviderCallbackDataQueue; - EventPipeProviderCallbackData eventPipeProviderCallbackData; - { - // Take the lock before enabling tracing. - CrstHolder _crst(GetLock()); - - // Create a new session. - SampleProfiler::SetSamplingRate((unsigned long)profilerSamplingRateInNanoseconds); - EventPipeSession *pSession = s_pConfig->CreateSession( - (strOutputPath != NULL) ? EventPipeSessionType::File : EventPipeSessionType::Streaming, - circularBufferSizeInMB, - pProviders, - numProviders); - - // Enable the session. - sessionId = Enable(strOutputPath, pSession, sessionType, pStream, &eventPipeProviderCallbackDataQueue); - } - - while (eventPipeProviderCallbackDataQueue.TryDequeue(&eventPipeProviderCallbackData)) - { - EventPipeProvider::InvokeCallback(eventPipeProviderCallbackData); - } + EventPipe::RunWithCallbackPostponed( + [&](EventPipeProviderCallbackDataQueue* pEventPipeProviderCallbackDataQueue) + { + // Create a new session. + SampleProfiler::SetSamplingRate((unsigned long)profilerSamplingRateInNanoseconds); + EventPipeSession *pSession = s_pConfig->CreateSession( + (strOutputPath != NULL) ? EventPipeSessionType::File : EventPipeSessionType::Streaming, + circularBufferSizeInMB, + pProviders, + numProviders); + + // Enable the session. + sessionId = Enable(strOutputPath, pSession, sessionType, pStream, pEventPipeProviderCallbackDataQueue); + } + ); return sessionId; } @@ -356,18 +349,12 @@ void EventPipe::Disable(EventPipeSessionID id) // Don't block GC during clean-up. GCX_PREEMP(); - EventPipeProviderCallbackDataQueue eventPipeProviderCallbackDataQueue; - EventPipeProviderCallbackData eventPipeProviderCallbackData; - { - // Take the lock before disabling tracing. - CrstHolder _crst(GetLock()); - DisableInternal(reinterpret_cast<EventPipeSessionID>(s_pSession), &eventPipeProviderCallbackDataQueue); - } - - while (eventPipeProviderCallbackDataQueue.TryDequeue(&eventPipeProviderCallbackData)) - { - EventPipeProvider::InvokeCallback(eventPipeProviderCallbackData); - } + EventPipe::RunWithCallbackPostponed( + [&](EventPipeProviderCallbackDataQueue* pEventPipeProviderCallbackDataQueue) + { + DisableInternal(reinterpret_cast<EventPipeSessionID>(s_pSession), pEventPipeProviderCallbackDataQueue); + } + ); } void EventPipe::DisableInternal(EventPipeSessionID id, EventPipeProviderCallbackDataQueue* pEventPipeProviderCallbackDataQueue) @@ -534,46 +521,39 @@ void WINAPI EventPipe::FlushTimer(PVOID parameter, BOOLEAN timerFired) GCX_PREEMP(); - EventPipeProviderCallbackDataQueue eventPipeProviderCallbackDataQueue; - EventPipeProviderCallbackData eventPipeProviderCallbackData; - { - // Take the lock control lock to make sure that tracing isn't disabled during this operation. - CrstHolder _crst(GetLock()); + EventPipe::RunWithCallbackPostponed( + [&](EventPipeProviderCallbackDataQueue* pEventPipeProviderCallbackDataQueue) + { + if (s_pSession == nullptr || s_pFile == nullptr) + return; - if (s_pSession == nullptr || s_pFile == nullptr) - return; + // Make sure that we should actually switch files. + if (!Enabled() || s_pSession->GetSessionType() != EventPipeSessionType::IpcStream) + return; - // Make sure that we should actually switch files. - if (!Enabled() || s_pSession->GetSessionType() != EventPipeSessionType::IpcStream) - return; - - if (CLRGetTickCount64() > (s_lastFlushSwitchTime + 100)) - { - // Get the current time stamp. - // WriteAllBuffersToFile will use this to ensure that no events after - // the current timestamp are written into the file. - LARGE_INTEGER stopTimeStamp; - QueryPerformanceCounter(&stopTimeStamp); - s_pBufferManager->WriteAllBuffersToFile(s_pFile, stopTimeStamp); - - s_lastFlushSwitchTime = CLRGetTickCount64(); - } + if (CLRGetTickCount64() > (s_lastFlushSwitchTime + 100)) + { + // Get the current time stamp. + // WriteAllBuffersToFile will use this to ensure that no events after + // the current timestamp are written into the file. + LARGE_INTEGER stopTimeStamp; + QueryPerformanceCounter(&stopTimeStamp); + s_pBufferManager->WriteAllBuffersToFile(s_pFile, stopTimeStamp); + + s_lastFlushSwitchTime = CLRGetTickCount64(); + } - if (s_pFile->HasErrors()) - { - EX_TRY + if (s_pFile->HasErrors()) { - DisableInternal(reinterpret_cast<EventPipeSessionID>(s_pSession), &eventPipeProviderCallbackDataQueue); + EX_TRY + { + DisableInternal(reinterpret_cast<EventPipeSessionID>(s_pSession), pEventPipeProviderCallbackDataQueue); + } + EX_CATCH {} + EX_END_CATCH(SwallowAllExceptions); } - EX_CATCH {} - EX_END_CATCH(SwallowAllExceptions); } - } - - while (eventPipeProviderCallbackDataQueue.TryDequeue(&eventPipeProviderCallbackData)) - { - EventPipeProvider::InvokeCallback(eventPipeProviderCallbackData); - } + ); } EventPipeSession *EventPipe::GetSession(EventPipeSessionID id) @@ -613,16 +593,12 @@ EventPipeProvider *EventPipe::CreateProvider(const SString &providerName, EventP CONTRACTL_END; EventPipeProvider *pProvider = NULL; - EventPipeProviderCallbackDataQueue eventPipeProviderCallbackDataQueue; - EventPipeProviderCallbackData eventPipeProviderCallbackData; - { - CrstHolder _crst(GetLock()); - pProvider = EventPipe::CreateProvider(providerName, pCallbackFunction, pCallbackData, &eventPipeProviderCallbackDataQueue); - } - while (eventPipeProviderCallbackDataQueue.TryDequeue(&eventPipeProviderCallbackData)) - { - EventPipeProvider::InvokeCallback(eventPipeProviderCallbackData); - } + EventPipe::RunWithCallbackPostponed( + [&](EventPipeProviderCallbackDataQueue* pEventPipeProviderCallbackDataQueue) + { + pProvider = EventPipe::CreateProvider(providerName, pCallbackFunction, pCallbackData, pEventPipeProviderCallbackDataQueue); + } + ); return pProvider; } @@ -930,4 +906,9 @@ EventPipeEventInstance *EventPipe::GetNextEvent() return pInstance; } +/* static */ void EventPipe::InvokeCallback(EventPipeProviderCallbackData eventPipeProviderCallbackData) +{ + EventPipeProvider::InvokeCallback(eventPipeProviderCallbackData); +} + #endif // FEATURE_PERFTRACING |