summaryrefslogtreecommitdiffstats
path: root/WebKit/android/smoke/MessageThread.h
diff options
context:
space:
mode:
authorPatrick Scott <phanna@android.com>2010-06-16 11:34:35 -0400
committerPatrick Scott <phanna@android.com>2010-06-21 10:24:02 -0400
commit43fbbb2aa64694b5006656423cd74e4ab1e65fba (patch)
tree83fe63fd712aba9c94af739712ecd81c78209e41 /WebKit/android/smoke/MessageThread.h
parentb94a30def72cdfa7401b9b0b960385e3a92afa94 (diff)
downloadexternal_webkit-43fbbb2aa64694b5006656423cd74e4ab1e65fba.zip
external_webkit-43fbbb2aa64694b5006656423cd74e4ab1e65fba.tar.gz
external_webkit-43fbbb2aa64694b5006656423cd74e4ab1e65fba.tar.bz2
Initial messaging model for project 'smoke'
Not compiled yet as it is unused (without other patches). I wanted to start getting something committed so Derek and I can work together on the next part. Change-Id: I5dba6107e572c9be402d75df49c3c69e2c527590
Diffstat (limited to 'WebKit/android/smoke/MessageThread.h')
-rw-r--r--WebKit/android/smoke/MessageThread.h108
1 files changed, 108 insertions, 0 deletions
diff --git a/WebKit/android/smoke/MessageThread.h b/WebKit/android/smoke/MessageThread.h
new file mode 100644
index 0000000..ca0115b
--- /dev/null
+++ b/WebKit/android/smoke/MessageThread.h
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2010, The Android Open Source Project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 THE COPYRIGHT OWNER OR
+ * 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 ANDROID_WEBKIT_MESSAGETHREAD_H
+#define ANDROID_WEBKIT_MESSAGETHREAD_H
+
+#include <list>
+
+#include "MessageTypes.h"
+
+#include <utils/threads.h>
+
+using std::list;
+
+namespace android {
+
+class MessageQueue {
+public:
+ MessageQueue() {}
+
+ // Return true if the queue has messages with the given object and member
+ // function. If member is null, return true if the message has the same
+ // object.
+ template <class T>
+ bool hasMessages(T* object, void (T::*member)(void));
+
+ // Remove all messages with the given object and member function. If
+ // member is null, remove all messages with the given object.
+ template <class T>
+ void remove(T* object, void (T::*member)(void));
+
+ // Post a new message to the queue.
+ void post(Message* closure);
+
+ // Post a new message at the front of the queue.
+ void postAtFront(Message* closure);
+
+ // Obtain the next message. Blocks until either a new message arrives or
+ // we reach the time of the next message.
+ Message* next();
+
+private:
+ bool hasMessages(const Message& message);
+ void remove(const Message& message);
+
+ list<Message*> m_messages;
+ Mutex m_mutex;
+ Condition m_condition;
+};
+
+template <class T>
+bool MessageQueue::hasMessages(T* object, void (T::*member)(void)) {
+ MemberFunctionMessage<T, void> message(object, member);
+ return hasMessages(message);
+}
+
+template <class T>
+void MessageQueue::remove(T* object, void (T::*member)(void)) {
+ MemberFunctionMessage<T, void> message(object, member);
+ remove(message);
+}
+
+class MessageThread : public Thread {
+public:
+ MessageQueue& queue() { return m_queue; }
+
+private:
+ MessageThread() : Thread(true /* canCallJava */) {}
+
+ virtual bool threadLoop();
+
+ MessageQueue m_queue;
+ // Used for thread initialization
+ Mutex m_mutex;
+ Condition m_condition;
+
+ friend MessageThread* messageThread();
+};
+
+// Get (possibly creating) the global MessageThread object used to pass
+// messages to WebCore.
+MessageThread* messageThread();
+
+} // namespace android
+
+#endif // ANDROID_WEBKIT_MESSAGETHREAD_H