Use "= default" to denote default constructor or destructor
[WebKit-https.git] / Source / WebCore / dom / Microtasks.cpp
1 /*
2  * Copyright (C) 2014 Yoav Weiss (yoav@yoav.ws)
3  * Copyright (C) 2015 Akamai Technologies Inc. All rights reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  *
20  */
21
22 #include "config.h"
23 #include "Microtasks.h"
24
25 #include <wtf/MainThread.h>
26 #include <wtf/NeverDestroyed.h>
27 #include <wtf/SetForScope.h>
28
29 namespace WebCore {
30
31 void Microtask::removeSelfFromQueue(MicrotaskQueue& queue)
32 {
33     queue.remove(*this);
34 }
35
36 MicrotaskQueue::MicrotaskQueue()
37     : m_timer(*this, &MicrotaskQueue::timerFired)
38 {
39 }
40
41 MicrotaskQueue::~MicrotaskQueue() = default;
42
43 MicrotaskQueue& MicrotaskQueue::mainThreadQueue()
44 {
45     ASSERT(isMainThread());
46     static NeverDestroyed<MicrotaskQueue> queue;
47     return queue;
48 }
49
50 void MicrotaskQueue::append(std::unique_ptr<Microtask>&& task)
51 {
52     m_microtaskQueue.append(WTFMove(task));
53
54     m_timer.startOneShot(0_s);
55 }
56
57 void MicrotaskQueue::remove(const Microtask& task)
58 {
59     for (size_t i = 0; i < m_microtaskQueue.size(); ++i) {
60         if (m_microtaskQueue[i].get() == &task) {
61             m_microtaskQueue.remove(i);
62             return;
63         }
64     }
65 }
66
67 void MicrotaskQueue::timerFired()
68 {
69     performMicrotaskCheckpoint();
70 }
71
72 void MicrotaskQueue::performMicrotaskCheckpoint()
73 {
74     if (m_performingMicrotaskCheckpoint)
75         return;
76
77     SetForScope<bool> change(m_performingMicrotaskCheckpoint, true);
78
79     Vector<std::unique_ptr<Microtask>> toKeep;
80     while (!m_microtaskQueue.isEmpty()) {
81         Vector<std::unique_ptr<Microtask>> queue = WTFMove(m_microtaskQueue);
82         for (auto& task : queue) {
83             auto result = task->run();
84             switch (result) {
85             case Microtask::Result::Done:
86                 break;
87             case Microtask::Result::KeepInQueue:
88                 toKeep.append(WTFMove(task));
89                 break;
90             }
91         }
92     }
93
94     m_microtaskQueue = WTFMove(toKeep);
95 }
96
97 } // namespace WebCore