Looper.h revision 7a0310ef678edcf06acfd230617c427a788e58f8
17901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown/* 27901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * Copyright (C) 2010 The Android Open Source Project 37901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 47901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 57901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * you may not use this file except in compliance with the License. 67901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * You may obtain a copy of the License at 77901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 87901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 97901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 107901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * Unless required by applicable law or agreed to in writing, software 117901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 127901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * See the License for the specific language governing permissions and 147901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * limitations under the License. 157901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown */ 167901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 177901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown#ifndef UTILS_LOOPER_H 187901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown#define UTILS_LOOPER_H 197901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 207901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown#include <utils/threads.h> 217901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown#include <utils/RefBase.h> 227901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown#include <utils/KeyedVector.h> 238d15c74d50fd01d6e63970aadd261a9d3bed27e7Jeff Brown#include <utils/Timers.h> 247901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 258d15c74d50fd01d6e63970aadd261a9d3bed27e7Jeff Brown#include <sys/epoll.h> 268d15c74d50fd01d6e63970aadd261a9d3bed27e7Jeff Brown 271693d7e48f976c2615100378c7e98d245e0213beBrian Carlstromnamespace android { 281693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom 297901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown/* 301693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * NOTE: Since Looper is used to implement the NDK ALooper, the Looper 311693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * enums and the signature of Looper_callbackFunc need to align with 321693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * that implementation. 337901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown */ 347901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 351693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom/** 361693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * For callback-based event loops, this is the prototype of the function 371693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * that is called when a file descriptor event occurs. 381693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * It is given the file descriptor it is associated with, 391693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * a bitmask of the poll events that were triggered (typically EVENT_INPUT), 401693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * and the data pointer that was originally supplied. 411693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * 421693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * Implementations should return 1 to continue receiving callbacks, or 0 431693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * to have this file descriptor and callback unregistered from the looper. 441693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom */ 451693d7e48f976c2615100378c7e98d245e0213beBrian Carlstromtypedef int (*Looper_callbackFunc)(int fd, int events, void* data); 467901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 477901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown/** 483e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * A message that can be posted to a Looper. 493e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown */ 503e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brownstruct Message { 513e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown Message() : what(0) { } 523e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown Message(int what) : what(what) { } 533e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 543e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown /* The message type. (interpretation is left up to the handler) */ 553e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown int what; 563e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown}; 573e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 583e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 593e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown/** 603e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * Interface for a Looper message handler. 613e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * 623e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * The Looper holds a strong reference to the message handler whenever it has 633e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * a message to deliver to it. Make sure to call Looper::removeMessages 643e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * to remove any pending messages destined for the handler so that the handler 653e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * can be destroyed. 663e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown */ 673e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brownclass MessageHandler : public virtual RefBase { 683e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brownprotected: 693e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown virtual ~MessageHandler() { } 703e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 713e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brownpublic: 723e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown /** 733e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * Handles a message. 743e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown */ 753e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown virtual void handleMessage(const Message& message) = 0; 763e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown}; 773e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 783e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 793e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown/** 803e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * A simple proxy that holds a weak reference to a message handler. 813e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown */ 823e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brownclass WeakMessageHandler : public MessageHandler { 83dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brownprotected: 84dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown virtual ~WeakMessageHandler(); 85dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown 863e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brownpublic: 873e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown WeakMessageHandler(const wp<MessageHandler>& handler); 883e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown virtual void handleMessage(const Message& message); 893e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 903e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brownprivate: 913e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown wp<MessageHandler> mHandler; 923e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown}; 933e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 943e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 953e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown/** 96dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown * A looper callback. 97dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown */ 98dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brownclass LooperCallback : public virtual RefBase { 99dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brownprotected: 100dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown virtual ~LooperCallback() { } 101dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown 102dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brownpublic: 103dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown /** 104dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown * Handles a poll event for the given file descriptor. 105dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown * It is given the file descriptor it is associated with, 1061693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * a bitmask of the poll events that were triggered (typically EVENT_INPUT), 107dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown * and the data pointer that was originally supplied. 108dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown * 109dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown * Implementations should return 1 to continue receiving callbacks, or 0 110dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown * to have this file descriptor and callback unregistered from the looper. 111dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown */ 112dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown virtual int handleEvent(int fd, int events, void* data) = 0; 113dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown}; 114dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown 115dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown/** 1161693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * Wraps a Looper_callbackFunc function pointer. 117dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown */ 118dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brownclass SimpleLooperCallback : public LooperCallback { 119dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brownprotected: 120dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown virtual ~SimpleLooperCallback(); 121dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown 122dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brownpublic: 1231693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom SimpleLooperCallback(Looper_callbackFunc callback); 124dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown virtual int handleEvent(int fd, int events, void* data); 125dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown 126dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brownprivate: 1271693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom Looper_callbackFunc mCallback; 128dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown}; 129dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown 130dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown/** 1317901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * A polling loop that supports monitoring file descriptor events, optionally 1327901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * using callbacks. The implementation uses epoll() internally. 1337901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 1347901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * A looper can be associated with a thread although there is no requirement that it must be. 1357901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown */ 1361693d7e48f976c2615100378c7e98d245e0213beBrian Carlstromclass Looper : public RefBase { 1377901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownprotected: 1387901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown virtual ~Looper(); 1397901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 1407901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownpublic: 1411693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom enum { 1421693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom /** 1431693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * Result from Looper_pollOnce() and Looper_pollAll(): 1441693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * The poll was awoken using wake() before the timeout expired 1451693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * and no callbacks were executed and no other file descriptors were ready. 1461693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom */ 1471693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom POLL_WAKE = -1, 1481693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom 1491693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom /** 1501693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * Result from Looper_pollOnce() and Looper_pollAll(): 1511693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * One or more callbacks were executed. 1521693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom */ 1531693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom POLL_CALLBACK = -2, 1541693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom 1551693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom /** 1561693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * Result from Looper_pollOnce() and Looper_pollAll(): 1571693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * The timeout expired. 1581693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom */ 1591693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom POLL_TIMEOUT = -3, 1601693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom 1611693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom /** 1621693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * Result from Looper_pollOnce() and Looper_pollAll(): 1631693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * An error occurred. 1641693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom */ 1651693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom POLL_ERROR = -4, 1661693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom }; 1671693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom 1681693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom /** 1691693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * Flags for file descriptor events that a looper can monitor. 1701693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * 1711693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * These flag bits can be combined to monitor multiple events at once. 1721693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom */ 1731693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom enum { 1741693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom /** 1751693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * The file descriptor is available for read operations. 1761693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom */ 1771693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom EVENT_INPUT = 1 << 0, 1781693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom 1791693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom /** 1801693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * The file descriptor is available for write operations. 1811693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom */ 1821693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom EVENT_OUTPUT = 1 << 1, 1831693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom 1841693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom /** 1851693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * The file descriptor has encountered an error condition. 1861693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * 1871693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * The looper always sends notifications about errors; it is not necessary 1881693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * to specify this event flag in the requested event set. 1891693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom */ 1901693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom EVENT_ERROR = 1 << 2, 1911693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom 1921693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom /** 1931693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * The file descriptor was hung up. 1941693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * For example, indicates that the remote end of a pipe or socket was closed. 1951693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * 1961693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * The looper always sends notifications about hangups; it is not necessary 1971693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * to specify this event flag in the requested event set. 1981693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom */ 1991693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom EVENT_HANGUP = 1 << 3, 2001693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom 2011693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom /** 2021693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * The file descriptor is invalid. 2031693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * For example, the file descriptor was closed prematurely. 2041693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * 2051693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * The looper always sends notifications about invalid file descriptors; it is not necessary 2061693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * to specify this event flag in the requested event set. 2071693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom */ 2081693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom EVENT_INVALID = 1 << 4, 2091693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom }; 2101693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom 2111693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom enum { 2121693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom /** 2131693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * Option for Looper_prepare: this looper will accept calls to 2141693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * Looper_addFd() that do not have a callback (that is provide NULL 2151693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * for the callback). In this case the caller of Looper_pollOnce() 2161693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * or Looper_pollAll() MUST check the return from these functions to 2171693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * discover when data is available on such fds and process it. 2181693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom */ 2191693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom PREPARE_ALLOW_NON_CALLBACKS = 1<<0 2201693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom }; 2211693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom 2227901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown /** 2237901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * Creates a looper. 2247901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 2257901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * If allowNonCallbaks is true, the looper will allow file descriptors to be 2267901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * registered without associated callbacks. This assumes that the caller of 2277901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * pollOnce() is prepared to handle callback-less events itself. 2287901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown */ 2297901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown Looper(bool allowNonCallbacks); 2307901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 2317901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown /** 2327901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * Returns whether this looper instance allows the registration of file descriptors 2337901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * using identifiers instead of callbacks. 2347901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown */ 2357901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown bool getAllowNonCallbacks() const; 2367901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 2377901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown /** 2387901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * Waits for events to be available, with optional timeout in milliseconds. 2397901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * Invokes callbacks for all file descriptors on which an event occurred. 2407901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 2417901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * If the timeout is zero, returns immediately without blocking. 2427901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * If the timeout is negative, waits indefinitely until an event appears. 2437901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 2441693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * Returns POLL_WAKE if the poll was awoken using wake() before 2457901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * the timeout expired and no callbacks were invoked and no other file 2467901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * descriptors were ready. 2477901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 2481693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * Returns POLL_CALLBACK if one or more callbacks were invoked. 2497901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 2501693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * Returns POLL_TIMEOUT if there was no data before the given 2517901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * timeout expired. 2527901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 2531693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * Returns POLL_ERROR if an error occurred. 2547901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 2557901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * Returns a value >= 0 containing an identifier if its file descriptor has data 2567901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * and it has no callback function (requiring the caller here to handle it). 2577901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * In this (and only this) case outFd, outEvents and outData will contain the poll 2587901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * events and data associated with the fd, otherwise they will be set to NULL. 2597901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 2607901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * This method does not return until it has finished invoking the appropriate callbacks 2617901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * for all file descriptors that were signalled. 2627901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown */ 263905682a19609e862633f01e69bec58384df2cdf7Jeff Brown int pollOnce(int timeoutMillis, int* outFd, int* outEvents, void** outData); 264905682a19609e862633f01e69bec58384df2cdf7Jeff Brown inline int pollOnce(int timeoutMillis) { 265905682a19609e862633f01e69bec58384df2cdf7Jeff Brown return pollOnce(timeoutMillis, NULL, NULL, NULL); 266905682a19609e862633f01e69bec58384df2cdf7Jeff Brown } 2677901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 2687901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown /** 2697901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * Like pollOnce(), but performs all pending callbacks until all 2707901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * data has been consumed or a file descriptor is available with no callback. 2711693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * This function will never return POLL_CALLBACK. 2727901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown */ 273905682a19609e862633f01e69bec58384df2cdf7Jeff Brown int pollAll(int timeoutMillis, int* outFd, int* outEvents, void** outData); 274905682a19609e862633f01e69bec58384df2cdf7Jeff Brown inline int pollAll(int timeoutMillis) { 275905682a19609e862633f01e69bec58384df2cdf7Jeff Brown return pollAll(timeoutMillis, NULL, NULL, NULL); 276905682a19609e862633f01e69bec58384df2cdf7Jeff Brown } 2777901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 2787901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown /** 2797901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * Wakes the poll asynchronously. 2807901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 2817901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * This method can be called on any thread. 2827901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * This method returns immediately. 2837901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown */ 2847901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown void wake(); 2857901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 2867901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown /** 2877901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * Adds a new file descriptor to be polled by the looper. 2887901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * If the same file descriptor was previously added, it is replaced. 2897901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 2907901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * "fd" is the file descriptor to be added. 291dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown * "ident" is an identifier for this event, which is returned from pollOnce(). 2921693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * The identifier must be >= 0, or POLL_CALLBACK if providing a non-NULL callback. 2931693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * "events" are the poll events to wake up on. Typically this is EVENT_INPUT. 2947901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * "callback" is the function to call when there is an event on the file descriptor. 2957901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * "data" is a private data pointer to supply to the callback. 2967901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 2977901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * There are two main uses of this function: 2987901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 2997901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * (1) If "callback" is non-NULL, then this function will be called when there is 3007901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * data on the file descriptor. It should execute any events it has pending, 3017901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * appropriately reading from the file descriptor. The 'ident' is ignored in this case. 3027901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 3031693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * (2) If "callback" is NULL, the 'ident' will be returned by Looper_pollOnce 3047901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * when its file descriptor has data available, requiring the caller to take 3057901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * care of processing it. 3067901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 3077901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * Returns 1 if the file descriptor was added, 0 if the arguments were invalid. 3087901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 3097901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * This method can be called on any thread. 3107901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * This method may block briefly if it needs to wake the poll. 311dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown * 312dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown * The callback may either be specified as a bare function pointer or as a smart 313dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown * pointer callback object. The smart pointer should be preferred because it is 314dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown * easier to avoid races when the callback is removed from a different thread. 315dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown * See removeFd() for details. 3167901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown */ 3171693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom int addFd(int fd, int ident, int events, Looper_callbackFunc callback, void* data); 318dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown int addFd(int fd, int ident, int events, const sp<LooperCallback>& callback, void* data); 3197901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 3207901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown /** 3217901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * Removes a previously added file descriptor from the looper. 3227901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 3237901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * When this method returns, it is safe to close the file descriptor since the looper 3247901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * will no longer have a reference to it. However, it is possible for the callback to 3257901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * already be running or for it to run one last time if the file descriptor was already 3267901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * signalled. Calling code is responsible for ensuring that this case is safely handled. 3277901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * For example, if the callback takes care of removing itself during its own execution either 3287901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * by returning 0 or by calling this method, then it can be guaranteed to not be invoked 3297901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * again at any later time unless registered anew. 3307901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 331dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown * A simple way to avoid this problem is to use the version of addFd() that takes 332dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown * a sp<LooperCallback> instead of a bare function pointer. The LooperCallback will 333dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown * be released at the appropriate time by the Looper. 334dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown * 3357901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * Returns 1 if the file descriptor was removed, 0 if none was previously registered. 3367901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 3377901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * This method can be called on any thread. 3387901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * This method may block briefly if it needs to wake the poll. 3397901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown */ 3407901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown int removeFd(int fd); 3417901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 3427901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown /** 3433e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * Enqueues a message to be processed by the specified handler. 3443e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * 3453e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * The handler must not be null. 3463e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * This method can be called on any thread. 3473e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown */ 3483e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown void sendMessage(const sp<MessageHandler>& handler, const Message& message); 3493e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 3503e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown /** 3513e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * Enqueues a message to be processed by the specified handler after all pending messages 3523e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * after the specified delay. 3533e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * 3543e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * The time delay is specified in uptime nanoseconds. 3553e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * The handler must not be null. 3563e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * This method can be called on any thread. 3573e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown */ 3583e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown void sendMessageDelayed(nsecs_t uptimeDelay, const sp<MessageHandler>& handler, 3593e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown const Message& message); 3603e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 3613e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown /** 3623e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * Enqueues a message to be processed by the specified handler after all pending messages 3633e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * at the specified time. 3643e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * 3653e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * The time is specified in uptime nanoseconds. 3663e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * The handler must not be null. 3673e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * This method can be called on any thread. 3683e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown */ 3693e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown void sendMessageAtTime(nsecs_t uptime, const sp<MessageHandler>& handler, 3703e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown const Message& message); 3713e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 3723e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown /** 3733e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * Removes all messages for the specified handler from the queue. 3743e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * 3753e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * The handler must not be null. 3763e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * This method can be called on any thread. 3773e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown */ 3783e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown void removeMessages(const sp<MessageHandler>& handler); 3793e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 3803e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown /** 3813e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * Removes all messages of a particular type for the specified handler from the queue. 3823e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * 3833e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * The handler must not be null. 3843e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown * This method can be called on any thread. 3853e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown */ 3863e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown void removeMessages(const sp<MessageHandler>& handler, int what); 3873e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 3883e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown /** 38927e5721860142b1b20081b535c55e7917366385fJeff Brown * Returns whether this looper's thread is currently polling for more work to do. 39027e5721860142b1b20081b535c55e7917366385fJeff Brown * This is a good signal that the loop is still alive rather than being stuck 39127e5721860142b1b20081b535c55e7917366385fJeff Brown * handling a callback. Note that this method is intrinsically racy, since the 39227e5721860142b1b20081b535c55e7917366385fJeff Brown * state of the loop can change before you get the result back. 39319159f90020c04ac2f4dcb39424d740f765ed9a3Dianne Hackborn */ 39427e5721860142b1b20081b535c55e7917366385fJeff Brown bool isPolling() const; 39519159f90020c04ac2f4dcb39424d740f765ed9a3Dianne Hackborn 39619159f90020c04ac2f4dcb39424d740f765ed9a3Dianne Hackborn /** 3977901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * Prepares a looper associated with the calling thread, and returns it. 3987901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * If the thread already has a looper, it is returned. Otherwise, a new 3997901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * one is created, associated with the thread, and returned. 4007901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 4011693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom * The opts may be PREPARE_ALLOW_NON_CALLBACKS or 0. 4027901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown */ 4037901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown static sp<Looper> prepare(int opts); 4047901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 4057901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown /** 4067901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * Sets the given looper to be associated with the calling thread. 4077901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * If another looper is already associated with the thread, it is replaced. 4087901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * 4097901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * If "looper" is NULL, removes the currently associated looper. 4107901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown */ 4117901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown static void setForThread(const sp<Looper>& looper); 4127901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 4137901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown /** 4147901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * Returns the looper associated with the calling thread, or NULL if 4157901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown * there is not one. 4167901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown */ 4177901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown static sp<Looper> getForThread(); 4187901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 4197901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownprivate: 4207901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown struct Request { 4217901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown int fd; 4227901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown int ident; 4237a0310ef678edcf06acfd230617c427a788e58f8Jeff Brown int seq; 424dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown sp<LooperCallback> callback; 4257901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown void* data; 4267901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown }; 4277901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 4287901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown struct Response { 4297901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown int events; 4307901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown Request request; 4317901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown }; 4327901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 4333e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown struct MessageEnvelope { 4343e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown MessageEnvelope() : uptime(0) { } 4353e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 4363e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown MessageEnvelope(nsecs_t uptime, const sp<MessageHandler> handler, 4373e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown const Message& message) : uptime(uptime), handler(handler), message(message) { 4383e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown } 4393e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 4403e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown nsecs_t uptime; 4413e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown sp<MessageHandler> handler; 4423e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown Message message; 4433e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown }; 4443e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 4457901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown const bool mAllowNonCallbacks; // immutable 4467901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 4477901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown int mWakeReadPipeFd; // immutable 4487901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown int mWakeWritePipeFd; // immutable 4498d15c74d50fd01d6e63970aadd261a9d3bed27e7Jeff Brown Mutex mLock; 4508d15c74d50fd01d6e63970aadd261a9d3bed27e7Jeff Brown 4513e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown Vector<MessageEnvelope> mMessageEnvelopes; // guarded by mLock 4523e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown bool mSendingMessage; // guarded by mLock 4533e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown 45419159f90020c04ac2f4dcb39424d740f765ed9a3Dianne Hackborn // Whether we are currently waiting for work. Not protected by a lock, 45519159f90020c04ac2f4dcb39424d740f765ed9a3Dianne Hackborn // any use of it is racy anyway. 45627e5721860142b1b20081b535c55e7917366385fJeff Brown volatile bool mPolling; 45719159f90020c04ac2f4dcb39424d740f765ed9a3Dianne Hackborn 4588d15c74d50fd01d6e63970aadd261a9d3bed27e7Jeff Brown int mEpollFd; // immutable 4597901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 4607901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown // Locked list of file descriptor monitoring requests. 4618d15c74d50fd01d6e63970aadd261a9d3bed27e7Jeff Brown KeyedVector<int, Request> mRequests; // guarded by mLock 4627a0310ef678edcf06acfd230617c427a788e58f8Jeff Brown int mNextRequestSeq; 4638d15c74d50fd01d6e63970aadd261a9d3bed27e7Jeff Brown 4647901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown // This state is only used privately by pollOnce and does not require a lock since 4657901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown // it runs on a single thread. 4667901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown Vector<Response> mResponses; 4677901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown size_t mResponseIndex; 4683e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown nsecs_t mNextMessageUptime; // set to LLONG_MAX when none 4697901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 4707901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown int pollInner(int timeoutMillis); 4717a0310ef678edcf06acfd230617c427a788e58f8Jeff Brown int removeFd(int fd, int seq); 4728d15c74d50fd01d6e63970aadd261a9d3bed27e7Jeff Brown void awoken(); 4738d15c74d50fd01d6e63970aadd261a9d3bed27e7Jeff Brown void pushResponse(int events, const Request& request); 4747901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 475d18051870e8e2a5f55237a2c11fde75f46082639Jeff Brown static void initTLSKey(); 4767901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown static void threadDestructor(void *st); 4777901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}; 4787901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 4797901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown} // namespace android 4807901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown 4817901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown#endif // UTILS_LOOPER_H 482