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