159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown/* 259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Copyright (C) 2010 The Android Open Source Project 359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * you may not use this file except in compliance with the License. 659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * You may obtain a copy of the License at 759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * http://www.apache.org/licenses/LICENSE-2.0 959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 1059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Unless required by applicable law or agreed to in writing, software 1159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 1259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * See the License for the specific language governing permissions and 1459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * limitations under the License. 1559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown */ 1659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 1759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown#ifndef UTILS_LOOPER_H 1859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown#define UTILS_LOOPER_H 1959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 2059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown#include <utils/threads.h> 2159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown#include <utils/RefBase.h> 2259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown#include <utils/KeyedVector.h> 2354e1cdacd2b132997fdca5e5b90e45855c7a2a95Jeff Brown#include <utils/Timers.h> 2459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 2559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown#include <android/looper.h> 2659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 2754e1cdacd2b132997fdca5e5b90e45855c7a2a95Jeff Brown#include <sys/epoll.h> 2854e1cdacd2b132997fdca5e5b90e45855c7a2a95Jeff Brown 2959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown/* 3059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Declare a concrete type for the NDK's looper forward declaration. 3159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown */ 3259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownstruct ALooper { 3359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}; 3459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 3559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownnamespace android { 3659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 3759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown/** 3880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * A message that can be posted to a Looper. 3980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown */ 4080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brownstruct Message { 4180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown Message() : what(0) { } 4280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown Message(int what) : what(what) { } 4380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 4480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown /* The message type. (interpretation is left up to the handler) */ 4580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown int what; 4680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown}; 4780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 4880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 4980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown/** 5080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * Interface for a Looper message handler. 5180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * 5280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * The Looper holds a strong reference to the message handler whenever it has 5380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * a message to deliver to it. Make sure to call Looper::removeMessages 5480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * to remove any pending messages destined for the handler so that the handler 5580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * can be destroyed. 5680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown */ 5780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brownclass MessageHandler : public virtual RefBase { 5880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brownprotected: 5980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown virtual ~MessageHandler() { } 6080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 6180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brownpublic: 6280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown /** 6380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * Handles a message. 6480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown */ 6580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown virtual void handleMessage(const Message& message) = 0; 6680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown}; 6780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 6880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 6980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown/** 7080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * A simple proxy that holds a weak reference to a message handler. 7180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown */ 7280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brownclass WeakMessageHandler : public MessageHandler { 73af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brownprotected: 74af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown virtual ~WeakMessageHandler(); 75af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown 7680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brownpublic: 7780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown WeakMessageHandler(const wp<MessageHandler>& handler); 7880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown virtual void handleMessage(const Message& message); 7980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 8080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brownprivate: 8180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown wp<MessageHandler> mHandler; 8280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown}; 8380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 8480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 8580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown/** 86af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * A looper callback. 87af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown */ 88af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brownclass LooperCallback : public virtual RefBase { 89af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brownprotected: 90af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown virtual ~LooperCallback() { } 91af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown 92af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brownpublic: 93af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown /** 94af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * Handles a poll event for the given file descriptor. 95af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * It is given the file descriptor it is associated with, 96af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * a bitmask of the poll events that were triggered (typically ALOOPER_EVENT_INPUT), 97af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * and the data pointer that was originally supplied. 98af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * 99af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * Implementations should return 1 to continue receiving callbacks, or 0 100af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * to have this file descriptor and callback unregistered from the looper. 101af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown */ 102af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown virtual int handleEvent(int fd, int events, void* data) = 0; 103af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown}; 104af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown 105af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown 106af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown/** 107af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * Wraps a ALooper_callbackFunc function pointer. 108af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown */ 109af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brownclass SimpleLooperCallback : public LooperCallback { 110af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brownprotected: 111af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown virtual ~SimpleLooperCallback(); 112af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown 113af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brownpublic: 114af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown SimpleLooperCallback(ALooper_callbackFunc callback); 115af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown virtual int handleEvent(int fd, int events, void* data); 116af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown 117af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brownprivate: 118af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown ALooper_callbackFunc mCallback; 119af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown}; 120af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown 121af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown 122af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown/** 12359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * A polling loop that supports monitoring file descriptor events, optionally 12459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * using callbacks. The implementation uses epoll() internally. 12559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 12659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * A looper can be associated with a thread although there is no requirement that it must be. 12759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown */ 12859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownclass Looper : public ALooper, public RefBase { 12959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownprotected: 13059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown virtual ~Looper(); 13159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 13259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownpublic: 13359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown /** 13459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Creates a looper. 13559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 13659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * If allowNonCallbaks is true, the looper will allow file descriptors to be 13759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * registered without associated callbacks. This assumes that the caller of 13859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * pollOnce() is prepared to handle callback-less events itself. 13959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown */ 14059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown Looper(bool allowNonCallbacks); 14159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 14259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown /** 14359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Returns whether this looper instance allows the registration of file descriptors 14459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * using identifiers instead of callbacks. 14559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown */ 14659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown bool getAllowNonCallbacks() const; 14759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 14859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown /** 14959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Waits for events to be available, with optional timeout in milliseconds. 15059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Invokes callbacks for all file descriptors on which an event occurred. 15159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 15259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * If the timeout is zero, returns immediately without blocking. 15359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * If the timeout is negative, waits indefinitely until an event appears. 15459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 15559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Returns ALOOPER_POLL_WAKE if the poll was awoken using wake() before 15659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * the timeout expired and no callbacks were invoked and no other file 15759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * descriptors were ready. 15859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 15959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Returns ALOOPER_POLL_CALLBACK if one or more callbacks were invoked. 16059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 16159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Returns ALOOPER_POLL_TIMEOUT if there was no data before the given 16259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * timeout expired. 16359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 16459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Returns ALOOPER_POLL_ERROR if an error occurred. 16559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 16659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Returns a value >= 0 containing an identifier if its file descriptor has data 16759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * and it has no callback function (requiring the caller here to handle it). 16859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * In this (and only this) case outFd, outEvents and outData will contain the poll 16959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * events and data associated with the fd, otherwise they will be set to NULL. 17059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 17159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * This method does not return until it has finished invoking the appropriate callbacks 17259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * for all file descriptors that were signalled. 17359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown */ 174b0619e8ad8e258f3e87a78a3a23c353d98efafa7Jeff Brown int pollOnce(int timeoutMillis, int* outFd, int* outEvents, void** outData); 175b0619e8ad8e258f3e87a78a3a23c353d98efafa7Jeff Brown inline int pollOnce(int timeoutMillis) { 176b0619e8ad8e258f3e87a78a3a23c353d98efafa7Jeff Brown return pollOnce(timeoutMillis, NULL, NULL, NULL); 177b0619e8ad8e258f3e87a78a3a23c353d98efafa7Jeff Brown } 17859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 17959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown /** 18059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Like pollOnce(), but performs all pending callbacks until all 18159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * data has been consumed or a file descriptor is available with no callback. 18259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * This function will never return ALOOPER_POLL_CALLBACK. 18359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown */ 184b0619e8ad8e258f3e87a78a3a23c353d98efafa7Jeff Brown int pollAll(int timeoutMillis, int* outFd, int* outEvents, void** outData); 185b0619e8ad8e258f3e87a78a3a23c353d98efafa7Jeff Brown inline int pollAll(int timeoutMillis) { 186b0619e8ad8e258f3e87a78a3a23c353d98efafa7Jeff Brown return pollAll(timeoutMillis, NULL, NULL, NULL); 187b0619e8ad8e258f3e87a78a3a23c353d98efafa7Jeff Brown } 18859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 18959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown /** 19059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Wakes the poll asynchronously. 19159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 19259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * This method can be called on any thread. 19359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * This method returns immediately. 19459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown */ 19559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown void wake(); 19659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 19759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown /** 19859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Adds a new file descriptor to be polled by the looper. 19959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * If the same file descriptor was previously added, it is replaced. 20059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 20159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * "fd" is the file descriptor to be added. 202af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * "ident" is an identifier for this event, which is returned from pollOnce(). 20359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * The identifier must be >= 0, or ALOOPER_POLL_CALLBACK if providing a non-NULL callback. 20459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * "events" are the poll events to wake up on. Typically this is ALOOPER_EVENT_INPUT. 20559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * "callback" is the function to call when there is an event on the file descriptor. 20659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * "data" is a private data pointer to supply to the callback. 20759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 20859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * There are two main uses of this function: 20959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 21059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * (1) If "callback" is non-NULL, then this function will be called when there is 21159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * data on the file descriptor. It should execute any events it has pending, 21259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * appropriately reading from the file descriptor. The 'ident' is ignored in this case. 21359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 21459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * (2) If "callback" is NULL, the 'ident' will be returned by ALooper_pollOnce 21559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * when its file descriptor has data available, requiring the caller to take 21659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * care of processing it. 21759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 21859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Returns 1 if the file descriptor was added, 0 if the arguments were invalid. 21959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 22059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * This method can be called on any thread. 22159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * This method may block briefly if it needs to wake the poll. 222af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * 223af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * The callback may either be specified as a bare function pointer or as a smart 224af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * pointer callback object. The smart pointer should be preferred because it is 225af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * easier to avoid races when the callback is removed from a different thread. 226af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * See removeFd() for details. 22759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown */ 228b0619e8ad8e258f3e87a78a3a23c353d98efafa7Jeff Brown int addFd(int fd, int ident, int events, ALooper_callbackFunc callback, void* data); 229af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown int addFd(int fd, int ident, int events, const sp<LooperCallback>& callback, void* data); 23059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 23159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown /** 23259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Removes a previously added file descriptor from the looper. 23359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 23459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * When this method returns, it is safe to close the file descriptor since the looper 23559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * will no longer have a reference to it. However, it is possible for the callback to 23659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * already be running or for it to run one last time if the file descriptor was already 23759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * signalled. Calling code is responsible for ensuring that this case is safely handled. 23859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * For example, if the callback takes care of removing itself during its own execution either 23959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * by returning 0 or by calling this method, then it can be guaranteed to not be invoked 24059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * again at any later time unless registered anew. 24159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 242af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * A simple way to avoid this problem is to use the version of addFd() that takes 243af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * a sp<LooperCallback> instead of a bare function pointer. The LooperCallback will 244af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * be released at the appropriate time by the Looper. 245af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown * 24659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Returns 1 if the file descriptor was removed, 0 if none was previously registered. 24759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 24859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * This method can be called on any thread. 24959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * This method may block briefly if it needs to wake the poll. 25059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown */ 25159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown int removeFd(int fd); 25259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 25359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown /** 25480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * Enqueues a message to be processed by the specified handler. 25580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * 25680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * The handler must not be null. 25780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * This method can be called on any thread. 25880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown */ 25980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown void sendMessage(const sp<MessageHandler>& handler, const Message& message); 26080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 26180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown /** 26280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * Enqueues a message to be processed by the specified handler after all pending messages 26380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * after the specified delay. 26480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * 26580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * The time delay is specified in uptime nanoseconds. 26680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * The handler must not be null. 26780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * This method can be called on any thread. 26880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown */ 26980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown void sendMessageDelayed(nsecs_t uptimeDelay, const sp<MessageHandler>& handler, 27080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown const Message& message); 27180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 27280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown /** 27380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * Enqueues a message to be processed by the specified handler after all pending messages 27480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * at the specified time. 27580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * 27680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * The time is specified in uptime nanoseconds. 27780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * The handler must not be null. 27880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * This method can be called on any thread. 27980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown */ 28080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown void sendMessageAtTime(nsecs_t uptime, const sp<MessageHandler>& handler, 28180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown const Message& message); 28280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 28380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown /** 28480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * Removes all messages for the specified handler from the queue. 28580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * 28680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * The handler must not be null. 28780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * This method can be called on any thread. 28880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown */ 28980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown void removeMessages(const sp<MessageHandler>& handler); 29080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 29180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown /** 29280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * Removes all messages of a particular type for the specified handler from the queue. 29380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * 29480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * The handler must not be null. 29580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown * This method can be called on any thread. 29680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown */ 29780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown void removeMessages(const sp<MessageHandler>& handler, int what); 29880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 29980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown /** 30059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Prepares a looper associated with the calling thread, and returns it. 30159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * If the thread already has a looper, it is returned. Otherwise, a new 30259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * one is created, associated with the thread, and returned. 30359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 30459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * The opts may be ALOOPER_PREPARE_ALLOW_NON_CALLBACKS or 0. 30559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown */ 30659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown static sp<Looper> prepare(int opts); 30759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 30859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown /** 30959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Sets the given looper to be associated with the calling thread. 31059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * If another looper is already associated with the thread, it is replaced. 31159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * 31259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * If "looper" is NULL, removes the currently associated looper. 31359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown */ 31459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown static void setForThread(const sp<Looper>& looper); 31559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 31659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown /** 31759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * Returns the looper associated with the calling thread, or NULL if 31859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown * there is not one. 31959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown */ 32059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown static sp<Looper> getForThread(); 32159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 32259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownprivate: 32359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown struct Request { 32459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown int fd; 32559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown int ident; 326af567f73ac828b9c319c12fd92760c4c92f0dfa4Jeff Brown sp<LooperCallback> callback; 32759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown void* data; 32859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown }; 32959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 33059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown struct Response { 33159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown int events; 33259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown Request request; 33359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown }; 33459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 33580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown struct MessageEnvelope { 33680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown MessageEnvelope() : uptime(0) { } 33780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 33880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown MessageEnvelope(nsecs_t uptime, const sp<MessageHandler> handler, 33980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown const Message& message) : uptime(uptime), handler(handler), message(message) { 34080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown } 34180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 34280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown nsecs_t uptime; 34380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown sp<MessageHandler> handler; 34480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown Message message; 34580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown }; 34680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 34759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown const bool mAllowNonCallbacks; // immutable 34859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 34959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown int mWakeReadPipeFd; // immutable 35059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown int mWakeWritePipeFd; // immutable 35154e1cdacd2b132997fdca5e5b90e45855c7a2a95Jeff Brown Mutex mLock; 35254e1cdacd2b132997fdca5e5b90e45855c7a2a95Jeff Brown 35380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown Vector<MessageEnvelope> mMessageEnvelopes; // guarded by mLock 35480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown bool mSendingMessage; // guarded by mLock 35580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown 35654e1cdacd2b132997fdca5e5b90e45855c7a2a95Jeff Brown int mEpollFd; // immutable 35759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 35859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown // Locked list of file descriptor monitoring requests. 35954e1cdacd2b132997fdca5e5b90e45855c7a2a95Jeff Brown KeyedVector<int, Request> mRequests; // guarded by mLock 36054e1cdacd2b132997fdca5e5b90e45855c7a2a95Jeff Brown 36159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown // This state is only used privately by pollOnce and does not require a lock since 36259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown // it runs on a single thread. 36359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown Vector<Response> mResponses; 36459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown size_t mResponseIndex; 36580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown nsecs_t mNextMessageUptime; // set to LLONG_MAX when none 36659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 36759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown int pollInner(int timeoutMillis); 36854e1cdacd2b132997fdca5e5b90e45855c7a2a95Jeff Brown void awoken(); 36954e1cdacd2b132997fdca5e5b90e45855c7a2a95Jeff Brown void pushResponse(int events, const Request& request); 37059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 37161a25b249066baed0fdab0411f44a2c6b7292766Jeff Brown static void initTLSKey(); 37259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown static void threadDestructor(void *st); 37359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}; 37459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 37559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown} // namespace android 37659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown 37759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown#endif // UTILS_LOOPER_H 378