Chromium Code Reviews| Index: chrome/browser/extensions/api/system_info/system_info_provider.h |
| diff --git a/chrome/browser/extensions/api/system_info/system_info_provider.h b/chrome/browser/extensions/api/system_info/system_info_provider.h |
| index 574e62925ace61d2cb8d60c36e767eae41599438..c63664dcf9b52c5324589f1b78142f7b50679ec8 100644 |
| --- a/chrome/browser/extensions/api/system_info/system_info_provider.h |
| +++ b/chrome/browser/extensions/api/system_info/system_info_provider.h |
| @@ -29,6 +29,16 @@ namespace extensions { |
| // |
| // Template parameter T is the system information type. It could be the |
| // structure type generated by IDL parser. |
| +// |
| +// The class member info_ is accessed on multiple threads, but that the whole |
| +// class is being guarded by SystemInfoProvider. |
| +// |
| +// SystemInfoProvider maintains a variable |is_waiting_for_completion_| on UI |
|
Jeffrey Yasskin
2013/07/03 21:44:49
To summarize this long paragraph, would it be corr
Haojian Wu
2013/07/04 00:41:17
I think so. Done.
|
| +// thread. The |is_waiting_for_completion_| is used to ensure that only one |
| +// thread is accessing the |info_| member at the same time. |
| +// In case of |is_waiting_for_completion_| is true, the callback will be queued |
| +// and so no entry will be access |info_| until SystemInfoProvider:: |
| +// OnQueryCompleted is called on UI thread. |
| template<class T> |
| class SystemInfoProvider |
| : public base::RefCountedThreadSafe<SystemInfoProvider<T> > { |
| @@ -68,25 +78,51 @@ class SystemInfoProvider |
| is_waiting_for_completion_ = true; |
| + StartQueryInfoImpl(); |
| + } |
| + |
| + protected: |
| + // Default implementation of querying system information. |
| + // |
| + // Before overriding this function, you should know what you intend to do |
|
Jeffrey Yasskin
2013/07/03 21:44:49
This sentence doesn't convey any information, so p
Haojian Wu
2013/07/04 00:41:17
Done.
|
| + // exactly. |
| + // While overriding, there are two things need to do: |
| + // 1). Bind custom callback function for query system information. |
| + // 2). Post the custom task to blocking pool. |
| + virtual void StartQueryInfoImpl() { |
| + base::Closure callback = |
| + base::Bind(&SystemInfoProvider<T>::QueryOnWorkerPool, this); |
| + PostQueryTaskToBlockingPool(FROM_HERE, callback); |
| + } |
| + |
| + // Post a task to blocking pool for information querying. |
| + // |
| + // The parameter query_callback should invoke QueryInfo directly or indirectly |
| + // to query the system information and return to UI thread when the query is |
| + // completed. |
| + void PostQueryTaskToBlockingPool(const tracked_objects::Location& from_here, |
| + const base::Closure& query_callback) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| base::SequencedWorkerPool* worker_pool = |
| content::BrowserThread::GetBlockingPool(); |
| // The query task posted to the worker pool won't block shutdown, and any |
| // running query task at shutdown time will be ignored. |
| worker_pool->PostSequencedWorkerTaskWithShutdownBehavior( |
| - worker_pool_token_, |
| - FROM_HERE, |
| - base::Bind(&SystemInfoProvider<T>::QueryOnWorkerPool, this), |
| + worker_pool_token_, from_here, query_callback, |
| base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); |
| } |
| - protected: |
| // Query the system information synchronously and output the result to the |
| // |info| parameter. The |info| contents MUST be reset firstly in its |
| // platform specific implementation. Return true if it succeeds, otherwise |
| // false is returned. |
| + // TODO(Haojian): Remove the parameter T-typed pointer, replacing with void |
| + // QueryInfo(). |
| virtual bool QueryInfo(T* info) = 0; |
| - virtual void QueryOnWorkerPool() { |
| + // TODO(Haojian): Use PostBlockingPoolTaskAndReply to avoid unnecessary |
| + // trampolines trip. |
| + void QueryOnWorkerPool() { |
| bool success = QueryInfo(&info_); |
| content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, |
| base::Bind(&SystemInfoProvider<T>::OnQueryCompleted, this, success)); |