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
28682674154e3fe88f6061245145f934f25f1a2eb8Dianne HackbornALooper* ALooper_forThread() {
294fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    return Looper::getForThread().get();
30682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
31682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
324fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownALooper* ALooper_prepare(int opts) {
334fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    return Looper::prepare(opts).get();
34682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
35682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
364fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownvoid ALooper_acquire(ALooper* looper) {
374fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    static_cast<Looper*>(looper)->incStrong((void*)ALooper_acquire);
3885448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn}
3985448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn
404fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownvoid ALooper_release(ALooper* looper) {
414fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    static_cast<Looper*>(looper)->decStrong((void*)ALooper_acquire);
424fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
434fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
444fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownint ALooper_pollOnce(int timeoutMillis, int* outFd, int* outEvents, void** outData) {
454fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    sp<Looper> looper = Looper::getForThread();
464fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    if (looper == NULL) {
473762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ALooper_pollOnce: No looper for this thread!");
484fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        return ALOOPER_POLL_ERROR;
4985448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn    }
504fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
51c70bed01ac1c38d278fb3a656aaea23ab0fec73eJeff Brown    IPCThreadState::self()->flushCommands();
524fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    return looper->pollOnce(timeoutMillis, outFd, outEvents, outData);
53682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
54682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
554fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownint ALooper_pollAll(int timeoutMillis, int* outFd, int* outEvents, void** outData) {
564fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    sp<Looper> looper = Looper::getForThread();
574fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    if (looper == NULL) {
583762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ALooper_pollAll: No looper for this thread!");
594fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        return ALOOPER_POLL_ERROR;
604fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    }
61c70bed01ac1c38d278fb3a656aaea23ab0fec73eJeff Brown
62c70bed01ac1c38d278fb3a656aaea23ab0fec73eJeff Brown    IPCThreadState::self()->flushCommands();
634fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    return looper->pollAll(timeoutMillis, outFd, outEvents, outData);
64682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
65682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
664fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownvoid ALooper_wake(ALooper* looper) {
674fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    static_cast<Looper*>(looper)->wake();
68682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
69682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
704fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownint ALooper_addFd(ALooper* looper, int fd, int ident, int events,
714fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        ALooper_callbackFunc callback, void* data) {
724fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    return static_cast<Looper*>(looper)->addFd(fd, ident, events, callback, data);
73682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
74682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
754fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownint ALooper_removeFd(ALooper* looper, int fd) {
764fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    return static_cast<Looper*>(looper)->removeFd(fd);
77682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
78