| 677 | } |
| 678 | |
| 679 | bool PMTraceSession::QueryEtwStatus(EtwStatus* status) const |
| 680 | { |
| 681 | if (mSessionHandle == 0) { |
| 682 | return false; |
| 683 | } |
| 684 | |
| 685 | TraceProperties sessionProps = {}; |
| 686 | sessionProps.Wnode.BufferSize = (ULONG) sizeof(TraceProperties); |
| 687 | sessionProps.LoggerNameOffset = offsetof(TraceProperties, mSessionName); |
| 688 | |
| 689 | auto queryStatus = ControlTraceW(mSessionHandle, nullptr, &sessionProps, EVENT_TRACE_CONTROL_QUERY); |
| 690 | if (queryStatus != ERROR_SUCCESS) { |
| 691 | return false; |
| 692 | } |
| 693 | |
| 694 | // Update cached status |
| 695 | mCachedEtwStatus.mEtwBuffersInUse = sessionProps.NumberOfBuffers - sessionProps.FreeBuffers; |
| 696 | mCachedEtwStatus.mEtwTotalBuffers = sessionProps.NumberOfBuffers; |
| 697 | mCachedEtwStatus.mEtwEventsLost = sessionProps.EventsLost; |
| 698 | mCachedEtwStatus.mEtwBuffersLost = sessionProps.LogBuffersLost + sessionProps.RealTimeBuffersLost; |
| 699 | mCachedEtwStatus.mNumOverflowedPresents = mPMConsumer->mNumOverflowedPresents; |
| 700 | |
| 701 | if (sessionProps.NumberOfBuffers > 0) { |
| 702 | mCachedEtwStatus.mEtwBufferFillPct = 100.0 * mCachedEtwStatus.mEtwBuffersInUse / sessionProps.NumberOfBuffers; |
| 703 | } else { |
| 704 | mCachedEtwStatus.mEtwBufferFillPct = 0.0; |
| 705 | } |
| 706 | |
| 707 | // Copy to output if provided |
| 708 | if (status != nullptr) { |
| 709 | *status = mCachedEtwStatus; |
| 710 | } |
| 711 | |
| 712 | return true; |
| 713 | } |
| 714 | |
| 715 | void PMTraceSession::ProcessEtwEventLatencyStats(uint64_t eventQpcTimestamp) |
| 716 | { |
no outgoing calls
no test coverage detected