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

Side by Side Diff: net/base/net_log.h

Issue 16137008: Refactor net::NetLog to provide implementation of observer pattern, not just the interface. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix Created 7 years, 6 months 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
« no previous file with comments | « net/base/capturing_net_log.cc ('k') | net/base/net_log.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef NET_BASE_NET_LOG_H_ 5 #ifndef NET_BASE_NET_LOG_H_
6 #define NET_BASE_NET_LOG_H_ 6 #define NET_BASE_NET_LOG_H_
7 7
8 #include <string> 8 #include <string>
9 9
10 #include "base/atomicops.h"
10 #include "base/basictypes.h" 11 #include "base/basictypes.h"
11 #include "base/callback_forward.h" 12 #include "base/callback_forward.h"
12 #include "base/compiler_specific.h" 13 #include "base/compiler_specific.h"
14 #include "base/observer_list.h"
13 #include "base/string16.h" 15 #include "base/string16.h"
16 #include "base/synchronization/lock.h"
14 #include "base/time.h" 17 #include "base/time.h"
15 #include "net/base/net_export.h" 18 #include "net/base/net_export.h"
16 19
17 namespace base { 20 namespace base {
18 class DictionaryValue; 21 class DictionaryValue;
19 class Value; 22 class Value;
20 } 23 }
21 24
22 namespace net { 25 namespace net {
23 26
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 private: 194 private:
192 friend class NetLog; 195 friend class NetLog;
193 196
194 // Both of these values are only modified by the NetLog. 197 // Both of these values are only modified by the NetLog.
195 LogLevel log_level_; 198 LogLevel log_level_;
196 NetLog* net_log_; 199 NetLog* net_log_;
197 200
198 DISALLOW_COPY_AND_ASSIGN(ThreadSafeObserver); 201 DISALLOW_COPY_AND_ASSIGN(ThreadSafeObserver);
199 }; 202 };
200 203
201 NetLog() {} 204 NetLog();
202 virtual ~NetLog() {} 205 virtual ~NetLog();
203 206
204 // Emits a global event to the log stream, with its own unique source ID. 207 // Emits a global event to the log stream, with its own unique source ID.
205 void AddGlobalEntry(EventType type); 208 void AddGlobalEntry(EventType type);
206 void AddGlobalEntry(EventType type, 209 void AddGlobalEntry(EventType type,
207 const NetLog::ParametersCallback& parameters_callback); 210 const NetLog::ParametersCallback& parameters_callback);
208 211
209 // Returns a unique ID which can be used as a source ID. All returned IDs 212 // Returns a unique ID which can be used as a source ID. All returned IDs
210 // will be unique and greater than 0. 213 // will be unique and greater than 0.
211 virtual uint32 NextID() = 0; 214 uint32 NextID();
212 215
213 // Returns the logging level for this NetLog. This is used to avoid computing 216 // Returns the logging level for this NetLog. This is used to avoid computing
214 // and saving expensive log entries. 217 // and saving expensive log entries.
215 virtual LogLevel GetLogLevel() const = 0; 218 LogLevel GetLogLevel() const;
216 219
217 // Adds an observer and sets its log level. The observer must not be 220 // Adds an observer and sets its log level. The observer must not be
218 // watching any NetLog, including this one, when this is called. 221 // watching any NetLog, including this one, when this is called.
219 // 222 //
220 // Typical observers should specify LOG_BASIC. 223 // Typical observers should specify LOG_BASIC.
221 // 224 //
222 // Observers that need to see the full granularity of events can specify 225 // Observers that need to see the full granularity of events can specify
223 // LOG_ALL_BUT_BYTES. However, doing so will have performance consequences. 226 // LOG_ALL_BUT_BYTES. However, doing so will have performance consequences.
224 // 227 //
225 // NetLog implementations must call NetLog::OnAddObserver to update the 228 // NetLog implementations must call NetLog::OnAddObserver to update the
226 // observer's internal state. 229 // observer's internal state.
227 virtual void AddThreadSafeObserver(ThreadSafeObserver* observer, 230 void AddThreadSafeObserver(ThreadSafeObserver* observer, LogLevel log_level);
228 LogLevel log_level) = 0;
229 231
230 // Sets the log level of |observer| to |log_level|. |observer| must be 232 // Sets the log level of |observer| to |log_level|. |observer| must be
231 // watching |this|. NetLog implementations must call 233 // watching |this|. NetLog implementations must call
232 // NetLog::OnSetObserverLogLevel to update the observer's internal state. 234 // NetLog::OnSetObserverLogLevel to update the observer's internal state.
233 virtual void SetObserverLogLevel(ThreadSafeObserver* observer, 235 void SetObserverLogLevel(ThreadSafeObserver* observer, LogLevel log_level);
234 LogLevel log_level) = 0;
235 236
236 // Removes an observer. NetLog implementations must call 237 // Removes an observer. NetLog implementations must call
237 // NetLog::OnAddObserver to update the observer's internal state. 238 // NetLog::OnAddObserver to update the observer's internal state.
238 // 239 //
239 // For thread safety reasons, it is recommended that this not be called in 240 // For thread safety reasons, it is recommended that this not be called in
240 // an object's destructor. 241 // an object's destructor.
241 virtual void RemoveThreadSafeObserver(ThreadSafeObserver* observer) = 0; 242 void RemoveThreadSafeObserver(ThreadSafeObserver* observer);
242 243
243 // Converts a time to the string format that the NetLog uses to represent 244 // Converts a time to the string format that the NetLog uses to represent
244 // times. Strings are used since integers may overflow. 245 // times. Strings are used since integers may overflow.
245 static std::string TickCountToString(const base::TimeTicks& time); 246 static std::string TickCountToString(const base::TimeTicks& time);
246 247
247 // Returns a C-String symbolic name for |event_type|. 248 // Returns a C-String symbolic name for |event_type|.
248 static const char* EventTypeToString(EventType event_type); 249 static const char* EventTypeToString(EventType event_type);
249 250
250 // Returns a dictionary that maps event type symbolic names to their enum 251 // Returns a dictionary that maps event type symbolic names to their enum
251 // values. Caller takes ownership of the returned Value. 252 // values. Caller takes ownership of the returned Value.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 // the life of the callback. |value| may not be NULL. 287 // the life of the callback. |value| may not be NULL.
287 // Warning: |name| and |value| must remain valid for the life of the callback. 288 // Warning: |name| and |value| must remain valid for the life of the callback.
288 static ParametersCallback StringCallback(const char* name, 289 static ParametersCallback StringCallback(const char* name,
289 const std::string* value); 290 const std::string* value);
290 291
291 // Same as above, but takes in a UTF16 string. 292 // Same as above, but takes in a UTF16 string.
292 static ParametersCallback StringCallback(const char* name, 293 static ParametersCallback StringCallback(const char* name,
293 const base::string16* value); 294 const base::string16* value);
294 295
295 protected: 296 protected:
296 // Child classes should respond to the new entry here. This includes 297 // Set the lowest allowed log level, regardless of any Observers.
297 // creating the Entry object and alerting their observers. 298 void SetBaseLogLevel(LogLevel log_level);
298 virtual void OnAddEntry(const Entry& entry) = 0;
299
300 // Subclasses must call these in the corresponding functions to set an
301 // observer's |net_log_| and |log_level_| values.
302 void OnAddObserver(ThreadSafeObserver* observer, LogLevel log_level);
303 void OnSetObserverLogLevel(ThreadSafeObserver* observer,
304 LogLevel log_level);
305 void OnRemoveObserver(ThreadSafeObserver* observer);
306 299
307 private: 300 private:
308 friend class BoundNetLog; 301 friend class BoundNetLog;
309 302
310 void AddEntry(EventType type, 303 void AddEntry(EventType type,
311 const Source& source, 304 const Source& source,
312 EventPhase phase, 305 EventPhase phase,
313 const NetLog::ParametersCallback* parameters_callback); 306 const NetLog::ParametersCallback* parameters_callback);
314 307
308 // Called whenever an observer is added or removed, or has its log level
309 // changed. Must have acquired |lock_| prior to calling.
310 void UpdateLogLevel();
311
312 // |lock_| protects access to |observers_|.
313 base::Lock lock_;
314
315 // Last assigned source ID. Incremented to get the next one.
316 base::subtle::Atomic32 last_id_;
317
318 // The lowest allowed log level, regardless of any Observers.
319 // Normally defaults to LOG_NONE, but can be changed with SetBaseLogLevel
320 LogLevel base_log_level_;
321
322 // The current log level.
323 base::subtle::Atomic32 effective_log_level_;
324
325 // |lock_| must be acquired whenever reading or writing to this.
326 ObserverList<ThreadSafeObserver, true> observers_;
327
315 DISALLOW_COPY_AND_ASSIGN(NetLog); 328 DISALLOW_COPY_AND_ASSIGN(NetLog);
316 }; 329 };
317 330
318 // Helper that binds a Source to a NetLog, and exposes convenience methods to 331 // Helper that binds a Source to a NetLog, and exposes convenience methods to
319 // output log messages without needing to pass in the source. 332 // output log messages without needing to pass in the source.
320 class NET_EXPORT BoundNetLog { 333 class NET_EXPORT BoundNetLog {
321 public: 334 public:
322 BoundNetLog() : net_log_(NULL) {} 335 BoundNetLog() : net_log_(NULL) {}
323 336
324 // Add a log entry to the NetLog for the bound source. 337 // Add a log entry to the NetLog for the bound source.
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 : source_(source), net_log_(net_log) { 393 : source_(source), net_log_(net_log) {
381 } 394 }
382 395
383 NetLog::Source source_; 396 NetLog::Source source_;
384 NetLog* net_log_; 397 NetLog* net_log_;
385 }; 398 };
386 399
387 } // namespace net 400 } // namespace net
388 401
389 #endif // NET_BASE_NET_LOG_H_ 402 #endif // NET_BASE_NET_LOG_H_
OLDNEW
« no previous file with comments | « net/base/capturing_net_log.cc ('k') | net/base/net_log.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698