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 "webkit/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 "webkit/browser/blob/blob_storage_context.h"
     12 #include "webkit/common/blob/blob_data.h"
     13 
     14 namespace webkit_blob {
     15 
     16 BlobDataHandle::BlobDataHandle(BlobData* blob_data, BlobStorageContext* context,
     17                                base::SequencedTaskRunner* task_runner)
     18     : blob_data_(blob_data),
     19       context_(context->AsWeakPtr()),
     20       io_task_runner_(task_runner) {
     21   // Ensures the uuid remains registered and the underlying data is not deleted.
     22   DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
     23   context_->IncrementBlobRefCount(blob_data->uuid());
     24   blob_data_->AddRef();
     25 }
     26 
     27 BlobDataHandle::~BlobDataHandle() {
     28   if (io_task_runner_->RunsTasksOnCurrentThread()) {
     29     // Note: Do not test context_ or alter the blob_data_ refcount
     30     // on the wrong thread.
     31     if (context_.get())
     32       context_->DecrementBlobRefCount(blob_data_->uuid());
     33     blob_data_->Release();
     34     return;
     35   }
     36 
     37   io_task_runner_->PostTask(
     38       FROM_HERE,
     39       base::Bind(&DeleteHelper, context_, base::Unretained(blob_data_)));
     40 }
     41 
     42 BlobData* BlobDataHandle::data() const {
     43   DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
     44   return blob_data_;
     45 }
     46 
     47 // static
     48 void BlobDataHandle::DeleteHelper(
     49     base::WeakPtr<BlobStorageContext> context,
     50     BlobData* blob_data) {
     51   if (context.get())
     52     context->DecrementBlobRefCount(blob_data->uuid());
     53   blob_data->Release();
     54 }
     55 
     56 }  // namespace webkit_blob
     57