| Index: content/browser/in_process_webkit/indexed_db_key_utility_client.cc
|
| diff --git a/content/browser/in_process_webkit/indexed_db_key_utility_client.cc b/content/browser/in_process_webkit/indexed_db_key_utility_client.cc
|
| index 35bb59628dbae09d31050330b993102d52914070..4a7e8d4855f00bcff73e7ff3c2bb8f8621190cdf 100644
|
| --- a/content/browser/in_process_webkit/indexed_db_key_utility_client.cc
|
| +++ b/content/browser/in_process_webkit/indexed_db_key_utility_client.cc
|
| @@ -100,7 +100,7 @@ class KeyUtilityClientImpl
|
| content::SerializedScriptValue value_after_injection_;
|
|
|
| // Used in the IO thread.
|
| - UtilityProcessHost* utility_process_host_;
|
| + base::WeakPtr<UtilityProcessHost> utility_process_host_;
|
| scoped_refptr<Client> client_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(KeyUtilityClientImpl);
|
| @@ -177,16 +177,17 @@ IndexedDBKeyUtilityClient::InjectIDBKeyIntoSerializedValue(
|
| void KeyUtilityClientImpl::Shutdown() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
|
|
| - utility_process_host_->EndBatchMode();
|
| - utility_process_host_ = NULL;
|
| + if (utility_process_host_) {
|
| + utility_process_host_->EndBatchMode();
|
| + utility_process_host_.reset();
|
| + }
|
| client_ = NULL;
|
| state_ = STATE_SHUTDOWN;
|
| }
|
|
|
| KeyUtilityClientImpl::KeyUtilityClientImpl()
|
| : waitable_event_(false, false),
|
| - state_(STATE_UNINITIALIZED),
|
| - utility_process_host_(NULL) {
|
| + state_(STATE_UNINITIALIZED) {
|
| }
|
|
|
| KeyUtilityClientImpl::~KeyUtilityClientImpl() {
|
| @@ -274,8 +275,8 @@ void KeyUtilityClientImpl::StartUtilityProcessInternal() {
|
| DCHECK(state_ == STATE_UNINITIALIZED);
|
|
|
| client_ = new KeyUtilityClientImpl::Client(this);
|
| - utility_process_host_ = new UtilityProcessHost(
|
| - client_.get(), BrowserThread::IO);
|
| + utility_process_host_ = (new UtilityProcessHost(
|
| + client_.get(), BrowserThread::IO))->AsWeakPtr();
|
| utility_process_host_->set_use_linux_zygote(true);
|
| utility_process_host_->StartBatchMode();
|
| state_ = STATE_INITIALIZED;
|
| @@ -290,8 +291,10 @@ void KeyUtilityClientImpl::EndUtilityProcessInternal() {
|
| return;
|
| }
|
|
|
| - utility_process_host_->EndBatchMode();
|
| - utility_process_host_ = NULL;
|
| + if (utility_process_host_) {
|
| + utility_process_host_->EndBatchMode();
|
| + utility_process_host_.reset();
|
| + }
|
| client_ = NULL;
|
| state_ = STATE_SHUTDOWN;
|
| waitable_event_.Signal();
|
| @@ -310,8 +313,10 @@ void KeyUtilityClientImpl::CallStartIDBKeyFromValueAndKeyPathFromIOThread(
|
| }
|
|
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - utility_process_host_->Send(new UtilityMsg_IDBKeysFromValuesAndKeyPath(
|
| - 0, values, key_path));
|
| + if (utility_process_host_) {
|
| + utility_process_host_->Send(new UtilityMsg_IDBKeysFromValuesAndKeyPath(
|
| + 0, values, key_path));
|
| + }
|
| }
|
|
|
| void KeyUtilityClientImpl::CallStartInjectIDBKeyFromIOThread(
|
| @@ -327,8 +332,9 @@ void KeyUtilityClientImpl::CallStartInjectIDBKeyFromIOThread(
|
| }
|
|
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - utility_process_host_->Send(new UtilityMsg_InjectIDBKey(
|
| - key, value, key_path));
|
| + if (utility_process_host_)
|
| + utility_process_host_->Send(new UtilityMsg_InjectIDBKey(
|
| + key, value, key_path));
|
| }
|
|
|
| void KeyUtilityClientImpl::SetKeys(const std::vector<IndexedDBKey>& keys) {
|
| @@ -361,6 +367,7 @@ KeyUtilityClientImpl::Client::Client(KeyUtilityClientImpl* parent)
|
| void KeyUtilityClientImpl::Client::OnProcessCrashed(int exit_code) {
|
| if (parent_->state_ == STATE_CREATING_KEYS)
|
| parent_->FinishCreatingKeys();
|
| + parent_->Shutdown();
|
| }
|
|
|
| bool KeyUtilityClientImpl::Client::OnMessageReceived(
|
|
|