| Index: base/event_trace_consumer_win.h
|
| ===================================================================
|
| --- base/event_trace_consumer_win.h (revision 65062)
|
| +++ base/event_trace_consumer_win.h (working copy)
|
| @@ -1,144 +0,0 @@
|
| -// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -//
|
| -// Declaration of a Windows event trace consumer base class.
|
| -#ifndef BASE_EVENT_TRACE_CONSUMER_WIN_H_
|
| -#define BASE_EVENT_TRACE_CONSUMER_WIN_H_
|
| -#pragma once
|
| -
|
| -#include <windows.h>
|
| -#include <wmistr.h>
|
| -#include <evntrace.h>
|
| -#include <vector>
|
| -#include "base/basictypes.h"
|
| -
|
| -// This class is a base class that makes it easier to consume events
|
| -// from realtime or file sessions. Concrete consumers need to sublass
|
| -// a specialization of this class and override the ProcessEvent and/or
|
| -// the ProcessBuffer methods to implement the event consumption logic.
|
| -// Usage might look like:
|
| -// class MyConsumer: public EtwTraceConsumerBase<MyConsumer, 1> {
|
| -// protected:
|
| -// static VOID WINAPI ProcessEvent(PEVENT_TRACE event);
|
| -// };
|
| -//
|
| -// MyConsumer consumer;
|
| -// consumer.OpenFileSession(file_path);
|
| -// consumer.Consume();
|
| -template <class ImplClass>
|
| -class EtwTraceConsumerBase {
|
| - public:
|
| - // Constructs a closed consumer.
|
| - EtwTraceConsumerBase() {
|
| - }
|
| -
|
| - ~EtwTraceConsumerBase() {
|
| - Close();
|
| - }
|
| -
|
| - // Opens the named realtime session, which must be existent.
|
| - // Note: You can use OpenRealtimeSession or OpenFileSession
|
| - // to open as many as MAXIMUM_WAIT_OBJECTS (63) sessions at
|
| - // any one time, though only one of them may be a realtime
|
| - // session.
|
| - HRESULT OpenRealtimeSession(const wchar_t* session_name);
|
| -
|
| - // Opens the event trace log in "file_name", which must be a full or
|
| - // relative path to an existing event trace log file.
|
| - // Note: You can use OpenRealtimeSession or OpenFileSession
|
| - // to open as many as kNumSessions at any one time.
|
| - HRESULT OpenFileSession(const wchar_t* file_name);
|
| -
|
| - // Consume all open sessions from beginning to end.
|
| - HRESULT Consume();
|
| -
|
| - // Close all open sessions.
|
| - HRESULT Close();
|
| -
|
| - protected:
|
| - // Override in subclasses to handle events.
|
| - static void ProcessEvent(EVENT_TRACE* event) {
|
| - }
|
| - // Override in subclasses to handle buffers.
|
| - static bool ProcessBuffer(EVENT_TRACE_LOGFILE* buffer) {
|
| - return true; // keep going
|
| - }
|
| -
|
| - protected:
|
| - // Currently open sessions.
|
| - std::vector<TRACEHANDLE> trace_handles_;
|
| -
|
| - private:
|
| - // These delegate to ImplClass callbacks with saner signatures.
|
| - static void WINAPI ProcessEventCallback(EVENT_TRACE* event) {
|
| - ImplClass::ProcessEvent(event);
|
| - }
|
| - static ULONG WINAPI ProcessBufferCallback(PEVENT_TRACE_LOGFILE buffer) {
|
| - return ImplClass::ProcessBuffer(buffer);
|
| - }
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(EtwTraceConsumerBase);
|
| -};
|
| -
|
| -template <class ImplClass> inline
|
| -HRESULT EtwTraceConsumerBase<ImplClass>::OpenRealtimeSession(
|
| - const wchar_t* session_name) {
|
| - EVENT_TRACE_LOGFILE logfile = {};
|
| - logfile.LoggerName = const_cast<wchar_t*>(session_name);
|
| - logfile.LogFileMode = EVENT_TRACE_REAL_TIME_MODE;
|
| - logfile.BufferCallback = &ProcessBufferCallback;
|
| - logfile.EventCallback = &ProcessEventCallback;
|
| - logfile.Context = this;
|
| - TRACEHANDLE trace_handle = ::OpenTrace(&logfile);
|
| - if (reinterpret_cast<TRACEHANDLE>(INVALID_HANDLE_VALUE) == trace_handle)
|
| - return HRESULT_FROM_WIN32(::GetLastError());
|
| -
|
| - trace_handles_.push_back(trace_handle);
|
| - return S_OK;
|
| -}
|
| -
|
| -template <class ImplClass> inline
|
| -HRESULT EtwTraceConsumerBase<ImplClass>::OpenFileSession(
|
| - const wchar_t* file_name) {
|
| - EVENT_TRACE_LOGFILE logfile = {};
|
| - logfile.LogFileName = const_cast<wchar_t*>(file_name);
|
| - logfile.BufferCallback = &ProcessBufferCallback;
|
| - logfile.EventCallback = &ProcessEventCallback;
|
| - logfile.Context = this;
|
| - TRACEHANDLE trace_handle = ::OpenTrace(&logfile);
|
| - if (reinterpret_cast<TRACEHANDLE>(INVALID_HANDLE_VALUE) == trace_handle)
|
| - return HRESULT_FROM_WIN32(::GetLastError());
|
| -
|
| - trace_handles_.push_back(trace_handle);
|
| - return S_OK;
|
| -}
|
| -
|
| -template <class ImplClass> inline
|
| -HRESULT EtwTraceConsumerBase<ImplClass>::Consume() {
|
| - ULONG err = ::ProcessTrace(&trace_handles_[0],
|
| - trace_handles_.size(),
|
| - NULL,
|
| - NULL);
|
| - return HRESULT_FROM_WIN32(err);
|
| -}
|
| -
|
| -template <class ImplClass> inline
|
| -HRESULT EtwTraceConsumerBase<ImplClass>::Close() {
|
| - HRESULT hr = S_OK;
|
| - for (size_t i = 0; i < trace_handles_.size(); ++i) {
|
| - if (NULL != trace_handles_[i]) {
|
| - ULONG ret = ::CloseTrace(trace_handles_[i]);
|
| - trace_handles_[i] = NULL;
|
| -
|
| - if (FAILED(HRESULT_FROM_WIN32(ret)))
|
| - hr = HRESULT_FROM_WIN32(ret);
|
| - }
|
| -
|
| - trace_handles_.clear();
|
| - }
|
| -
|
| - return hr;
|
| -}
|
| -
|
| -#endif // BASE_EVENT_TRACE_CONSUMER_WIN_H_
|
|
|