Chromium Code Reviews| Index: chrome/browser/chromeos/system/statistics_provider.cc |
| diff --git a/chrome/browser/chromeos/system/statistics_provider.cc b/chrome/browser/chromeos/system/statistics_provider.cc |
| index f7b88ff1d3504bf5ea5f538d4e6a5ce5be6fbfdf..66a0cf3796e18cd3e7b2dae8e3d836819cfe02b9 100644 |
| --- a/chrome/browser/chromeos/system/statistics_provider.cc |
| +++ b/chrome/browser/chromeos/system/statistics_provider.cc |
| @@ -5,11 +5,13 @@ |
| #include "chrome/browser/chromeos/system/statistics_provider.h" |
| #include "base/bind.h" |
| +#include "base/bind_helpers.h" |
| #include "base/chromeos/chromeos_version.h" |
| #include "base/file_path.h" |
| #include "base/file_util.h" |
| #include "base/logging.h" |
| #include "base/memory/singleton.h" |
| +#include "base/message_loop.h" |
| #include "base/synchronization/waitable_event.h" |
| #include "base/time.h" |
| #include "base/chromeos/chromeos_version.h" |
| @@ -62,6 +64,15 @@ const char kVpdDelim[] = "\n"; |
| // Timeout that we should wait for statistics to get loaded |
| const int kTimeoutSecs = 3; |
| +// Helper to invoke |callbacks| on the UI thread. |
| +void NotifyOnUI(std::vector<base::Closure>* callbacks) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + for (std::vector<base::Closure>::iterator it = callbacks->begin(); |
| + it != callbacks->end(); ++it) { |
| + it->Run(); |
| + } |
| +} |
| + |
| } // namespace |
| // The StatisticsProvider implementation used in production. |
| @@ -71,6 +82,8 @@ class StatisticsProviderImpl : public StatisticsProvider { |
| virtual bool GetMachineStatistic(const std::string& name, |
| std::string* result) OVERRIDE; |
| + virtual void WhenReady(const base::Closure& callback) OVERRIDE; |
| + |
| static StatisticsProviderImpl* GetInstance(); |
| private: |
| @@ -86,6 +99,7 @@ class StatisticsProviderImpl : public StatisticsProvider { |
| NameValuePairsParser::NameValueMap machine_info_; |
| base::WaitableEvent on_statistics_loaded_; |
| + std::vector<base::Closure> callbacks_; |
| DISALLOW_COPY_AND_ASSIGN(StatisticsProviderImpl); |
| }; |
| @@ -123,6 +137,16 @@ bool StatisticsProviderImpl::GetMachineStatistic( |
| return false; |
|
jar (doing other things)
2012/04/24 18:37:40
This API makes it impossible to tell whether there
Joao da Silva
2012/04/27 09:47:48
This problem doesn't exist with the async notifica
jar (doing other things)
2012/04/27 18:00:38
I think what you're saying is that you plan to rem
Joao da Silva
2012/05/15 13:52:47
This API is used in a couple of places that aren't
|
| } |
| +void StatisticsProviderImpl::WhenReady(const base::Closure& callback) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + if (on_statistics_loaded_.IsSignaled()) { |
| + // Don't assume the caller is re-entrant. |
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, callback); |
| + } else { |
| + callbacks_.push_back(callback); |
| + } |
| +} |
| + |
| // manual_reset needs to be true, as we want to keep the signaled state. |
| StatisticsProviderImpl::StatisticsProviderImpl() |
| : on_statistics_loaded_(true /* manual_reset */, |
| @@ -172,6 +196,14 @@ void StatisticsProviderImpl::LoadMachineStatistics() { |
| on_statistics_loaded_.Signal(); |
| VLOG(1) << "Finished loading statistics"; |
| + // Any callbacks registed before Signal() are in |callbacks_|. Any registed |
| + // after Signal() will be immediately posted. NotifyOnUI() posts the callbacks |
| + // in |callbacks_| from the UI loop. |
| + std::vector<base::Closure>* callbacks = new std::vector<base::Closure>(); |
| + callbacks->swap(callbacks_); |
|
jar (doing other things)
2012/04/24 18:37:40
What thread are you running on? Are you ensured t
Joao da Silva
2012/04/27 09:47:48
This happens in the blocking pool, but the callbac
jar (doing other things)
2012/04/27 18:00:38
It appears as though the line:
callbacks_.push_ba
Joao da Silva
2012/05/15 13:52:47
You're totally right. I tried to make this a stati
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| + base::Bind(NotifyOnUI, base::Owned(callbacks))); |
| + |
| #if defined(GOOGLE_CHROME_BUILD) |
| // TODO(kochi): This is for providing a channel information to |
| // chrome::VersionInfo::GetChannel()/GetVersionStringModifier(), |
| @@ -210,6 +242,11 @@ class StatisticsProviderStubImpl : public StatisticsProvider { |
| return false; |
| } |
| + virtual void WhenReady(const base::Closure& callback) OVERRIDE { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, callback); |
| + } |
| + |
| static StatisticsProviderStubImpl* GetInstance() { |
| return Singleton<StatisticsProviderStubImpl, |
| DefaultSingletonTraits<StatisticsProviderStubImpl> >::get(); |