diff options
Diffstat (limited to 'webkit/browser/blob/blob_data_handle.cc')
-rw-r--r-- | webkit/browser/blob/blob_data_handle.cc | 66 |
1 files changed, 27 insertions, 39 deletions
diff --git a/webkit/browser/blob/blob_data_handle.cc b/webkit/browser/blob/blob_data_handle.cc index 8ccba74..fd0ae54 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) - : blob_data_(blob_data), - context_(context->AsWeakPtr()) { - 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, +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_); + : 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()); -} - -BlobDataHandle::BlobDataHandle(const BlobDataHandle& other) { - io_task_runner_ = other.io_task_runner_; - shared_ = other.shared_; + context_->IncrementBlobRefCount(blob_data->uuid()); + 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 |