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>
214fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown#include <utils/Looper.h>
22c70bed01ac1c38d278fb3a656aaea23ab0fec73eJeff Brown#include <binder/IPCThreadState.h>
23682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
244fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownusing android::Looper;
25682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackbornusing android::sp;
26c70bed01ac1c38d278fb3a656aaea23ab0fec73eJeff Brownusing android::IPCThreadState;
27682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
2882b007d7572dceb0981b269338bd1ac6c40496c5Brian Carlstromstatic inline Looper* ALooper_to_Looper(ALooper* alooper) {
2982b007d7572dceb0981b269338bd1ac6c40496c5Brian Carlstrom    return reinterpret_cast<Looper*>(alooper);
3082b007d7572dceb0981b269338bd1ac6c40496c5Brian Carlstrom}
3182b007d7572dceb0981b269338bd1ac6c40496c5Brian Carlstrom
3282b007d7572dceb0981b269338bd1ac6c40496c5Brian Carlstromstatic inline ALooper* Looper_to_ALooper(Looper* looper) {
3382b007d7572dceb0981b269338bd1ac6c40496c5Brian Carlstrom    return reinterpret_cast<ALooper*>(looper);
3482b007d7572dceb0981b269338bd1ac6c40496c5Brian Carlstrom}
3582b007d7572dceb0981b269338bd1ac6c40496c5Brian Carlstrom
36682674154e3fe88f6061245145f934f25f1a2eb8Dianne HackbornALooper* ALooper_forThread() {
3782b007d7572dceb0981b269338bd1ac6c40496c5Brian Carlstrom    return Looper_to_ALooper(Looper::getForThread().get());
38682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
39682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
404fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownALooper* ALooper_prepare(int opts) {
4182b007d7572dceb0981b269338bd1ac6c40496c5Brian Carlstrom    return Looper_to_ALooper(Looper::prepare(opts).get());
42682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
43682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
444fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownvoid ALooper_acquire(ALooper* looper) {
4582b007d7572dceb0981b269338bd1ac6c40496c5Brian Carlstrom    ALooper_to_Looper(looper)->incStrong((void*)ALooper_acquire);
4685448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn}
4785448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn
484fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownvoid ALooper_release(ALooper* looper) {
4982b007d7572dceb0981b269338bd1ac6c40496c5Brian Carlstrom    ALooper_to_Looper(looper)->decStrong((void*)ALooper_acquire);
504fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
514fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
524fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownint ALooper_pollOnce(int timeoutMillis, int* outFd, int* outEvents, void** outData) {
534fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    sp<Looper> looper = Looper::getForThread();
544fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    if (looper == NULL) {
553762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ALooper_pollOnce: No looper for this thread!");
564fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        return ALOOPER_POLL_ERROR;
5785448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn    }
584fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
59c70bed01ac1c38d278fb3a656aaea23ab0fec73eJeff Brown    IPCThreadState::self()->flushCommands();
604fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    return looper->pollOnce(timeoutMillis, outFd, outEvents, outData);
61682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
62682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
634fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownint ALooper_pollAll(int timeoutMillis, int* outFd, int* outEvents, void** outData) {
644fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    sp<Looper> looper = Looper::getForThread();
654fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    if (looper == NULL) {
663762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ALooper_pollAll: No looper for this thread!");
674fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        return ALOOPER_POLL_ERROR;
684fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    }
69c70bed01ac1c38d278fb3a656aaea23ab0fec73eJeff Brown
70c70bed01ac1c38d278fb3a656aaea23ab0fec73eJeff Brown    IPCThreadState::self()->flushCommands();
714fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    return looper->pollAll(timeoutMillis, outFd, outEvents, outData);
72682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
73682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
744fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownvoid ALooper_wake(ALooper* looper) {
7582b007d7572dceb0981b269338bd1ac6c40496c5Brian Carlstrom    ALooper_to_Looper(looper)->wake();
76682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
77682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
784fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownint ALooper_addFd(ALooper* looper, int fd, int ident, int events,
794fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        ALooper_callbackFunc callback, void* data) {
8082b007d7572dceb0981b269338bd1ac6c40496c5Brian Carlstrom    return ALooper_to_Looper(looper)->addFd(fd, ident, events, callback, data);
81682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
82682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
834fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownint ALooper_removeFd(ALooper* looper, int fd) {
8482b007d7572dceb0981b269338bd1ac6c40496c5Brian Carlstrom    return ALooper_to_Looper(looper)->removeFd(fd);
85682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
86