/* * 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 #include #include #include using android::Looper; using android::sp; using android::IPCThreadState; static inline Looper* ALooper_to_Looper(ALooper* alooper) { return reinterpret_cast(alooper); } static inline ALooper* Looper_to_ALooper(Looper* looper) { return reinterpret_cast(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::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::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); }