|  | /* | 
|  | * Copyright (C) 2010 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | #define LOG_TAG "ALooper" | 
|  | #include <utils/Log.h> | 
|  |  | 
|  | #include <android/looper.h> | 
|  | #include <utils/Looper.h> | 
|  | #include <binder/IPCThreadState.h> | 
|  |  | 
|  | using android::Looper; | 
|  | using android::sp; | 
|  | using android::IPCThreadState; | 
|  |  | 
|  | static inline Looper* ALooper_to_Looper(ALooper* alooper) { | 
|  | return reinterpret_cast<Looper*>(alooper); | 
|  | } | 
|  |  | 
|  | static inline ALooper* Looper_to_ALooper(Looper* looper) { | 
|  | return reinterpret_cast<ALooper*>(looper); | 
|  | } | 
|  |  | 
|  | ALooper* ALooper_forThread() { | 
|  | return Looper_to_ALooper(Looper::getForThread().get()); | 
|  | } | 
|  |  | 
|  | ALooper* ALooper_prepare(int opts) { | 
|  | return Looper_to_ALooper(Looper::prepare(opts).get()); | 
|  | } | 
|  |  | 
|  | void ALooper_acquire(ALooper* looper) { | 
|  | ALooper_to_Looper(looper)->incStrong((void*)ALooper_acquire); | 
|  | } | 
|  |  | 
|  | void ALooper_release(ALooper* looper) { | 
|  | ALooper_to_Looper(looper)->decStrong((void*)ALooper_acquire); | 
|  | } | 
|  |  | 
|  | int ALooper_pollOnce(int timeoutMillis, int* outFd, int* outEvents, void** outData) { | 
|  | sp<Looper> looper = Looper::getForThread(); | 
|  | if (looper == NULL) { | 
|  | ALOGE("ALooper_pollOnce: No looper for this thread!"); | 
|  | return ALOOPER_POLL_ERROR; | 
|  | } | 
|  |  | 
|  | IPCThreadState::self()->flushCommands(); | 
|  | return looper->pollOnce(timeoutMillis, outFd, outEvents, outData); | 
|  | } | 
|  |  | 
|  | int ALooper_pollAll(int timeoutMillis, int* outFd, int* outEvents, void** outData) { | 
|  | sp<Looper> looper = Looper::getForThread(); | 
|  | if (looper == NULL) { | 
|  | ALOGE("ALooper_pollAll: No looper for this thread!"); | 
|  | return ALOOPER_POLL_ERROR; | 
|  | } | 
|  |  | 
|  | IPCThreadState::self()->flushCommands(); | 
|  | return looper->pollAll(timeoutMillis, outFd, outEvents, outData); | 
|  | } | 
|  |  | 
|  | void ALooper_wake(ALooper* looper) { | 
|  | ALooper_to_Looper(looper)->wake(); | 
|  | } | 
|  |  | 
|  | int ALooper_addFd(ALooper* looper, int fd, int ident, int events, | 
|  | ALooper_callbackFunc callback, void* data) { | 
|  | return ALooper_to_Looper(looper)->addFd(fd, ident, events, callback, data); | 
|  | } | 
|  |  | 
|  | int ALooper_removeFd(ALooper* looper, int fd) { | 
|  | return ALooper_to_Looper(looper)->removeFd(fd); | 
|  | } |