looper.cpp revision 4fe6c3e51be77e35f40872cdbca6c80f8f8b7ecb
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>
22682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
234fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownusing android::Looper;
24682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackbornusing android::sp;
25682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
26682674154e3fe88f6061245145f934f25f1a2eb8Dianne HackbornALooper* ALooper_forThread() {
274fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    return Looper::getForThread().get();
28682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
29682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
304fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownALooper* ALooper_prepare(int opts) {
314fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    return Looper::prepare(opts).get();
32682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
33682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
344fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownvoid ALooper_acquire(ALooper* looper) {
354fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    static_cast<Looper*>(looper)->incStrong((void*)ALooper_acquire);
3685448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn}
3785448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn
384fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownvoid ALooper_release(ALooper* looper) {
394fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    static_cast<Looper*>(looper)->decStrong((void*)ALooper_acquire);
404fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
414fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
424fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownint ALooper_pollOnce(int timeoutMillis, int* outFd, int* outEvents, void** outData) {
434fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    sp<Looper> looper = Looper::getForThread();
444fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    if (looper == NULL) {
454fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        LOGE("ALooper_pollOnce: No looper for this thread!");
464fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        return ALOOPER_POLL_ERROR;
4785448bbecd4e0909eecfab15b7c3605f114d0427Dianne Hackborn    }
484fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
494fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    return looper->pollOnce(timeoutMillis, outFd, outEvents, outData);
50682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
51682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
524fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownint ALooper_pollAll(int timeoutMillis, int* outFd, int* outEvents, void** outData) {
534fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    sp<Looper> looper = Looper::getForThread();
544fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    if (looper == NULL) {
554fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        LOGE("ALooper_pollAll: No looper for this thread!");
564fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        return ALOOPER_POLL_ERROR;
574fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    }
584fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
594fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    return looper->pollAll(timeoutMillis, outFd, outEvents, outData);
60682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
61682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
624fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownvoid ALooper_wake(ALooper* looper) {
634fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    static_cast<Looper*>(looper)->wake();
64682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
65682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
664fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownint ALooper_addFd(ALooper* looper, int fd, int ident, int events,
674fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        ALooper_callbackFunc callback, void* data) {
684fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    return static_cast<Looper*>(looper)->addFd(fd, ident, events, callback, data);
69682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
70682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
714fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownint ALooper_removeFd(ALooper* looper, int fd) {
724fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    return static_cast<Looper*>(looper)->removeFd(fd);
73682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
74