Chromium Code Reviews| Index: chrome/browser/net/sqlite_server_bound_cert_store.cc |
| diff --git a/chrome/browser/net/sqlite_server_bound_cert_store.cc b/chrome/browser/net/sqlite_server_bound_cert_store.cc |
| index fb6ab57c3d61c8791ab7fc75de3cd50ec3719f72..2d7822df67241f294b08297dc08bd29c22795f83 100644 |
| --- a/chrome/browser/net/sqlite_server_bound_cert_store.cc |
| +++ b/chrome/browser/net/sqlite_server_bound_cert_store.cc |
| @@ -41,9 +41,8 @@ class SQLiteServerBoundCertStore::Backend |
| clear_on_exit_policy_(clear_on_exit_policy) { |
| } |
| - // Creates or load the SQLite database. |
| - bool Load( |
| - std::vector<net::DefaultServerBoundCertStore::ServerBoundCert*>* certs); |
| + // Creates or loads the SQLite database. |
| + void Load(const LoadedCallback& loaded_callback); |
| // Batch a server bound cert addition. |
| void AddServerBoundCert( |
| @@ -63,6 +62,9 @@ class SQLiteServerBoundCertStore::Backend |
| void SetForceKeepSessionState(); |
| private: |
| + bool LoadOnDBThread( |
| + std::vector<net::DefaultServerBoundCertStore::ServerBoundCert*>* certs); |
| + |
| friend class base::RefCountedThreadSafe<SQLiteServerBoundCertStore::Backend>; |
| // You should call Close() before destructing this object. |
| @@ -155,15 +157,27 @@ bool InitTable(sql::Connection* db) { |
| } // namespace |
| -bool SQLiteServerBoundCertStore::Backend::Load( |
| - std::vector<net::DefaultServerBoundCertStore::ServerBoundCert*>* certs) { |
| +void SQLiteServerBoundCertStore::Backend::Load( |
| + const LoadedCallback& loaded_callback) { |
| // This function should be called only once per instance. |
| DCHECK(!db_.get()); |
| - // TODO(paivanof@gmail.com): We do a lot of disk access in this function, |
| - // thus we do an exception to allow IO on the UI thread. This code will be |
| - // moved to the DB thread as part of http://crbug.com/89665. |
| - base::ThreadRestrictions::ScopedAllowIO allow_io; |
| + scoped_ptr<ScopedVector<net::DefaultServerBoundCertStore::ServerBoundCert> > |
| + certs(new ScopedVector<net::DefaultServerBoundCertStore::ServerBoundCert>( |
| + )); |
| + BrowserThread::PostTaskAndReply( |
| + BrowserThread::DB, FROM_HERE, |
| + base::Bind(base::IgnoreResult(&Backend::LoadOnDBThread), this, |
| + &certs->get()), |
| + base::Bind(loaded_callback, base::Passed(&certs))); |
| +} |
| + |
| +bool SQLiteServerBoundCertStore::Backend::LoadOnDBThread( |
|
erikwright (departed)
2013/01/04 19:20:10
why keep the bool exit code?
Also, consider simpl
mattm
2013/01/08 04:53:21
removed.
erikwright (departed)
2013/01/10 22:03:30
I see your point. I don't mind either way.
|
| + std::vector<net::DefaultServerBoundCertStore::ServerBoundCert*>* certs) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
| + |
| + // This method should be called only once per instance. |
| + DCHECK(!db_.get()); |
| base::TimeTicks start = base::TimeTicks::Now(); |
| @@ -218,11 +232,14 @@ bool SQLiteServerBoundCertStore::Backend::Load( |
| } |
| UMA_HISTOGRAM_COUNTS_10000("DomainBoundCerts.DBLoadedCount", certs->size()); |
| + base::TimeDelta load_time = base::TimeTicks::Now() - start; |
| UMA_HISTOGRAM_CUSTOM_TIMES("DomainBoundCerts.DBLoadTime", |
| - base::TimeTicks::Now() - start, |
| + load_time, |
| base::TimeDelta::FromMilliseconds(1), |
| base::TimeDelta::FromMinutes(1), |
| 50); |
| + DVLOG(1) << "loaded " << certs->size() << " in " << load_time.InMilliseconds() |
| + << " ms"; |
| return true; |
| } |
| @@ -544,9 +561,9 @@ SQLiteServerBoundCertStore::SQLiteServerBoundCertStore( |
| : backend_(new Backend(path, clear_on_exit_policy)) { |
| } |
| -bool SQLiteServerBoundCertStore::Load( |
| - std::vector<net::DefaultServerBoundCertStore::ServerBoundCert*>* certs) { |
| - return backend_->Load(certs); |
| +void SQLiteServerBoundCertStore::Load( |
| + const LoadedCallback& loaded_callback) { |
| + backend_->Load(loaded_callback); |
| } |
| void SQLiteServerBoundCertStore::AddServerBoundCert( |