diff options
author | falken@chromium.org <falken@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-01 08:03:24 +0000 |
---|---|---|
committer | falken@chromium.org <falken@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-01 08:03:24 +0000 |
commit | ac6f8c98b9f225ac1c890f94d14ff9e3b17afd0c (patch) | |
tree | 49a720df71f2afdf9642ed9cf7b28d04487f173c /webkit/browser/blob/blob_data_handle.cc | |
parent | 9edf15bce7dab0c0a083b0c2dac910736d766c84 (diff) | |
download | chromium_src-ac6f8c98b9f225ac1c890f94d14ff9e3b17afd0c.zip chromium_src-ac6f8c98b9f225ac1c890f94d14ff9e3b17afd0c.tar.gz chromium_src-ac6f8c98b9f225ac1c890f94d14ff9e3b17afd0c.tar.bz2 |
Revert of Allow BlobDataHandles to be copied, and have their UUIDs read, on any thread. (https://codereview.chromium.org/259773006/)
Reason for revert:
I'm sorry to revert this change. It looks like it breaks the ASAN bot:
http://build.chromium.org/p/chromium.memory/builders/Linux%20ASan%20LSan%20Tests%20%282%29/builds/2161/steps/content_unittests/logs/ResolveBlobAndCreateUploadDataStream
Direct leak of 120 byte(s) in 3 object(s) allocated from:
#0 0x520dbb in operator new(unsigned long) /usr/local/google/work/chromium/src/third_party/llvm/projects/compiler-rt/lib/asan/asan_new_delete.cc:62
#1 0x3a0f611 in webkit_blob::BlobDataHandle::BlobDataHandle(webkit_blob::BlobData*, webkit_blob::BlobStorageContext*, base::SequencedTaskRunner*) webkit/browser/blob/blob_data_handle.cc:42
#2 0x3a0fd71 in webkit_blob::BlobStorageContext::GetBlobDataFromUUID(std::string const&) webkit/browser/blob/blob_storage_context.cc:69
#3 0x268955d in ResolveBlobReference content/browser/loader/upload_data_stream_builder.cc:73
...
Original issue's description:
> Allow BlobDataHandles to be copied, and have their UUIDs read, on any thread.
>
> BUG=108012
>
> Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=266817
>
> Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=267423
TBR=michaeln@chromium.org,piman@chromium.org,ericu@chromium.org
NOTREECHECKS=true
NOTRY=true
BUG=108012
Review URL: https://codereview.chromium.org/261683005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@267479 0039d316-1c4b-4281-b951-d872f2087c98
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 |