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