Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / third_party / WebKit / Source / core / dom / ExecutionContextTask.h
blobcae1fb43b6ee7303ac2fc1bb98324041e4c8aa52
1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Neither the name of Google Inc. nor the names of its
11 * contributors may be used to endorse or promote products derived from
12 * this software without specific prior written permission.
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #ifndef ExecutionContextTask_h
28 #define ExecutionContextTask_h
30 #include "core/CoreExport.h"
31 #include "wtf/FastAllocBase.h"
32 #include "wtf/Functional.h"
33 #include "wtf/Noncopyable.h"
34 #include "wtf/PassOwnPtr.h"
35 #include "wtf/text/WTFString.h"
37 namespace blink {
39 class ExecutionContext;
41 class CORE_EXPORT ExecutionContextTask {
42 WTF_MAKE_NONCOPYABLE(ExecutionContextTask);
43 WTF_MAKE_FAST_ALLOCATED(ExecutionContextTask);
44 public:
45 ExecutionContextTask() { }
46 virtual ~ExecutionContextTask() { }
47 virtual void performTask(ExecutionContext*) = 0;
48 virtual String taskNameForInstrumentation() const { return String(); }
51 namespace internal {
53 template<typename T>
54 class CallClosureTaskBase : public ExecutionContextTask {
55 protected:
56 CallClosureTaskBase(PassOwnPtr<Function<T>> closure, bool isSameThread)
57 : m_closure(closure)
58 #if ENABLE(ASSERT)
59 , m_isSameThread(isSameThread)
60 , m_createdThread(currentThread())
61 #endif
65 void checkThread()
67 #if ENABLE(ASSERT)
68 if (m_isSameThread) {
69 RELEASE_ASSERT(m_createdThread == currentThread());
71 #endif
74 OwnPtr<Function<T>> m_closure;
76 private:
77 #if ENABLE(ASSERT)
78 bool m_isSameThread;
79 ThreadIdentifier m_createdThread;
80 #endif
83 class CallClosureTask final : public CallClosureTaskBase<void()> {
84 public:
85 // Do not use |create| other than in createCrossThreadTask and
86 // createSameThreadTask.
87 // See http://crbug.com/390851
88 static PassOwnPtr<CallClosureTask> create(PassOwnPtr<Closure> closure, bool isSameThread = false)
90 return adoptPtr(new CallClosureTask(closure, isSameThread));
93 void performTask(ExecutionContext*) override
95 checkThread();
96 (*m_closure)();
99 private:
100 CallClosureTask(PassOwnPtr<Closure> closure, bool isSameThread)
101 : CallClosureTaskBase<void()>(closure, isSameThread)
106 } // namespace internal
108 // Create tasks passed within a single thread.
109 // When posting tasks within a thread, use |createSameThreadTask| instead
110 // of using |bind| directly to state explicitly that there is no need to care
111 // about thread safety when posting the task.
112 // When posting tasks across threads, use |createCrossThreadTask|.
113 template<typename FunctionType, typename... P>
114 PassOwnPtr<ExecutionContextTask> createSameThreadTask(
115 FunctionType function, const P&... parameters)
117 return internal::CallClosureTask::create(bind(function, parameters...), true);
120 } // namespace
122 #endif