| Index: content/browser/indexed_db/indexed_db_backing_store.cc
|
| diff --git a/content/browser/indexed_db/indexed_db_backing_store.cc b/content/browser/indexed_db/indexed_db_backing_store.cc
|
| index 9c220f24533b9ba1e3d92283916316cb30f465dd..95639f5af7d03dfea07a1efe074b03586eeaac85 100644
|
| --- a/content/browser/indexed_db/indexed_db_backing_store.cc
|
| +++ b/content/browser/indexed_db/indexed_db_backing_store.cc
|
| @@ -708,7 +708,7 @@ IndexedDBBackingStore::IndexedDBBackingStore(
|
| net::URLRequestContext* request_context,
|
| scoped_ptr<LevelDBDatabase> db,
|
| scoped_ptr<LevelDBComparator> comparator,
|
| - base::TaskRunner* task_runner)
|
| + base::SequencedTaskRunner* task_runner)
|
| : indexed_db_factory_(indexed_db_factory),
|
| origin_url_(origin_url),
|
| blob_path_(blob_path),
|
| @@ -780,7 +780,7 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open(
|
| blink::WebIDBDataLoss* data_loss,
|
| std::string* data_loss_message,
|
| bool* disk_full,
|
| - base::TaskRunner* task_runner,
|
| + base::SequencedTaskRunner* task_runner,
|
| bool clean_journal,
|
| leveldb::Status* status) {
|
| *data_loss = blink::WebIDBDataLossNone;
|
| @@ -935,7 +935,7 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open(
|
| std::string* data_loss_message,
|
| bool* is_disk_full,
|
| LevelDBFactory* leveldb_factory,
|
| - base::TaskRunner* task_runner,
|
| + base::SequencedTaskRunner* task_runner,
|
| bool clean_journal,
|
| leveldb::Status* status) {
|
| IDB_TRACE("IndexedDBBackingStore::Open");
|
| @@ -1082,7 +1082,7 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open(
|
| // static
|
| scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::OpenInMemory(
|
| const GURL& origin_url,
|
| - base::TaskRunner* task_runner,
|
| + base::SequencedTaskRunner* task_runner,
|
| leveldb::Status* status) {
|
| DefaultLevelDBFactory leveldb_factory;
|
| return IndexedDBBackingStore::OpenInMemory(
|
| @@ -1093,7 +1093,7 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::OpenInMemory(
|
| scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::OpenInMemory(
|
| const GURL& origin_url,
|
| LevelDBFactory* leveldb_factory,
|
| - base::TaskRunner* task_runner,
|
| + base::SequencedTaskRunner* task_runner,
|
| leveldb::Status* status) {
|
| IDB_TRACE("IndexedDBBackingStore::OpenInMemory");
|
|
|
| @@ -1126,7 +1126,7 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Create(
|
| net::URLRequestContext* request_context,
|
| scoped_ptr<LevelDBDatabase> db,
|
| scoped_ptr<LevelDBComparator> comparator,
|
| - base::TaskRunner* task_runner,
|
| + base::SequencedTaskRunner* task_runner,
|
| leveldb::Status* status) {
|
| // TODO(jsbell): Handle comparator name changes.
|
| scoped_refptr<IndexedDBBackingStore> backing_store(
|
| @@ -2253,11 +2253,11 @@ class IndexedDBBackingStore::Transaction::ChainedBlobWriterImpl
|
| };
|
|
|
| class LocalWriteClosure : public FileWriterDelegate::DelegateWriteCallback,
|
| - public base::RefCounted<LocalWriteClosure> {
|
| + public base::RefCountedThreadSafe<LocalWriteClosure> {
|
| public:
|
| LocalWriteClosure(IndexedDBBackingStore::Transaction::ChainedBlobWriter*
|
| chained_blob_writer,
|
| - base::TaskRunner* task_runner)
|
| + base::SequencedTaskRunner* task_runner)
|
| : chained_blob_writer_(chained_blob_writer),
|
| task_runner_(task_runner),
|
| bytes_written_(0) {}
|
| @@ -2277,9 +2277,11 @@ class LocalWriteClosure : public FileWriterDelegate::DelegateWriteCallback,
|
| }
|
| task_runner_->PostTask(
|
| FROM_HERE,
|
| - base::Bind(&LocalWriteClosure::callBlobCallbackOnIDBTaskRunner,
|
| - this,
|
| - write_status == FileWriterDelegate::SUCCESS_COMPLETED));
|
| + base::Bind(&IndexedDBBackingStore::Transaction::ChainedBlobWriter::
|
| + ReportWriteCompletion,
|
| + chained_blob_writer_,
|
| + write_status == FileWriterDelegate::SUCCESS_COMPLETED,
|
| + bytes_written_));
|
| }
|
|
|
| void writeBlobToFileOnIOThread(const FilePath& file_path,
|
| @@ -2304,16 +2306,21 @@ class LocalWriteClosure : public FileWriterDelegate::DelegateWriteCallback,
|
| }
|
|
|
| private:
|
| - virtual ~LocalWriteClosure() {}
|
| - friend class base::RefCounted<LocalWriteClosure>;
|
| -
|
| - void callBlobCallbackOnIDBTaskRunner(bool succeeded) {
|
| - DCHECK(task_runner_->RunsTasksOnCurrentThread());
|
| - chained_blob_writer_->ReportWriteCompletion(succeeded, bytes_written_);
|
| + virtual ~LocalWriteClosure() {
|
| + // Make sure the last reference to a ChainedBlobWriter is released (and
|
| + // deleted) on the IDB thread since it owns a transaction which has thread
|
| + // affinity.
|
| + IndexedDBBackingStore::Transaction::ChainedBlobWriter* raw_tmp =
|
| + chained_blob_writer_.get();
|
| + raw_tmp->AddRef();
|
| + chained_blob_writer_ = NULL;
|
| + task_runner_->ReleaseSoon(FROM_HERE, raw_tmp);
|
| }
|
| + friend class base::RefCountedThreadSafe<LocalWriteClosure>;
|
|
|
| - IndexedDBBackingStore::Transaction::ChainedBlobWriter* chained_blob_writer_;
|
| - base::TaskRunner* task_runner_;
|
| + scoped_refptr<IndexedDBBackingStore::Transaction::ChainedBlobWriter>
|
| + chained_blob_writer_;
|
| + scoped_refptr<base::SequencedTaskRunner> task_runner_;
|
| int64 bytes_written_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(LocalWriteClosure);
|
|
|