Chromium Code Reviews| Index: Source/core/html/StableState.cpp |
| diff --git a/Source/core/html/StableState.cpp b/Source/core/html/StableState.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..4c08ea75f0644db69fca3dea8895b15d8612a2aa |
| --- /dev/null |
| +++ b/Source/core/html/StableState.cpp |
| @@ -0,0 +1,67 @@ |
| +// Copyright 2014 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. |
| + |
| +#include "config.h" |
| +#include "core/html/StableState.h" |
| + |
| +#include "wtf/HashSet.h" |
| +#include "wtf/MainThread.h" |
| + |
| +namespace WebCore { |
| + |
| +class StableStateAwaiters { |
| +private: |
|
acolwell GONE FROM CHROMIUM
2014/02/18 18:47:43
nit: public declarations should be before private
philipj_slow
2014/02/19 04:10:56
Done.
|
| + HashSet<StableState::Awaiter*> m_awaiters; |
| + StableState::Awaiter* m_currentAwaiter; |
| + |
| +public: |
| + StableStateAwaiters() : m_currentAwaiter(0) { } |
| + |
| + void add(StableState::Awaiter* awaiter) |
| + { |
| + ASSERT(!m_currentAwaiter); |
| + m_awaiters.add(awaiter); |
| + } |
| + |
| + void remove(StableState::Awaiter* awaiter) |
| + { |
| + ASSERT(!m_currentAwaiter || m_currentAwaiter == awaiter); |
| + m_awaiters.remove(awaiter); |
| + } |
| + |
| + void didAwaitStableState() |
| + { |
| + ASSERT(!m_currentAwaiter); |
| + while (!m_awaiters.isEmpty()) { |
| + m_currentAwaiter = *m_awaiters.begin(); |
| + m_currentAwaiter->didAwaitStableState(); |
| + remove(m_currentAwaiter); |
| + m_currentAwaiter = 0; |
| + } |
| + } |
| +}; |
| + |
| +static StableStateAwaiters& stableStateAwaiters() |
| +{ |
| + ASSERT(isMainThread()); |
| + DEFINE_STATIC_LOCAL(StableStateAwaiters, stableStateAwaiters, ()); |
| + return stableStateAwaiters; |
| +} |
| + |
| +StableState::Awaiter::~Awaiter() |
| +{ |
| + stableStateAwaiters().remove(this); |
| +} |
| + |
| +void StableState::await(Awaiter& awaiter) |
| +{ |
| + stableStateAwaiters().add(&awaiter); |
| +} |
| + |
| +void StableState::provide() |
| +{ |
| + stableStateAwaiters().didAwaitStableState(); |
| +} |
| + |
| +} // namespace WebCore |