1bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/browser/dom_storage/dom_storage_task_runner.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/tracked_objects.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace content { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// DOMStorageTaskRunner 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochbool DOMStorageTaskRunner::RunsTasksOnCurrentThread() const { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IsRunningOnSequence(PRIMARY_SEQUENCE); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// DOMStorageWorkerPoolTaskRunner 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDOMStorageWorkerPoolTaskRunner::DOMStorageWorkerPoolTaskRunner( 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SequencedWorkerPool* sequenced_worker_pool, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SequencedWorkerPool::SequenceToken primary_sequence_token, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SequencedWorkerPool::SequenceToken commit_sequence_token, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::MessageLoopProxy* delayed_task_loop) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : message_loop_(delayed_task_loop), 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sequenced_worker_pool_(sequenced_worker_pool), 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) primary_sequence_token_(primary_sequence_token), 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) commit_sequence_token_(commit_sequence_token) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDOMStorageWorkerPoolTaskRunner::~DOMStorageWorkerPoolTaskRunner() { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochbool DOMStorageWorkerPoolTaskRunner::PostDelayedTask( 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& from_here, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& task, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta delay) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note base::TaskRunner implements PostTask in terms of PostDelayedTask 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with a delay of zero, we detect that usage and avoid the unecessary 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // trip thru the message loop. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delay == base::TimeDelta()) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sequenced_worker_pool_->PostSequencedWorkerTaskWithShutdownBehavior( 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) primary_sequence_token_, from_here, task, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SequencedWorkerPool::BLOCK_SHUTDOWN); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Post a task to call this->PostTask() after the delay. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return message_loop_->PostDelayedTask( 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 51bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch base::Bind(base::IgnoreResult(&DOMStorageWorkerPoolTaskRunner::PostTask), 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, from_here, task), 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delay); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochbool DOMStorageWorkerPoolTaskRunner::PostShutdownBlockingTask( 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& from_here, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SequenceID sequence_id, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& task) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sequenced_worker_pool_->PostSequencedWorkerTaskWithShutdownBehavior( 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDtoToken(sequence_id), from_here, task, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SequencedWorkerPool::BLOCK_SHUTDOWN); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochbool DOMStorageWorkerPoolTaskRunner::IsRunningOnSequence( 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SequenceID sequence_id) const { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sequenced_worker_pool_->IsRunningSequenceOnCurrentThread( 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDtoToken(sequence_id)); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::SequencedWorkerPool::SequenceToken 72bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDOMStorageWorkerPoolTaskRunner::IDtoToken(SequenceID id) const { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id == PRIMARY_SEQUENCE) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return primary_sequence_token_; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(COMMIT_SEQUENCE, id); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return commit_sequence_token_; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// MockDOMStorageTaskRunner 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 81bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochMockDOMStorageTaskRunner::MockDOMStorageTaskRunner( 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::MessageLoopProxy* message_loop) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : message_loop_(message_loop) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochMockDOMStorageTaskRunner::~MockDOMStorageTaskRunner() { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochbool MockDOMStorageTaskRunner::PostDelayedTask( 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& from_here, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& task, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta delay) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return message_loop_->PostTask(from_here, task); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochbool MockDOMStorageTaskRunner::PostShutdownBlockingTask( 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& from_here, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SequenceID sequence_id, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& task) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return message_loop_->PostTask(from_here, task); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 103bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochbool MockDOMStorageTaskRunner::IsRunningOnSequence(SequenceID) const { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return message_loop_->RunsTasksOnCurrentThread(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} // namespace content 108