diff options
Diffstat (limited to 'chromium/webkit/browser/blob/blob_data_handle.cc')
-rw-r--r-- | chromium/webkit/browser/blob/blob_data_handle.cc | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/chromium/webkit/browser/blob/blob_data_handle.cc b/chromium/webkit/browser/blob/blob_data_handle.cc new file mode 100644 index 00000000000..fd0ae54db73 --- /dev/null +++ b/chromium/webkit/browser/blob/blob_data_handle.cc @@ -0,0 +1,56 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "webkit/browser/blob/blob_data_handle.h" + +#include "base/bind.h" +#include "base/location.h" +#include "base/logging.h" +#include "base/sequenced_task_runner.h" +#include "webkit/browser/blob/blob_storage_context.h" +#include "webkit/common/blob/blob_data.h" + +namespace webkit_blob { + +BlobDataHandle::BlobDataHandle(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_->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; + } + + io_task_runner_->PostTask( + FROM_HERE, + base::Bind(&DeleteHelper, context_, base::Unretained(blob_data_))); +} + +BlobData* BlobDataHandle::data() const { + DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); + return blob_data_; +} + +// 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 |