Home | History | Annotate | Download | only in blob
      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