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

Unified Diff: chrome/browser/in_process_webkit/indexed_db_key_utility_client.cc

Issue 6209005: Fix IndexedDB race condition during shutdown. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: First stab at new approach Created 9 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/in_process_webkit/indexed_db_key_utility_client.cc
diff --git a/chrome/browser/in_process_webkit/indexed_db_key_utility_client.cc b/chrome/browser/in_process_webkit/indexed_db_key_utility_client.cc
index f708b43dbf0a670e034299b422838af32ac75437..e8717186ace03ab4cbb437d08221212c49297b68 100644
--- a/chrome/browser/in_process_webkit/indexed_db_key_utility_client.cc
+++ b/chrome/browser/in_process_webkit/indexed_db_key_utility_client.cc
@@ -10,6 +10,32 @@
#include "chrome/common/indexed_db_key.h"
#include "chrome/common/serialized_script_value.h"
+IndexedDBKeyUtilityClient* IndexedDBKeyUtilityClient::Get() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
+ AutoLock auto_lock(instantiation_lock_);
+
+ if (!instance_.get()) {
+ instance_ = new IndexedDBKeyUtilityClient();
+ instance_->StartUtilityProcess();
+ }
+
+ return instance_.get();
+}
+
+void IndexedDBKeyUtilityClient::Shutdown() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ AutoLock autolock(instantiation_lock_);
+
+ if (!instance_.get())
+ return;
+
+ instance_->utility_process_host_->EndBatchMode();
+ instance_->utility_process_host_ = NULL;
+ instance_->client_ = NULL;
+ instance_->state_ = STATE_SHUTDOWN;
+ instance_ = NULL;
+}
+
IndexedDBKeyUtilityClient::IndexedDBKeyUtilityClient()
: waitable_event_(false, false),
state_(STATE_UNINITIALIZED),
@@ -32,21 +58,16 @@ void IndexedDBKeyUtilityClient::StartUtilityProcess() {
DCHECK(ret && state_ == STATE_INITIALIZED);
}
-void IndexedDBKeyUtilityClient::EndUtilityProcess() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
- DCHECK(state_ == STATE_INITIALIZED);
-
- EndUtilityProcessInternal();
- bool ret = waitable_event_.Wait();
-
- DCHECK(ret && state_ == STATE_SHUTDOWN);
-}
-
void IndexedDBKeyUtilityClient::CreateIDBKeysFromSerializedValuesAndKeyPath(
const std::vector<SerializedScriptValue>& values,
const string16& key_path,
std::vector<IndexedDBKey>* keys) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
+ if (state_ == STATE_SHUTDOWN) {
+ keys->clear();
+ return;
+ }
+
DCHECK(state_ == STATE_INITIALIZED);
state_ = STATE_CREATING_KEYS;
@@ -164,3 +185,6 @@ void IndexedDBKeyUtilityClient::Client::OnIDBKeysFromValuesAndKeyPathFailed(
int id) {
parent_->FinishCreatingKeys();
}
+
+scoped_refptr<IndexedDBKeyUtilityClient> IndexedDBKeyUtilityClient::instance_;
+base::Lock IndexedDBKeyUtilityClient::instantiation_lock_;

Powered by Google App Engine
This is Rietveld 408576698