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) { }
5217b5b82d64686d482e6dcf96ee54fd62234d5f27Colin Cross    Message(int w) : what(w) { }
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:
6917b5b82d64686d482e6dcf96ee54fd62234d5f27Colin Cross    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:
10017b5b82d64686d482e6dcf96ee54fd62234d5f27Colin Cross    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;
423e7d54f80cb686026d5b0974a4b1c1ba1d4ebff64Jeff Brown        int events;
4247a0310ef678edcf06acfd230617c427a788e58f8Jeff Brown        int seq;
425dd1b0378cec939e7c90f8e8d8216b481f9f2035aJeff Brown        sp<LooperCallback> callback;
4267901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown        void* data;
427e7d54f80cb686026d5b0974a4b1c1ba1d4ebff64Jeff Brown
428e7d54f80cb686026d5b0974a4b1c1ba1d4ebff64Jeff Brown        void initEventItem(struct epoll_event* eventItem) const;
4297901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    };
4307901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
4317901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    struct Response {
4327901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown        int events;
4337901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown        Request request;
4347901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    };
4357901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
4363e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    struct MessageEnvelope {
4373e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown        MessageEnvelope() : uptime(0) { }
4383e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
43917b5b82d64686d482e6dcf96ee54fd62234d5f27Colin Cross        MessageEnvelope(nsecs_t u, const sp<MessageHandler> h,
44017b5b82d64686d482e6dcf96ee54fd62234d5f27Colin Cross                const Message& m) : uptime(u), handler(h), message(m) {
4413e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown        }
4423e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
4433e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown        nsecs_t uptime;
4443e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown        sp<MessageHandler> handler;
4453e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown        Message message;
4463e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    };
4473e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
4487901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    const bool mAllowNonCallbacks; // immutable
4497901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
4508892ce6383c7aa3e18107b94889882a0374de69fTim Kilbourn    int mWakeEventFd;  // immutable
4518d15c74d50fd01d6e63970aadd261a9d3bed27e7Jeff Brown    Mutex mLock;
4528d15c74d50fd01d6e63970aadd261a9d3bed27e7Jeff Brown
4533e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    Vector<MessageEnvelope> mMessageEnvelopes; // guarded by mLock
4543e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    bool mSendingMessage; // guarded by mLock
4553e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
45619159f90020c04ac2f4dcb39424d740f765ed9a3Dianne Hackborn    // Whether we are currently waiting for work.  Not protected by a lock,
45719159f90020c04ac2f4dcb39424d740f765ed9a3Dianne Hackborn    // any use of it is racy anyway.
45827e5721860142b1b20081b535c55e7917366385fJeff Brown    volatile bool mPolling;
45919159f90020c04ac2f4dcb39424d740f765ed9a3Dianne Hackborn
460e7d54f80cb686026d5b0974a4b1c1ba1d4ebff64Jeff Brown    int mEpollFd; // guarded by mLock but only modified on the looper thread
461e7d54f80cb686026d5b0974a4b1c1ba1d4ebff64Jeff Brown    bool mEpollRebuildRequired; // guarded by mLock
4627901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
4637901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    // Locked list of file descriptor monitoring requests.
4648d15c74d50fd01d6e63970aadd261a9d3bed27e7Jeff Brown    KeyedVector<int, Request> mRequests;  // guarded by mLock
4657a0310ef678edcf06acfd230617c427a788e58f8Jeff Brown    int mNextRequestSeq;
4668d15c74d50fd01d6e63970aadd261a9d3bed27e7Jeff Brown
4677901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    // This state is only used privately by pollOnce and does not require a lock since
4687901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    // it runs on a single thread.
4697901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    Vector<Response> mResponses;
4707901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    size_t mResponseIndex;
4713e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    nsecs_t mNextMessageUptime; // set to LLONG_MAX when none
4727901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
4737901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int pollInner(int timeoutMillis);
4747a0310ef678edcf06acfd230617c427a788e58f8Jeff Brown    int removeFd(int fd, int seq);
4758d15c74d50fd01d6e63970aadd261a9d3bed27e7Jeff Brown    void awoken();
4768d15c74d50fd01d6e63970aadd261a9d3bed27e7Jeff Brown    void pushResponse(int events, const Request& request);
477e7d54f80cb686026d5b0974a4b1c1ba1d4ebff64Jeff Brown    void rebuildEpollLocked();
478e7d54f80cb686026d5b0974a4b1c1ba1d4ebff64Jeff Brown    void scheduleEpollRebuildLocked();
4797901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
480d18051870e8e2a5f55237a2c11fde75f46082639Jeff Brown    static void initTLSKey();
4817901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    static void threadDestructor(void *st);
482e7d54f80cb686026d5b0974a4b1c1ba1d4ebff64Jeff Brown    static void initEpollEvent(struct epoll_event* eventItem);
4837901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown};
4847901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
4857901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown} // namespace android
4867901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
4877901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown#endif // UTILS_LOOPER_H
488