1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_MESSAGE_QUEUE_H 18 #define ANDROID_MESSAGE_QUEUE_H 19 20 #include <stdint.h> 21 #include <errno.h> 22 #include <sys/types.h> 23 24 #include <utils/threads.h> 25 #include <utils/Timers.h> 26 #include <utils/List.h> 27 28 29 namespace android { 30 31 // --------------------------------------------------------------------------- 32 33 class MessageBase; 34 35 class MessageList 36 { 37 List< sp<MessageBase> > mList; 38 typedef List< sp<MessageBase> > LIST; 39 public: 40 typedef sp<MessageBase> value_type; begin()41 inline LIST::iterator begin() { return mList.begin(); } begin()42 inline LIST::const_iterator begin() const { return mList.begin(); } end()43 inline LIST::iterator end() { return mList.end(); } end()44 inline LIST::const_iterator end() const { return mList.end(); } isEmpty()45 inline bool isEmpty() const { return mList.empty(); } 46 void insert(const sp<MessageBase>& node); 47 void remove(LIST::iterator pos); 48 }; 49 50 // ============================================================================ 51 52 class MessageBase : 53 public LightRefBase<MessageBase> 54 { 55 public: 56 nsecs_t when; 57 uint32_t what; 58 int32_t arg0; 59 MessageBase()60 MessageBase() : when(0), what(0), arg0(0) { } 61 MessageBase(uint32_t what, int32_t arg0=0) 62 : when(0), what(what), arg0(arg0) { } 63 64 // return true if message has a handler handler()65 virtual bool handler() { return false; } 66 67 protected: ~MessageBase()68 virtual ~MessageBase() { } 69 70 private: 71 friend class LightRefBase<MessageBase>; 72 }; 73 74 inline bool operator < (const MessageBase& lhs, const MessageBase& rhs) { 75 return lhs.when < rhs.when; 76 } 77 78 // --------------------------------------------------------------------------- 79 80 class MessageQueue 81 { 82 typedef List< sp<MessageBase> > LIST; 83 public: 84 85 // this is a work-around the multichar constant warning. A macro would 86 // work too, but would pollute the namespace. 87 template <int a, int b, int c, int d> 88 struct WHAT { 89 static const uint32_t Value = 90 (uint32_t(a&0xff)<<24)|(uint32_t(b&0xff)<<16)| 91 (uint32_t(c&0xff)<<8)|uint32_t(d&0xff); 92 }; 93 94 MessageQueue(); 95 ~MessageQueue(); 96 97 // pre-defined messages 98 enum { 99 INVALIDATE = WHAT<'_','p','d','t'>::Value 100 }; 101 102 MessageList::value_type waitMessage(nsecs_t timeout = -1); 103 104 status_t postMessage(const MessageList::value_type& message, 105 nsecs_t reltime=0, uint32_t flags = 0); 106 107 status_t invalidate(); 108 109 void dump(const MessageList::value_type& message); 110 111 private: 112 status_t queueMessage(const MessageList::value_type& message, 113 nsecs_t reltime, uint32_t flags); 114 void dumpLocked(const MessageList::value_type& message); 115 116 Mutex mLock; 117 Condition mCondition; 118 MessageList mMessages; 119 bool mInvalidate; 120 MessageList::value_type mInvalidateMessage; 121 }; 122 123 // --------------------------------------------------------------------------- 124 125 }; // namespace android 126 127 #endif /* ANDROID_MESSAGE_QUEUE_H */ 128