diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/platform/graphics/gstreamer/MainThreadNotifier.h | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/platform/graphics/gstreamer/MainThreadNotifier.h')
-rw-r--r-- | Source/WebCore/platform/graphics/gstreamer/MainThreadNotifier.h | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/Source/WebCore/platform/graphics/gstreamer/MainThreadNotifier.h b/Source/WebCore/platform/graphics/gstreamer/MainThreadNotifier.h new file mode 100644 index 000000000..96b587ff9 --- /dev/null +++ b/Source/WebCore/platform/graphics/gstreamer/MainThreadNotifier.h @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2015 Igalia S.L + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#pragma once + +#include <wtf/Atomics.h> +#include <wtf/Lock.h> +#include <wtf/MainThread.h> +#include <wtf/RunLoop.h> +#include <wtf/ThreadSafeRefCounted.h> + +namespace WebCore { + +template <typename T> +class MainThreadNotifier final : public ThreadSafeRefCounted<MainThreadNotifier<T>> { +public: + static Ref<MainThreadNotifier> create() + { + return adoptRef(*new MainThreadNotifier()); + } + + template<typename F> + void notify(T notificationType, const F& callbackFunctor) + { + ASSERT(m_isValid.load()); + if (isMainThread()) { + removePendingNotification(notificationType); + callbackFunctor(); + return; + } + + if (!addPendingNotification(notificationType)) + return; + + RunLoop::main().dispatch([this, protectedThis = makeRef(*this), notificationType, callback = std::function<void()>(callbackFunctor)] { + if (!m_isValid.load()) + return; + if (removePendingNotification(notificationType)) + callback(); + }); + } + + void cancelPendingNotifications(unsigned mask = 0) + { + ASSERT(m_isValid.load()); + LockHolder locker(m_pendingNotificationsLock); + if (mask) + m_pendingNotifications &= ~mask; + else + m_pendingNotifications = 0; + } + + void invalidate() + { + ASSERT(m_isValid.load()); + m_isValid.store(false); + } + +private: + MainThreadNotifier() + { + m_isValid.store(true); + } + + bool addPendingNotification(T notificationType) + { + LockHolder locker(m_pendingNotificationsLock); + if (notificationType & m_pendingNotifications) + return false; + m_pendingNotifications |= notificationType; + return true; + } + + bool removePendingNotification(T notificationType) + { + LockHolder locker(m_pendingNotificationsLock); + if (notificationType & m_pendingNotifications) { + m_pendingNotifications &= ~notificationType; + return true; + } + return false; + } + + Lock m_pendingNotificationsLock; + unsigned m_pendingNotifications { 0 }; + Atomic<bool> m_isValid; +}; + +} // namespace WebCore + |