1// Copyright 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 "content/browser/dom_storage/dom_storage_task_runner.h" 6 7#include "base/bind.h" 8#include "base/bind_helpers.h" 9#include "base/message_loop/message_loop_proxy.h" 10#include "base/tracked_objects.h" 11 12namespace content { 13 14// DOMStorageTaskRunner 15 16bool DOMStorageTaskRunner::RunsTasksOnCurrentThread() const { 17 return IsRunningOnSequence(PRIMARY_SEQUENCE); 18} 19 20// DOMStorageWorkerPoolTaskRunner 21 22DOMStorageWorkerPoolTaskRunner::DOMStorageWorkerPoolTaskRunner( 23 base::SequencedWorkerPool* sequenced_worker_pool, 24 base::SequencedWorkerPool::SequenceToken primary_sequence_token, 25 base::SequencedWorkerPool::SequenceToken commit_sequence_token, 26 base::MessageLoopProxy* delayed_task_loop) 27 : message_loop_(delayed_task_loop), 28 sequenced_worker_pool_(sequenced_worker_pool), 29 primary_sequence_token_(primary_sequence_token), 30 commit_sequence_token_(commit_sequence_token) { 31} 32 33DOMStorageWorkerPoolTaskRunner::~DOMStorageWorkerPoolTaskRunner() { 34} 35 36bool DOMStorageWorkerPoolTaskRunner::PostDelayedTask( 37 const tracked_objects::Location& from_here, 38 const base::Closure& task, 39 base::TimeDelta delay) { 40 // Note base::TaskRunner implements PostTask in terms of PostDelayedTask 41 // with a delay of zero, we detect that usage and avoid the unecessary 42 // trip thru the message loop. 43 if (delay == base::TimeDelta()) { 44 return sequenced_worker_pool_->PostSequencedWorkerTaskWithShutdownBehavior( 45 primary_sequence_token_, from_here, task, 46 base::SequencedWorkerPool::BLOCK_SHUTDOWN); 47 } 48 // Post a task to call this->PostTask() after the delay. 49 return message_loop_->PostDelayedTask( 50 FROM_HERE, 51 base::Bind(base::IgnoreResult(&DOMStorageWorkerPoolTaskRunner::PostTask), 52 this, from_here, task), 53 delay); 54} 55 56bool DOMStorageWorkerPoolTaskRunner::PostShutdownBlockingTask( 57 const tracked_objects::Location& from_here, 58 SequenceID sequence_id, 59 const base::Closure& task) { 60 return sequenced_worker_pool_->PostSequencedWorkerTaskWithShutdownBehavior( 61 IDtoToken(sequence_id), from_here, task, 62 base::SequencedWorkerPool::BLOCK_SHUTDOWN); 63} 64 65bool DOMStorageWorkerPoolTaskRunner::IsRunningOnSequence( 66 SequenceID sequence_id) const { 67 return sequenced_worker_pool_->IsRunningSequenceOnCurrentThread( 68 IDtoToken(sequence_id)); 69} 70 71base::SequencedWorkerPool::SequenceToken 72DOMStorageWorkerPoolTaskRunner::IDtoToken(SequenceID id) const { 73 if (id == PRIMARY_SEQUENCE) 74 return primary_sequence_token_; 75 DCHECK_EQ(COMMIT_SEQUENCE, id); 76 return commit_sequence_token_; 77} 78 79// MockDOMStorageTaskRunner 80 81MockDOMStorageTaskRunner::MockDOMStorageTaskRunner( 82 base::MessageLoopProxy* message_loop) 83 : message_loop_(message_loop) { 84} 85 86MockDOMStorageTaskRunner::~MockDOMStorageTaskRunner() { 87} 88 89bool MockDOMStorageTaskRunner::PostDelayedTask( 90 const tracked_objects::Location& from_here, 91 const base::Closure& task, 92 base::TimeDelta delay) { 93 return message_loop_->PostTask(from_here, task); 94} 95 96bool MockDOMStorageTaskRunner::PostShutdownBlockingTask( 97 const tracked_objects::Location& from_here, 98 SequenceID sequence_id, 99 const base::Closure& task) { 100 return message_loop_->PostTask(from_here, task); 101} 102 103bool MockDOMStorageTaskRunner::IsRunningOnSequence(SequenceID) const { 104 return message_loop_->RunsTasksOnCurrentThread(); 105} 106 107} // namespace content 108