2009-02-19 David Levin <levin@chromium.org>
authorlevin@chromium.org <levin@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 19 Feb 2009 19:40:07 +0000 (19:40 +0000)
committerlevin@chromium.org <levin@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 19 Feb 2009 19:40:07 +0000 (19:40 +0000)
        Reviewed by Alexey Proskuryakov.

        Bug 23976: MessageQueue needs a way to wait for a message that satisfies an arbitrary criteria.
        <https://bugs.webkit.org/show_bug.cgi?id=23976>

        * wtf/Deque.h:
        (WTF::Deque<T>::findIf):
        * wtf/MessageQueue.h:
        (WTF::MessageQueue<T>::waitForMessageFiltered):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@41081 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/wtf/Deque.h
JavaScriptCore/wtf/MessageQueue.h

index 7b14d2823edbfa7fa680aff4d505d80a196f97b5..83adc8c5cf0e9d73a3667aabeac0f22228ed52e0 100644 (file)
@@ -1,3 +1,15 @@
+2009-02-19  David Levin  <levin@chromium.org>
+
+        Reviewed by Alexey Proskuryakov.
+
+        Bug 23976: MessageQueue needs a way to wait for a message that satisfies an arbitrary criteria.
+        <https://bugs.webkit.org/show_bug.cgi?id=23976>
+
+        * wtf/Deque.h:
+        (WTF::Deque<T>::findIf):
+        * wtf/MessageQueue.h:
+        (WTF::MessageQueue<T>::waitForMessageFiltered):
+
 2009-02-18  David Levin  <levin@chromium.org>
 
         Reviewed by Alexey Proskuryakov.
index 22b29c9097f5d29f1c335d42bcddeaa204714171..c371d383f23a32e0eff9603a6048299f75d14765 100644 (file)
@@ -81,6 +81,9 @@ namespace WTF {
 
         void clear();
 
+        template<typename Predicate>
+        iterator findIf(Predicate&);
+
     private:
         friend class DequeIteratorBase<T>;
 
@@ -353,7 +356,7 @@ namespace WTF {
         destroyAll();
     }
 
-    template <typename T>
+    template<typename T>
     inline void Deque<T>::swap(Deque<T>& other)
     {
         checkValidity();
@@ -366,7 +369,7 @@ namespace WTF {
         other.checkValidity();
     }
 
-    template <typename T>
+    template<typename T>
     inline void Deque<T>::clear()
     {
         checkValidity();
@@ -377,6 +380,18 @@ namespace WTF {
         checkValidity();
     }
 
+    template<typename T>
+    template<typename Predicate>
+    inline DequeIterator<T> Deque<T>::findIf(Predicate& predicate)
+    {
+        iterator end_iterator = end();
+        for (iterator it = begin(); it != end_iterator; ++it) {
+            if (predicate(*it))
+                return it;
+        }
+        return end_iterator;
+    }
+
     template<typename T>
     inline void Deque<T>::expandCapacityIfNeeded()
     {
index 19c5c10fede9649a519bb480ba00b2212a0bc85f..b6699f8841d4f12e086cc1397b4ca58a3940801e 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * 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
@@ -50,6 +51,8 @@ namespace WTF {
         void append(const DataType&);
         void prepend(const DataType&);
         bool waitForMessage(DataType&);
+        template<typename Predicate>
+        MessageQueueWaitResult waitForMessageFiltered(DataType&, Predicate&);
         MessageQueueWaitResult waitForMessageTimed(DataType&, double absoluteTime);
         void kill();
 
@@ -99,6 +102,25 @@ namespace WTF {
         return true;
     }
 
+    template<typename DataType>
+    template<typename Predicate>
+    inline MessageQueueWaitResult MessageQueue<DataType>::waitForMessageFiltered(DataType& result, Predicate& predicate)
+    {
+        MutexLocker lock(m_mutex);
+
+        DequeConstIterator<DataType> found = m_queue.end();
+        while (!m_killed && (found = m_queue.findIf(predicate)) == m_queue.end())
+            m_condition.wait(m_mutex);
+
+        if (m_killed)
+            return MessageQueueTerminated;
+
+        ASSERT(found != m_queue.end());
+        result = *found;
+        m_queue.remove(found);
+        return MessageQueueMessageReceived;
+    }
+
     template<typename DataType>
     inline MessageQueueWaitResult MessageQueue<DataType>::waitForMessageTimed(DataType& result, double absoluteTime)
     {
@@ -157,7 +179,7 @@ namespace WTF {
         MutexLocker lock(m_mutex);
         return m_killed;
     }
-}
+} // namespace WTF
 
 using WTF::MessageQueue;
 // MessageQueueWaitResult enum and all its values.