Index: chrome/browser/nacl_host/pnacl_translation_cache.cc |
diff --git a/chrome/browser/nacl_host/pnacl_translation_cache.cc b/chrome/browser/nacl_host/pnacl_translation_cache.cc |
index e3c8c207cbb429c29bd1b40e2d6a2dd62fee2922..56354792ebb6bf4ffe854927401c8781a44ceac4 100644 |
--- a/chrome/browser/nacl_host/pnacl_translation_cache.cc |
+++ b/chrome/browser/nacl_host/pnacl_translation_cache.cc |
@@ -6,6 +6,7 @@ |
#include <string> |
+#include "base/callback.h" |
#include "base/files/file_path.h" |
#include "base/logging.h" |
#include "base/strings/string_number_conversions.h" |
@@ -67,7 +68,8 @@ class PnaclTranslationCacheEntry |
OPEN_ENTRY, |
CREATE_ENTRY, |
TRANSFER_ENTRY, |
- CLOSE_ENTRY |
+ CLOSE_ENTRY, |
+ FINISHED |
}; |
private: |
@@ -142,8 +144,21 @@ PnaclTranslationCacheEntry::PnaclTranslationCacheEntry( |
PnaclTranslationCacheEntry::~PnaclTranslationCacheEntry() { |
// Ensure we have called the user's callback |
- DCHECK(read_callback_.is_null()); |
- DCHECK(write_callback_.is_null()); |
+ if (step_ != FINISHED) { |
+ if (!read_callback_.is_null()) { |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(read_callback_, |
+ net::ERR_ABORTED, |
+ scoped_refptr<net::DrainableIOBuffer>())); |
+ } |
+ if (!write_callback_.is_null()) { |
+ BrowserThread::PostTask(BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(write_callback_, net::ERR_ABORTED)); |
+ } |
+ } |
} |
void PnaclTranslationCacheEntry::Start() { |
@@ -208,15 +223,17 @@ void PnaclTranslationCacheEntry::CloseEntry(int rv) { |
} |
void PnaclTranslationCacheEntry::Finish(int rv) { |
+ step_ = FINISHED; |
if (is_read_) { |
if (!read_callback_.is_null()) { |
- read_callback_.Run(rv, io_buf_); |
- read_callback_.Reset(); |
+ BrowserThread::PostTask(BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(read_callback_, rv, io_buf_)); |
} |
} else { |
if (!write_callback_.is_null()) { |
- write_callback_.Run(rv); |
- write_callback_.Reset(); |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, base::Bind(write_callback_, rv)); |
} |
} |
cache_->OpComplete(this); |
@@ -229,6 +246,7 @@ void PnaclTranslationCacheEntry::DispatchNext(int rv) { |
switch (step_) { |
case UNINITIALIZED: |
+ case FINISHED: |
LOG(ERROR) << "DispatchNext called uninitialized"; |
break; |
@@ -273,8 +291,8 @@ void PnaclTranslationCacheEntry::DispatchNext(int rv) { |
if (rv < 0) { |
// We do not call DispatchNext directly if WriteEntry/ReadEntry returns |
// ERR_IO_PENDING, and the callback should not return that value either. |
- LOG(ERROR) |
- << "Failed to complete write to entry: " << net::ErrorToString(rv); |
+ LOG(ERROR) << "Failed to complete write to entry: " |
+ << net::ErrorToString(rv); |
step_ = CLOSE_ENTRY; |
CloseEntry(rv); |
break; |
@@ -326,9 +344,8 @@ int PnaclTranslationCache::Init(net::CacheType cache_type, |
NULL, /* dummy net log */ |
&disk_cache_, |
base::Bind(&PnaclTranslationCache::OnCreateBackendComplete, AsWeakPtr())); |
- init_callback_ = callback; |
- if (rv != net::ERR_IO_PENDING) { |
- OnCreateBackendComplete(rv); |
+ if (rv == net::ERR_IO_PENDING) { |
+ init_callback_ = callback; |
} |
return rv; |
} |
@@ -339,8 +356,8 @@ void PnaclTranslationCache::OnCreateBackendComplete(int rv) { |
} |
// Invoke our client's callback function. |
if (!init_callback_.is_null()) { |
- init_callback_.Run(rv); |
- init_callback_.Reset(); |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, base::Bind(init_callback_, rv)); |
} |
} |
@@ -348,11 +365,6 @@ void PnaclTranslationCache::OnCreateBackendComplete(int rv) { |
// High-level API |
void PnaclTranslationCache::StoreNexe(const std::string& key, |
- net::DrainableIOBuffer* nexe_data) { |
- StoreNexe(key, nexe_data, CompletionCallback()); |
-} |
- |
-void PnaclTranslationCache::StoreNexe(const std::string& key, |
net::DrainableIOBuffer* nexe_data, |
const CompletionCallback& callback) { |
PnaclTranslationCacheEntry* entry = PnaclTranslationCacheEntry::GetWriteEntry( |