From 2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Mon, 7 May 2012 11:21:11 +0200 Subject: Imported WebKit commit 7e538425aa020340619e927792f3d895061fb54b (http://svn.webkit.org/repository/webkit/trunk@116286) --- Source/JavaScriptCore/wtf/MessageQueue.h | 226 ------------------------------- 1 file changed, 226 deletions(-) delete mode 100644 Source/JavaScriptCore/wtf/MessageQueue.h (limited to 'Source/JavaScriptCore/wtf/MessageQueue.h') diff --git a/Source/JavaScriptCore/wtf/MessageQueue.h b/Source/JavaScriptCore/wtf/MessageQueue.h deleted file mode 100644 index dda852fe1..000000000 --- a/Source/JavaScriptCore/wtf/MessageQueue.h +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright (C) 2008 Apple Inc. All rights reserved. - * Copyright (C) 2009 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef MessageQueue_h -#define MessageQueue_h - -#include -#include -#include -#include -#include - -namespace WTF { - - enum MessageQueueWaitResult { - MessageQueueTerminated, // Queue was destroyed while waiting for message. - MessageQueueTimeout, // Timeout was specified and it expired. - MessageQueueMessageReceived // A message was successfully received and returned. - }; - - // The queue takes ownership of messages and transfer it to the new owner - // when messages are fetched from the queue. - // Essentially, MessageQueue acts as a queue of OwnPtr. - template - class MessageQueue { - WTF_MAKE_NONCOPYABLE(MessageQueue); - public: - MessageQueue() : m_killed(false) { } - ~MessageQueue(); - - void append(PassOwnPtr); - bool appendAndCheckEmpty(PassOwnPtr); - void prepend(PassOwnPtr); - - PassOwnPtr waitForMessage(); - PassOwnPtr tryGetMessage(); - PassOwnPtr tryGetMessageIgnoringKilled(); - template - PassOwnPtr waitForMessageFilteredWithTimeout(MessageQueueWaitResult&, Predicate&, double absoluteTime); - - template - void removeIf(Predicate&); - - void kill(); - bool killed() const; - - // The result of isEmpty() is only valid if no other thread is manipulating the queue at the same time. - bool isEmpty(); - - static double infiniteTime() { return std::numeric_limits::max(); } - - private: - static bool alwaysTruePredicate(DataType*) { return true; } - - mutable Mutex m_mutex; - ThreadCondition m_condition; - Deque m_queue; - bool m_killed; - }; - - template - MessageQueue::~MessageQueue() - { - deleteAllValues(m_queue); - } - - template - inline void MessageQueue::append(PassOwnPtr message) - { - MutexLocker lock(m_mutex); - m_queue.append(message.leakPtr()); - m_condition.signal(); - } - - // Returns true if the queue was empty before the item was added. - template - inline bool MessageQueue::appendAndCheckEmpty(PassOwnPtr message) - { - MutexLocker lock(m_mutex); - bool wasEmpty = m_queue.isEmpty(); - m_queue.append(message.leakPtr()); - m_condition.signal(); - return wasEmpty; - } - - template - inline void MessageQueue::prepend(PassOwnPtr message) - { - MutexLocker lock(m_mutex); - m_queue.prepend(message.leakPtr()); - m_condition.signal(); - } - - template - inline PassOwnPtr MessageQueue::waitForMessage() - { - MessageQueueWaitResult exitReason; - OwnPtr result = waitForMessageFilteredWithTimeout(exitReason, MessageQueue::alwaysTruePredicate, infiniteTime()); - ASSERT(exitReason == MessageQueueTerminated || exitReason == MessageQueueMessageReceived); - return result.release(); - } - - template - template - inline PassOwnPtr MessageQueue::waitForMessageFilteredWithTimeout(MessageQueueWaitResult& result, Predicate& predicate, double absoluteTime) - { - MutexLocker lock(m_mutex); - bool timedOut = false; - - DequeConstIterator found = m_queue.end(); - while (!m_killed && !timedOut && (found = m_queue.findIf(predicate)) == m_queue.end()) - timedOut = !m_condition.timedWait(m_mutex, absoluteTime); - - ASSERT(!timedOut || absoluteTime != infiniteTime()); - - if (m_killed) { - result = MessageQueueTerminated; - return nullptr; - } - - if (timedOut) { - result = MessageQueueTimeout; - return nullptr; - } - - ASSERT(found != m_queue.end()); - OwnPtr message = adoptPtr(*found); - m_queue.remove(found); - result = MessageQueueMessageReceived; - return message.release(); - } - - template - inline PassOwnPtr MessageQueue::tryGetMessage() - { - MutexLocker lock(m_mutex); - if (m_killed) - return nullptr; - if (m_queue.isEmpty()) - return nullptr; - - return adoptPtr(m_queue.takeFirst()); - } - - template - inline PassOwnPtr MessageQueue::tryGetMessageIgnoringKilled() - { - MutexLocker lock(m_mutex); - if (m_queue.isEmpty()) - return nullptr; - - return adoptPtr(m_queue.takeFirst()); - } - - template - template - inline void MessageQueue::removeIf(Predicate& predicate) - { - MutexLocker lock(m_mutex); - DequeConstIterator found = m_queue.end(); - while ((found = m_queue.findIf(predicate)) != m_queue.end()) { - DataType* message = *found; - m_queue.remove(found); - delete message; - } - } - - template - inline bool MessageQueue::isEmpty() - { - MutexLocker lock(m_mutex); - if (m_killed) - return true; - return m_queue.isEmpty(); - } - - template - inline void MessageQueue::kill() - { - MutexLocker lock(m_mutex); - m_killed = true; - m_condition.broadcast(); - } - - template - inline bool MessageQueue::killed() const - { - MutexLocker lock(m_mutex); - return m_killed; - } -} // namespace WTF - -using WTF::MessageQueue; -// MessageQueueWaitResult enum and all its values. -using WTF::MessageQueueWaitResult; -using WTF::MessageQueueTerminated; -using WTF::MessageQueueTimeout; -using WTF::MessageQueueMessageReceived; - -#endif // MessageQueue_h -- cgit v1.2.1