16f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber/*
26f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * Copyright (C) 2017 The Android Open Source Project
36f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber *
46f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
56f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * you may not use this file except in compliance with the License.
66f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * You may obtain a copy of the License at
76f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber *
86f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
96f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber *
106f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * Unless required by applicable law or agreed to in writing, software
116f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
126f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * See the License for the specific language governing permissions and
146f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * limitations under the License.
156f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber */
166f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
176f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#include "ALooper.h"
186f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
196f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#include "ASensorEventQueue.h"
206f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
216f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#define LOG_TAG "libsensorndkbridge"
226f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#include <android/looper.h>
236f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#include <android-base/logging.h>
246f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
256f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::Mutex;
266f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
276f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberALooper::ALooper()
286f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    : mAwoken(false) {
296f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
306f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
316f96cb345a8ebfd9fef5f32931373776a798a193Andreas Hubervoid ALooper::signalSensorEvents(ASensorEventQueue *queue) {
326f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    Mutex::Autolock autoLock(mLock);
336f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    mReadyQueues.insert(queue);
346f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    mCondition.signal();
356f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
366f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
376f96cb345a8ebfd9fef5f32931373776a798a193Andreas Hubervoid ALooper::wake() {
386f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    Mutex::Autolock autoLock(mLock);
396f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    mAwoken = true;
406f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    mCondition.signal();
416f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
426f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
436f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ALooper::pollOnce(
446f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        int timeoutMillis, int *outFd, int *outEvents, void **outData) {
456f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (outFd) { *outFd = 0; }
466f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (outEvents) { *outEvents = 0; }
476f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (outData) { *outData = NULL; }
486f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
496f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    int64_t waitUntilNs;
506f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (timeoutMillis < 0) {
516f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        waitUntilNs = -1;
526f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    } else {
536f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        waitUntilNs =
546f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            systemTime(SYSTEM_TIME_MONOTONIC) + timeoutMillis * 1000000ll;
556f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    }
566f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
576f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    Mutex::Autolock autoLock(mLock);
586f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    int64_t nowNs;
596f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    while ((timeoutMillis < 0
606f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                || (nowNs = systemTime(SYSTEM_TIME_MONOTONIC)) < waitUntilNs)
616f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            && mReadyQueues.empty()
626f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            && !mAwoken) {
636f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        if (timeoutMillis < 0) {
646f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            mCondition.wait(mLock);
656f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        } else {
666f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            mCondition.waitRelative(mLock, waitUntilNs - nowNs);
676f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        }
686f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    }
696f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
706f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    int result = ALOOPER_POLL_TIMEOUT;
716f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
726f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (!mReadyQueues.empty()) {
736f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        result = ALOOPER_POLL_CALLBACK;
746f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
756f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        for (auto queue : mReadyQueues) {
766f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            queue->dispatchCallback();
776f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        }
786f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
796f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        mReadyQueues.clear();
806f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    } else if (mAwoken) {
816f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        result = ALOOPER_POLL_WAKE;
826f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        mAwoken = false;
836f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    }
846f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
856f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "pollOnce returning " << result;
866f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
876f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return result;
886f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
896f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
906f96cb345a8ebfd9fef5f32931373776a798a193Andreas Hubervoid ALooper::invalidateSensorQueue(ASensorEventQueue *queue) {
916f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    Mutex::Autolock autoLock(mLock);
926f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    mReadyQueues.erase(queue);
936f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
946f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
95