looper.cpp revision 85448bbecd4e0909eecfab15b7c3605f114d0427
1682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn/*
2682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn * Copyright (C) 2010 The Android Open Source Project
3682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn *
4682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn * you may not use this file except in compliance with the License.
6682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn * You may obtain a copy of the License at
7682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn *
8682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn *
10682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
11682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn * See the License for the specific language governing permissions and
14682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn * limitations under the License.
15682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn */
16682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
17682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn#define LOG_TAG "ALooper"
18682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn#include <utils/Log.h>
19682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
20682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn#include <android/looper.h>
21682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn#include <utils/PollLoop.h>
22682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
23682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackbornusing android::PollLoop;
24682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackbornusing android::sp;
25682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
26682674154e3fe88f6061245145f934f25f1a2eb8Dianne HackbornALooper* ALooper_forThread() {
27682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn    return PollLoop::getForThread().get();
28682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
29682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
3085448bbecd4e0909eecfab15b7c3605f114d0427Dianne HackbornALooper* ALooper_prepare(int32_t opts) {
3185448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn    bool allowFds = (opts&ALOOPER_PREPARE_ALLOW_NON_CALLBACKS) != 0;
32682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn    sp<PollLoop> loop = PollLoop::getForThread();
33682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn    if (loop == NULL) {
3485448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn        loop = new PollLoop(allowFds);
35682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn        PollLoop::setForThread(loop);
36682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn    }
3785448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn    if (loop->getAllowNonCallbacks() != allowFds) {
3885448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn        LOGW("ALooper_prepare again with different ALOOPER_PREPARE_ALLOW_NON_CALLBACKS");
3985448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn    }
40682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn    return loop.get();
41682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
42682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
4385448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackbornint32_t ALooper_pollOnce(int timeoutMillis, int* outEvents, void** outData) {
44682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn    sp<PollLoop> loop = PollLoop::getForThread();
45682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn    if (loop == NULL) {
46682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn        LOGW("ALooper_pollOnce: No looper for this thread!");
47682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn        return -1;
48682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn    }
4985448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn    return loop->pollOnce(timeoutMillis, outEvents, outData);
5085448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn}
5185448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn
5285448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackbornint32_t ALooper_pollAll(int timeoutMillis, int* outEvents, void** outData) {
5385448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn    sp<PollLoop> loop = PollLoop::getForThread();
5485448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn    if (loop == NULL) {
5585448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn        LOGW("ALooper_pollOnce: No looper for this thread!");
5685448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn        return -1;
5785448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn    }
5885448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn
5985448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn    int32_t result;
6085448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn    while ((result = loop->pollOnce(timeoutMillis, outEvents, outData)) == ALOOPER_POLL_CALLBACK) {
6185448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn        ;
6285448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn    }
6385448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn
6485448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn    return result;
65682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
66682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
67682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackbornvoid ALooper_acquire(ALooper* looper) {
68682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn    static_cast<PollLoop*>(looper)->incStrong((void*)ALooper_acquire);
69682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
70682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
71682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackbornvoid ALooper_release(ALooper* looper) {
72682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn    static_cast<PollLoop*>(looper)->decStrong((void*)ALooper_acquire);
73682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
74682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
7585448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackbornvoid ALooper_addFd(ALooper* looper, int fd, int events,
76682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn        ALooper_callbackFunc* callback, void* data) {
77682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn    static_cast<PollLoop*>(looper)->setLooperCallback(fd, events, callback, data);
78682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
79682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
8085448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackbornint32_t ALooper_removeFd(ALooper* looper, int fd) {
81682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn    return static_cast<PollLoop*>(looper)->removeCallback(fd) ? 1 : 0;
82682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
83