Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / content / browser / dom_storage / dom_storage_task_runner.h
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 #ifndef CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_
6 #define CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_
7
8 #include "base/memory/ref_counted.h"
9 #include "base/sequenced_task_runner.h"
10 #include "base/threading/sequenced_worker_pool.h"
11 #include "base/time/time.h"
12 #include "content/common/content_export.h"
13
14 namespace base {
15 class MessageLoopProxy;
16 }
17
18 namespace content {
19
20 // DOMStorage uses two task sequences (primary vs commit) to avoid
21 // primary access from queuing up behind commits to disk.
22 // * Initialization, shutdown, and administrative tasks are performed as
23 //   shutdown-blocking primary sequence tasks.
24 // * Tasks directly related to the javascript'able interface are performed
25 //   as shutdown-blocking primary sequence tasks.
26 //   TODO(michaeln): Skip tasks for reading during shutdown.
27 // * Internal tasks related to committing changes to disk are performed as
28 //   shutdown-blocking commit sequence tasks.
29 class CONTENT_EXPORT DOMStorageTaskRunner
30     : public base::TaskRunner {
31  public:
32   enum SequenceID {
33     PRIMARY_SEQUENCE,
34     COMMIT_SEQUENCE
35   };
36
37   // The PostTask() and PostDelayedTask() methods defined by TaskRunner
38   // post shutdown-blocking tasks on the primary sequence.
39   virtual bool PostDelayedTask(
40       const tracked_objects::Location& from_here,
41       const base::Closure& task,
42       base::TimeDelta delay) = 0;
43
44   // Posts a shutdown blocking task to |sequence_id|.
45   virtual bool PostShutdownBlockingTask(
46       const tracked_objects::Location& from_here,
47       SequenceID sequence_id,
48       const base::Closure& task) = 0;
49
50   // The TaskRunner override returns true if the current thread is running
51   // on the primary sequence.
52   bool RunsTasksOnCurrentThread() const override;
53
54   // Returns true if the current thread is running on the given |sequence_id|.
55   virtual bool IsRunningOnSequence(SequenceID sequence_id) const = 0;
56   bool IsRunningOnPrimarySequence() const {
57     return IsRunningOnSequence(PRIMARY_SEQUENCE);
58   }
59   bool IsRunningOnCommitSequence() const {
60     return IsRunningOnSequence(COMMIT_SEQUENCE);
61   }
62
63  protected:
64   ~DOMStorageTaskRunner() override {}
65 };
66
67 // A derived class used in chromium that utilizes a SequenceWorkerPool
68 // under dom_storage specific SequenceTokens. The |delayed_task_loop|
69 // is used to delay scheduling on the worker pool.
70 class CONTENT_EXPORT DOMStorageWorkerPoolTaskRunner :
71       public DOMStorageTaskRunner {
72  public:
73   DOMStorageWorkerPoolTaskRunner(
74       base::SequencedWorkerPool* sequenced_worker_pool,
75       base::SequencedWorkerPool::SequenceToken primary_sequence_token,
76       base::SequencedWorkerPool::SequenceToken commit_sequence_token,
77       base::MessageLoopProxy* delayed_task_loop);
78
79   bool PostDelayedTask(const tracked_objects::Location& from_here,
80                        const base::Closure& task,
81                        base::TimeDelta delay) override;
82
83   bool PostShutdownBlockingTask(const tracked_objects::Location& from_here,
84                                 SequenceID sequence_id,
85                                 const base::Closure& task) override;
86
87   bool IsRunningOnSequence(SequenceID sequence_id) const override;
88
89  protected:
90   ~DOMStorageWorkerPoolTaskRunner() override;
91
92  private:
93
94   base::SequencedWorkerPool::SequenceToken IDtoToken(SequenceID id) const;
95
96   const scoped_refptr<base::MessageLoopProxy> message_loop_;
97   const scoped_refptr<base::SequencedWorkerPool> sequenced_worker_pool_;
98   base::SequencedWorkerPool::SequenceToken primary_sequence_token_;
99   base::SequencedWorkerPool::SequenceToken commit_sequence_token_;
100 };
101
102 // A derived class used in unit tests that ignores all delays so
103 // we don't block in unit tests waiting for timeouts to expire.
104 // There is no distinction between [non]-shutdown-blocking or
105 // the primary sequence vs the commit sequence in the mock,
106 // all tasks are scheduled on |message_loop| with zero delay.
107 class CONTENT_EXPORT MockDOMStorageTaskRunner :
108       public DOMStorageTaskRunner {
109  public:
110   explicit MockDOMStorageTaskRunner(base::MessageLoopProxy* message_loop);
111
112   bool PostDelayedTask(const tracked_objects::Location& from_here,
113                        const base::Closure& task,
114                        base::TimeDelta delay) override;
115
116   bool PostShutdownBlockingTask(const tracked_objects::Location& from_here,
117                                 SequenceID sequence_id,
118                                 const base::Closure& task) override;
119
120   bool IsRunningOnSequence(SequenceID sequence_id) const override;
121
122  protected:
123   ~MockDOMStorageTaskRunner() override;
124
125  private:
126   const scoped_refptr<base::MessageLoopProxy> message_loop_;
127 };
128
129 }  // namespace content
130
131 #endif  // CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_