Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(142)

Side by Side Diff: base/event_trace_provider_win.cc

Issue 4517004: Move Windows-specific Event Tracing for Windows implementation to base/win. ... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Fixed another ETW user in Chrome Frame Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/event_trace_provider_win.h ('k') | base/event_trace_provider_win_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 //
5 #include "base/event_trace_provider_win.h"
6 #include <windows.h>
7 #include <cguid.h>
8
9 TRACE_GUID_REGISTRATION EtwTraceProvider::obligatory_guid_registration_ = {
10 &GUID_NULL,
11 NULL
12 };
13
14 EtwTraceProvider::EtwTraceProvider(const GUID& provider_name)
15 : provider_name_(provider_name), registration_handle_(NULL),
16 session_handle_(NULL), enable_flags_(0), enable_level_(0) {
17 }
18
19 EtwTraceProvider::EtwTraceProvider()
20 : provider_name_(GUID_NULL), registration_handle_(NULL),
21 session_handle_(NULL), enable_flags_(0), enable_level_(0) {
22 }
23
24 EtwTraceProvider::~EtwTraceProvider() {
25 Unregister();
26 }
27
28 ULONG EtwTraceProvider::EnableEvents(void* buffer) {
29 session_handle_ = ::GetTraceLoggerHandle(buffer);
30 if (NULL == session_handle_) {
31 return ::GetLastError();
32 }
33
34 enable_flags_ = ::GetTraceEnableFlags(session_handle_);
35 enable_level_ = ::GetTraceEnableLevel(session_handle_);
36
37 // Give subclasses a chance to digest the state change.
38 OnEventsEnabled();
39
40 return ERROR_SUCCESS;
41 }
42
43 ULONG EtwTraceProvider::DisableEvents() {
44 // Give subclasses a chance to digest the state change.
45 OnEventsDisabled();
46
47 enable_level_ = 0;
48 enable_flags_ = 0;
49 session_handle_ = NULL;
50
51 PostEventsDisabled();
52
53 return ERROR_SUCCESS;
54 }
55
56 ULONG EtwTraceProvider::Callback(WMIDPREQUESTCODE request, void* buffer) {
57 switch (request) {
58 case WMI_ENABLE_EVENTS:
59 return EnableEvents(buffer);
60 case WMI_DISABLE_EVENTS:
61 return DisableEvents();
62 default:
63 return ERROR_INVALID_PARAMETER;
64 }
65 // Not reached.
66 }
67
68 ULONG WINAPI EtwTraceProvider::ControlCallback(WMIDPREQUESTCODE request,
69 void* context, ULONG *reserved, void* buffer) {
70 EtwTraceProvider *provider = reinterpret_cast<EtwTraceProvider*>(context);
71
72 return provider->Callback(request, buffer);
73 }
74
75 ULONG EtwTraceProvider::Register() {
76 if (provider_name_ == GUID_NULL)
77 return ERROR_INVALID_NAME;
78
79 return ::RegisterTraceGuids(ControlCallback, this, &provider_name_,
80 1, &obligatory_guid_registration_, NULL, NULL, &registration_handle_);
81 }
82
83 ULONG EtwTraceProvider::Unregister() {
84 ULONG ret = ::UnregisterTraceGuids(registration_handle_);
85
86 // Make sure we don't log anything from here on.
87 enable_level_ = 0;
88 enable_flags_ = 0;
89 session_handle_ = NULL;
90 registration_handle_ = NULL;
91
92 return ret;
93 }
94
95 ULONG EtwTraceProvider::Log(const EtwEventClass& event_class,
96 EtwEventType type, EtwEventLevel level, const char *message) {
97 if (NULL == session_handle_ || enable_level_ < level)
98 return ERROR_SUCCESS; // No one listening.
99
100 EtwMofEvent<1> event(event_class, type, level);
101
102 event.fields[0].DataPtr = reinterpret_cast<ULONG64>(message);
103 event.fields[0].Length = message ?
104 static_cast<ULONG>(sizeof(message[0]) * (1 + strlen(message))) : 0;
105
106 return ::TraceEvent(session_handle_, &event.header);
107 }
108
109 ULONG EtwTraceProvider::Log(const EtwEventClass& event_class,
110 EtwEventType type, EtwEventLevel level, const wchar_t *message) {
111 if (NULL == session_handle_ || enable_level_ < level)
112 return ERROR_SUCCESS; // No one listening.
113
114 EtwMofEvent<1> event(event_class, type, level);
115
116 event.fields[0].DataPtr = reinterpret_cast<ULONG64>(message);
117 event.fields[0].Length = message ?
118 static_cast<ULONG>(sizeof(message[0]) * (1 + wcslen(message))) : 0;
119
120 return ::TraceEvent(session_handle_, &event.header);
121 }
122
123 ULONG EtwTraceProvider::Log(EVENT_TRACE_HEADER* event) {
124 if (enable_level_ < event->Class.Level)
125 return ERROR_SUCCESS;
126
127 return ::TraceEvent(session_handle_, event);
128 }
OLDNEW
« no previous file with comments | « base/event_trace_provider_win.h ('k') | base/event_trace_provider_win_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698