blob: c8a41f259fb9b40d65cc6dc989f695cf72b4d19a [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_H_
#define CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_H_
#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "base/sequence_checker.h"
#include "base/sequenced_task_runner.h"
#include "base/time/time.h"
#include "content/common/content_export.h"
namespace content {
// DOMStorage uses two task sequences (primary vs commit) to avoid
// primary access from queuing up behind commits to disk.
// * Initialization, shutdown, and administrative tasks are performed as
// shutdown-blocking primary sequence tasks.
// * Tasks directly related to the javascript'able interface are performed
// as shutdown-blocking primary sequence tasks.
// TODO(michaeln): Skip tasks for reading during shutdown.
// * Internal tasks related to committing changes to disk are performed as
// shutdown-blocking commit sequence tasks.
class CONTENT_EXPORT DOMStorageTaskRunner
: public base::TaskRunner {
public:
enum SequenceID {
PRIMARY_SEQUENCE,
COMMIT_SEQUENCE
};
// The PostTask() and PostDelayedTask() methods defined by TaskRunner
// post shutdown-blocking tasks on the primary sequence.
bool PostDelayedTask(const base::Location& from_here,
base::OnceClosure task,
base::TimeDelta delay) override = 0;
// Posts a shutdown blocking task to |sequence_id|.
virtual bool PostShutdownBlockingTask(const base::Location& from_here,
SequenceID sequence_id,
base::OnceClosure task) = 0;
virtual void AssertIsRunningOnPrimarySequence() const = 0;
virtual void AssertIsRunningOnCommitSequence() const = 0;
virtual scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner(
SequenceID sequence_id) = 0;
protected:
~DOMStorageTaskRunner() override {}
};
// A DOMStorageTaskRunner which manages a primary and a commit sequence.
class CONTENT_EXPORT DOMStorageWorkerPoolTaskRunner :
public DOMStorageTaskRunner {
public:
// |primary_sequence| and |commit_sequence| should have
// TaskShutdownBehaviour::BLOCK_SHUTDOWN semantics.
DOMStorageWorkerPoolTaskRunner(
scoped_refptr<base::SequencedTaskRunner> primary_sequence,
scoped_refptr<base::SequencedTaskRunner> commit_sequence);
bool RunsTasksInCurrentSequence() const override;
bool PostDelayedTask(const base::Location& from_here,
base::OnceClosure task,
base::TimeDelta delay) override;
bool PostShutdownBlockingTask(const base::Location& from_here,
SequenceID sequence_id,
base::OnceClosure task) override;
void AssertIsRunningOnPrimarySequence() const override;
void AssertIsRunningOnCommitSequence() const override;
scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner(
SequenceID sequence_id) override;
protected:
~DOMStorageWorkerPoolTaskRunner() override;
private:
scoped_refptr<base::SequencedTaskRunner> primary_sequence_;
scoped_refptr<base::SequencedTaskRunner> commit_sequence_;
DISALLOW_COPY_AND_ASSIGN(DOMStorageWorkerPoolTaskRunner);
};
// A derived class used in unit tests that ignores all delays so
// we don't block in unit tests waiting for timeouts to expire.
// There is no distinction between [non]-shutdown-blocking or
// the primary sequence vs the commit sequence in the mock,
// all tasks are scheduled on |task_runner| with zero delay.
class CONTENT_EXPORT MockDOMStorageTaskRunner :
public DOMStorageTaskRunner {
public:
explicit MockDOMStorageTaskRunner(
scoped_refptr<base::SequencedTaskRunner> task_runner);
bool RunsTasksInCurrentSequence() const override;
bool PostDelayedTask(const base::Location& from_here,
base::OnceClosure task,
base::TimeDelta delay) override;
bool PostShutdownBlockingTask(const base::Location& from_here,
SequenceID sequence_id,
base::OnceClosure task) override;
void AssertIsRunningOnPrimarySequence() const override;
void AssertIsRunningOnCommitSequence() const override;
scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner(
SequenceID sequence_id) override;
protected:
~MockDOMStorageTaskRunner() override;
private:
const scoped_refptr<base::SequencedTaskRunner> task_runner_;
DISALLOW_COPY_AND_ASSIGN(MockDOMStorageTaskRunner);
};
} // namespace content
#endif // CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_H_