Loading services/sensorservice/hidl/SensorManager.cpp +22 −2 Original line number Diff line number Diff line Loading @@ -45,7 +45,10 @@ using ::android::hardware::hidl_vec; using ::android::hardware::Void; using ::android::sp; SensorManager::SensorManager() { static const char* POLL_THREAD_NAME = "hidl_ssvc_poll"; SensorManager::SensorManager(JavaVM* vm) : mJavaVm(vm) { } SensorManager::~SensorManager() { Loading Loading @@ -133,7 +136,7 @@ sp<::android::Looper> SensorManager::getLooper() { if (mLooper == nullptr) { std::condition_variable looperSet; std::thread{[&mutex = mLooperMutex, &looper = mLooper, &looperSet] { std::thread{[&mutex = mLooperMutex, &looper = mLooper, &looperSet, javaVm = mJavaVm] { struct sched_param p = {0}; p.sched_priority = 10; Loading @@ -146,11 +149,28 @@ sp<::android::Looper> SensorManager::getLooper() { looper = Looper::prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS /* opts */); lock.unlock(); // Attach the thread to JavaVM so that pollAll do not crash if the event // is from Java. JavaVMAttachArgs args{ .version = JNI_VERSION_1_2, .name = POLL_THREAD_NAME, .group = NULL }; JNIEnv* env; if (javaVm->AttachCurrentThread(&env, &args) != JNI_OK) { LOG(FATAL) << "Cannot attach SensorManager looper thread to Java VM."; } looperSet.notify_one(); int pollResult = looper->pollAll(-1 /* timeout */); if (pollResult != ALOOPER_POLL_WAKE) { LOG(ERROR) << "Looper::pollAll returns unexpected " << pollResult; } if (javaVm->DetachCurrentThread() != JNI_OK) { LOG(ERROR) << "Cannot detach SensorManager looper thread from Java VM."; } LOG(INFO) << "Looper thread is terminated."; }}.detach(); looperSet.wait(lock, [this]{ return this->mLooper != nullptr; }); Loading services/sensorservice/hidl/include/sensorservicehidl/SensorManager.h +5 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ #ifndef ANDROID_FRAMEWORKS_SENSORSERVICE_V1_0_SENSORMANAGER_H #define ANDROID_FRAMEWORKS_SENSORSERVICE_V1_0_SENSORMANAGER_H #include <jni.h> #include <mutex> #include <android/frameworks/sensorservice/1.0/ISensorManager.h> Loading @@ -39,7 +41,7 @@ using ::android::hardware::Return; struct SensorManager final : public ISensorManager { SensorManager(); SensorManager(JavaVM* vm); ~SensorManager(); // Methods from ::android::frameworks::sensorservice::V1_0::ISensorManager follow. Loading @@ -59,6 +61,8 @@ private: std::mutex mLooperMutex; sp<::android::Looper> mLooper; JavaVM* mJavaVm; }; } // namespace implementation Loading Loading
services/sensorservice/hidl/SensorManager.cpp +22 −2 Original line number Diff line number Diff line Loading @@ -45,7 +45,10 @@ using ::android::hardware::hidl_vec; using ::android::hardware::Void; using ::android::sp; SensorManager::SensorManager() { static const char* POLL_THREAD_NAME = "hidl_ssvc_poll"; SensorManager::SensorManager(JavaVM* vm) : mJavaVm(vm) { } SensorManager::~SensorManager() { Loading Loading @@ -133,7 +136,7 @@ sp<::android::Looper> SensorManager::getLooper() { if (mLooper == nullptr) { std::condition_variable looperSet; std::thread{[&mutex = mLooperMutex, &looper = mLooper, &looperSet] { std::thread{[&mutex = mLooperMutex, &looper = mLooper, &looperSet, javaVm = mJavaVm] { struct sched_param p = {0}; p.sched_priority = 10; Loading @@ -146,11 +149,28 @@ sp<::android::Looper> SensorManager::getLooper() { looper = Looper::prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS /* opts */); lock.unlock(); // Attach the thread to JavaVM so that pollAll do not crash if the event // is from Java. JavaVMAttachArgs args{ .version = JNI_VERSION_1_2, .name = POLL_THREAD_NAME, .group = NULL }; JNIEnv* env; if (javaVm->AttachCurrentThread(&env, &args) != JNI_OK) { LOG(FATAL) << "Cannot attach SensorManager looper thread to Java VM."; } looperSet.notify_one(); int pollResult = looper->pollAll(-1 /* timeout */); if (pollResult != ALOOPER_POLL_WAKE) { LOG(ERROR) << "Looper::pollAll returns unexpected " << pollResult; } if (javaVm->DetachCurrentThread() != JNI_OK) { LOG(ERROR) << "Cannot detach SensorManager looper thread from Java VM."; } LOG(INFO) << "Looper thread is terminated."; }}.detach(); looperSet.wait(lock, [this]{ return this->mLooper != nullptr; }); Loading
services/sensorservice/hidl/include/sensorservicehidl/SensorManager.h +5 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ #ifndef ANDROID_FRAMEWORKS_SENSORSERVICE_V1_0_SENSORMANAGER_H #define ANDROID_FRAMEWORKS_SENSORSERVICE_V1_0_SENSORMANAGER_H #include <jni.h> #include <mutex> #include <android/frameworks/sensorservice/1.0/ISensorManager.h> Loading @@ -39,7 +41,7 @@ using ::android::hardware::Return; struct SensorManager final : public ISensorManager { SensorManager(); SensorManager(JavaVM* vm); ~SensorManager(); // Methods from ::android::frameworks::sensorservice::V1_0::ISensorManager follow. Loading @@ -59,6 +61,8 @@ private: std::mutex mLooperMutex; sp<::android::Looper> mLooper; JavaVM* mJavaVm; }; } // namespace implementation Loading