diff options
author | Patrick Scott <phanna@android.com> | 2010-06-16 11:34:35 -0400 |
---|---|---|
committer | Patrick Scott <phanna@android.com> | 2010-06-21 10:24:02 -0400 |
commit | 43fbbb2aa64694b5006656423cd74e4ab1e65fba (patch) | |
tree | 83fe63fd712aba9c94af739712ecd81c78209e41 /WebKit/android/smoke/MessageThread.h | |
parent | b94a30def72cdfa7401b9b0b960385e3a92afa94 (diff) | |
download | external_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.h | 108 |
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 |