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