MessageQueue.cpp revision 222893641184014306a26a9d58690c8415181d12
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#include <stdint.h> 18#include <errno.h> 19#include <sys/types.h> 20 21#include <utils/threads.h> 22#include <utils/Timers.h> 23#include <utils/Log.h> 24#include <binder/IPCThreadState.h> 25 26#include "MessageQueue.h" 27 28namespace android { 29 30// --------------------------------------------------------------------------- 31 32MessageBase::MessageBase() 33 : MessageHandler() { 34} 35 36MessageBase::~MessageBase() { 37} 38 39void MessageBase::handleMessage(const Message&) { 40 this->handler(); 41 barrier.open(); 42}; 43 44// --------------------------------------------------------------------------- 45 46MessageQueue::MessageQueue() 47 : mLooper(new Looper(true)) 48{ 49} 50 51MessageQueue::~MessageQueue() { 52} 53 54void MessageQueue::waitMessage() { 55 do { 56 IPCThreadState::self()->flushCommands(); 57 58 int32_t ret = mLooper->pollOnce(-1); 59 switch (ret) { 60 case ALOOPER_POLL_WAKE: 61 // we got woken-up there is work to do in the main loop 62 return; 63 64 case ALOOPER_POLL_CALLBACK: 65 // callback was handled, loop again 66 continue; 67 68 case ALOOPER_POLL_TIMEOUT: 69 // timeout (should not happen) 70 continue; 71 72 case ALOOPER_POLL_ERROR: 73 LOGE("ALOOPER_POLL_ERROR"); 74 continue; 75 76 default: 77 // should not happen 78 LOGE("Looper::pollOnce() returned unknown status %d", ret); 79 continue; 80 } 81 } while (true); 82} 83 84status_t MessageQueue::postMessage( 85 const sp<MessageBase>& messageHandler, nsecs_t relTime) 86{ 87 const Message dummyMessage; 88 if (relTime > 0) { 89 mLooper->sendMessageDelayed(relTime, messageHandler, dummyMessage); 90 } else { 91 mLooper->sendMessage(messageHandler, dummyMessage); 92 } 93 return NO_ERROR; 94} 95 96status_t MessageQueue::invalidate() { 97 mLooper->wake(); 98 return NO_ERROR; 99} 100 101// --------------------------------------------------------------------------- 102 103}; // namespace android 104