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 fd0ae54db73307d78774a037b4b52a6286a5f5c7..8ccba746c2bb4f6562f44cd8b1a02f8c34846a1d 100644 |
--- a/webkit/browser/blob/blob_data_handle.cc |
+++ b/webkit/browser/blob/blob_data_handle.cc |
@@ -13,44 +13,56 @@ |
namespace webkit_blob { |
-BlobDataHandle::BlobDataHandle(BlobData* blob_data, BlobStorageContext* context, |
- base::SequencedTaskRunner* task_runner) |
+BlobDataHandle::BlobDataHandleShared::BlobDataHandleShared( |
+ BlobData* blob_data, |
+ BlobStorageContext* context, |
+ base::SequencedTaskRunner* task_runner) |
: blob_data_(blob_data), |
- 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_(context->AsWeakPtr()) { |
context_->IncrementBlobRefCount(blob_data->uuid()); |
- blob_data_->AddRef(); |
} |
-BlobDataHandle::~BlobDataHandle() { |
- 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; |
- } |
+BlobData* BlobDataHandle::BlobDataHandleShared::data() const { |
+ return blob_data_; |
+} |
- io_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&DeleteHelper, context_, base::Unretained(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_; |
+} |
+ |
+BlobDataHandle::~BlobDataHandle() { |
+ BlobDataHandleShared* raw = shared_.get(); |
+ raw->AddRef(); |
+ shared_ = 0; |
+ io_task_runner_->ReleaseSoon(FROM_HERE, raw); |
} |
BlobData* BlobDataHandle::data() const { |
DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
- return blob_data_; |
+ return shared_->data(); |
} |
-// static |
-void BlobDataHandle::DeleteHelper( |
- base::WeakPtr<BlobStorageContext> context, |
- BlobData* blob_data) { |
- if (context.get()) |
- context->DecrementBlobRefCount(blob_data->uuid()); |
- blob_data->Release(); |
+std::string BlobDataHandle::uuid() const { |
+ return shared_->uuid(); |
} |
} // namespace webkit_blob |