From 682674154e3fe88f6061245145f934f25f1a2eb8 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Fri, 2 Jul 2010 18:52:01 -0700 Subject: Add new native Looper API. This allows us to avoid exposing the file descriptor of the event queue; instead, you attach an event queue to a looper. This will also should allow native apps to be written without the need for a separate thread, by attaching the event queue to the main thread's looper and scheduling their own messages there. Change-Id: I38489282635895ae2cbfacb88599c1b1cad9b239 --- native/android/looper.cpp | 63 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 native/android/looper.cpp (limited to 'native/android/looper.cpp') diff --git a/native/android/looper.cpp b/native/android/looper.cpp new file mode 100644 index 000000000000..6e78bbd03d12 --- /dev/null +++ b/native/android/looper.cpp @@ -0,0 +1,63 @@ +/* + * 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 + +using android::PollLoop; +using android::sp; + +ALooper* ALooper_forThread() { + return PollLoop::getForThread().get(); +} + +ALooper* ALooper_prepare() { + sp loop = PollLoop::getForThread(); + if (loop == NULL) { + loop = new PollLoop(); + PollLoop::setForThread(loop); + } + return loop.get(); +} + +int32_t ALooper_pollOnce(int timeoutMillis) { + sp loop = PollLoop::getForThread(); + if (loop == NULL) { + LOGW("ALooper_pollOnce: No looper for this thread!"); + return -1; + } + return loop->pollOnce(timeoutMillis) ? 1 : 0; +} + +void ALooper_acquire(ALooper* looper) { + static_cast(looper)->incStrong((void*)ALooper_acquire); +} + +void ALooper_release(ALooper* looper) { + static_cast(looper)->decStrong((void*)ALooper_acquire); +} + +void ALooper_setCallback(ALooper* looper, int fd, int events, + ALooper_callbackFunc* callback, void* data) { + static_cast(looper)->setLooperCallback(fd, events, callback, data); +} + +int32_t ALooper_removeCallback(ALooper* looper, int fd) { + return static_cast(looper)->removeCallback(fd) ? 1 : 0; +} -- cgit v1.2.3-59-g8ed1b