1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "storage/browser/blob/blob_data_handle.h" 6 7 #include "base/bind.h" 8 #include "base/location.h" 9 #include "base/logging.h" 10 #include "base/sequenced_task_runner.h" 11 #include "storage/browser/blob/blob_storage_context.h" 12 #include "storage/common/blob/blob_data.h" 13 14 namespace storage { 15 16 BlobDataHandle::BlobDataHandleShared::BlobDataHandleShared( 17 BlobData* blob_data, 18 BlobStorageContext* context, 19 base::SequencedTaskRunner* task_runner) 20 : blob_data_(blob_data), 21 context_(context->AsWeakPtr()) { 22 context_->IncrementBlobRefCount(blob_data->uuid()); 23 } 24 25 BlobData* BlobDataHandle::BlobDataHandleShared::data() const { 26 return blob_data_.get(); 27 } 28 29 const std::string& BlobDataHandle::BlobDataHandleShared::uuid() const { 30 return blob_data_->uuid(); 31 } 32 33 BlobDataHandle::BlobDataHandleShared::~BlobDataHandleShared() { 34 if (context_.get()) 35 context_->DecrementBlobRefCount(blob_data_->uuid()); 36 } 37 38 BlobDataHandle::BlobDataHandle(BlobData* blob_data, 39 BlobStorageContext* context, 40 base::SequencedTaskRunner* task_runner) 41 : io_task_runner_(task_runner), 42 shared_(new BlobDataHandleShared(blob_data, context, task_runner)) { 43 DCHECK(io_task_runner_.get()); 44 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 45 } 46 47 BlobDataHandle::BlobDataHandle(const BlobDataHandle& other) { 48 io_task_runner_ = other.io_task_runner_; 49 shared_ = other.shared_; 50 } 51 52 BlobDataHandle::~BlobDataHandle() { 53 BlobDataHandleShared* raw = shared_.get(); 54 raw->AddRef(); 55 shared_ = 0; 56 io_task_runner_->ReleaseSoon(FROM_HERE, raw); 57 } 58 59 BlobData* BlobDataHandle::data() const { 60 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 61 return shared_->data(); 62 } 63 64 std::string BlobDataHandle::uuid() const { 65 return shared_->uuid(); 66 } 67 68 } // namespace storage 69