Index: webkit/browser/blob/blob_data_handle.cc |
diff --git a/webkit/browser/blob/blob_data_handle.cc b/webkit/browser/blob/blob_data_handle.cc |
index 8ccba746c2bb4f6562f44cd8b1a02f8c34846a1d..fd0ae54db73307d78774a037b4b52a6286a5f5c7 100644 |
--- a/webkit/browser/blob/blob_data_handle.cc |
+++ b/webkit/browser/blob/blob_data_handle.cc |
@@ -13,56 +13,44 @@ |
namespace webkit_blob { |
-BlobDataHandle::BlobDataHandleShared::BlobDataHandleShared( |
- BlobData* blob_data, |
- BlobStorageContext* context, |
- base::SequencedTaskRunner* task_runner) |
+BlobDataHandle::BlobDataHandle(BlobData* blob_data, BlobStorageContext* context, |
+ base::SequencedTaskRunner* task_runner) |
: blob_data_(blob_data), |
- context_(context->AsWeakPtr()) { |
+ context_(context->AsWeakPtr()), |
+ io_task_runner_(task_runner) { |
+ // Ensures the uuid remains registered and the underlying data is not deleted. |
+ DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
context_->IncrementBlobRefCount(blob_data->uuid()); |
-} |
- |
-BlobData* BlobDataHandle::BlobDataHandleShared::data() const { |
- return blob_data_; |
-} |
- |
-const std::string& BlobDataHandle::BlobDataHandleShared::uuid() const { |
- return blob_data_->uuid(); |
-} |
- |
-BlobDataHandle::BlobDataHandleShared::~BlobDataHandleShared() { |
- if (context_.get()) |
- context_->DecrementBlobRefCount(blob_data_->uuid()); |
-} |
- |
-BlobDataHandle::BlobDataHandle(BlobData* blob_data, |
- BlobStorageContext* context, |
- base::SequencedTaskRunner* task_runner) |
- : io_task_runner_(task_runner), |
- shared_(new BlobDataHandleShared(blob_data, context, task_runner)) { |
- DCHECK(io_task_runner_); |
- DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
-} |
- |
-BlobDataHandle::BlobDataHandle(const BlobDataHandle& other) { |
- io_task_runner_ = other.io_task_runner_; |
- shared_ = other.shared_; |
+ blob_data_->AddRef(); |
} |
BlobDataHandle::~BlobDataHandle() { |
- BlobDataHandleShared* raw = shared_.get(); |
- raw->AddRef(); |
- shared_ = 0; |
- io_task_runner_->ReleaseSoon(FROM_HERE, raw); |
+ if (io_task_runner_->RunsTasksOnCurrentThread()) { |
+ // Note: Do not test context_ or alter the blob_data_ refcount |
+ // on the wrong thread. |
+ if (context_.get()) |
+ context_->DecrementBlobRefCount(blob_data_->uuid()); |
+ blob_data_->Release(); |
+ return; |
+ } |
+ |
+ io_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&DeleteHelper, context_, base::Unretained(blob_data_))); |
} |
BlobData* BlobDataHandle::data() const { |
DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
- return shared_->data(); |
+ return blob_data_; |
} |
-std::string BlobDataHandle::uuid() const { |
- return shared_->uuid(); |
+// static |
+void BlobDataHandle::DeleteHelper( |
+ base::WeakPtr<BlobStorageContext> context, |
+ BlobData* blob_data) { |
+ if (context.get()) |
+ context->DecrementBlobRefCount(blob_data->uuid()); |
+ blob_data->Release(); |
} |
} // namespace webkit_blob |