Index: net/base/net_log.cc |
diff --git a/net/base/net_log.cc b/net/base/net_log.cc |
index 4d9e55a15e412c9552d964c9b094840b56e36cd1..e256cc427b7ac0cd5d8522ca888b976a9be61e6a 100644 |
--- a/net/base/net_log.cc |
+++ b/net/base/net_log.cc |
@@ -187,6 +187,15 @@ NetLog* NetLog::ThreadSafeObserver::net_log() const { |
return net_log_; |
} |
+NetLog::NetLog() |
+ : last_id_(0), |
+ base_log_level_(LOG_NONE), |
+ effective_log_level_(LOG_NONE) { |
+} |
+ |
+NetLog::~NetLog() { |
+} |
+ |
void NetLog::AddGlobalEntry(EventType type) { |
AddEntry(type, |
Source(net::NetLog::SOURCE_NONE, NextID()), |
@@ -203,6 +212,68 @@ void NetLog::AddGlobalEntry( |
¶meters_callback); |
} |
+uint32 NetLog::NextID() { |
+ return base::subtle::NoBarrier_AtomicIncrement(&last_id_, 1); |
+} |
+ |
+void NetLog::SetBaseLogLevel(LogLevel log_level) { |
+ base_log_level_ = log_level; |
mmenke
2013/06/03 14:27:09
Should have the lock for this, unfortunately. May
kouhei (in TOK)
2013/06/04 15:41:44
Done.
|
+ |
+ UpdateLogLevel(); |
+} |
+ |
+NetLog::LogLevel NetLog::GetLogLevel() const { |
+ base::subtle::Atomic32 log_level = |
+ base::subtle::NoBarrier_Load(&effective_log_level_); |
+ return static_cast<net::NetLog::LogLevel>(log_level); |
+} |
+ |
+void NetLog::AddThreadSafeObserver( |
+ net::NetLog::ThreadSafeObserver* observer, |
+ LogLevel log_level) { |
+ base::AutoLock lock(lock_); |
+ |
+ observers_.AddObserver(observer); |
+ OnAddObserver(observer, log_level); |
+ UpdateLogLevel(); |
+} |
+ |
+void NetLog::SetObserverLogLevel( |
+ net::NetLog::ThreadSafeObserver* observer, |
+ LogLevel log_level) { |
+ base::AutoLock lock(lock_); |
+ |
+ DCHECK(observers_.HasObserver(observer)); |
+ OnSetObserverLogLevel(observer, log_level); |
+ UpdateLogLevel(); |
+} |
+ |
+void NetLog::RemoveThreadSafeObserver( |
+ net::NetLog::ThreadSafeObserver* observer) { |
+ base::AutoLock lock(lock_); |
+ |
+ DCHECK(observers_.HasObserver(observer)); |
+ observers_.RemoveObserver(observer); |
+ OnRemoveObserver(observer); |
+ UpdateLogLevel(); |
+} |
+ |
+void NetLog::UpdateLogLevel() { |
+ lock_.AssertAcquired(); |
+ |
+ // Look through all the observers and find the finest granularity |
+ // log level (higher values of the enum imply *lower* log levels). |
+ LogLevel new_effective_log_level = base_log_level_; |
+ ObserverListBase<ThreadSafeObserver>::Iterator it(observers_); |
+ ThreadSafeObserver* observer; |
+ while ((observer = it.GetNext()) != NULL) { |
+ new_effective_log_level = |
+ std::min(new_effective_log_level, observer->log_level()); |
+ } |
+ base::subtle::NoBarrier_Store(&effective_log_level_, |
+ new_effective_log_level); |
+} |
+ |
// static |
std::string NetLog::TickCountToString(const base::TimeTicks& time) { |
int64 delta_time = (time - base::TimeTicks()).InMilliseconds(); |
@@ -327,7 +398,10 @@ void NetLog::AddEntry(EventType type, |
return; |
Entry entry(type, source, phase, base::TimeTicks::Now(), |
parameters_callback, log_level); |
- OnAddEntry(entry); |
+ |
+ // Notify all of the log observers. |
+ base::AutoLock lock(lock_); |
+ FOR_EACH_OBSERVER(ThreadSafeObserver, observers_, OnAddEntry(entry)); |
} |
void BoundNetLog::AddEntry(NetLog::EventType type, |