OLD | NEW |
| (Empty) |
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/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/blob/blob_data.h" | |
12 #include "webkit/blob/blob_storage_context.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_) | |
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) | |
52 context->DecrementBlobRefCount(blob_data->uuid()); | |
53 blob_data->Release(); | |
54 } | |
55 | |
56 } // namespace webkit_blob | |
OLD | NEW |