diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2017-06-14 07:13:04 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2017-06-14 07:13:04 +0000 |
commit | fa9d14517a20bc43b6d8b83ef53ccb6c3b0a7f03 (patch) | |
tree | 18924fdb9c0d0e96804e00e32808aaa2ee09f1b6 | |
parent | 87404e41f66feddfe582ca9ee396196d7085caff (diff) | |
parent | 638055ef41f6d248290c8867dd85c8a4690fa584 (diff) | |
download | native-fa9d14517a20bc43b6d8b83ef53ccb6c3b0a7f03.tar.gz |
release-request-0b3ce0b0-0f38-494b-a590-b594ba11c2d2-for-git_oc-release-4098933 snap-temp-L41500000074000728
Change-Id: I4121574daf475877646de8c86eb3749d6c210ac2
-rw-r--r-- | cmds/atrace/atrace.rc | 8 | ||||
-rw-r--r-- | services/sensorservice/hidl/SensorManager.cpp | 49 | ||||
-rw-r--r-- | services/sensorservice/hidl/include/sensorservicehidl/SensorManager.h | 12 |
3 files changed, 54 insertions, 15 deletions
diff --git a/cmds/atrace/atrace.rc b/cmds/atrace/atrace.rc index 5e9cef384b..d5381457c0 100644 --- a/cmds/atrace/atrace.rc +++ b/cmds/atrace/atrace.rc @@ -15,8 +15,8 @@ on post-fs chown root shell /sys/kernel/tracing/options/overwrite chown root shell /sys/kernel/debug/tracing/options/print-tgid chown root shell /sys/kernel/tracing/options/print-tgid - chown root shell /sys/kernel/debug/tracing/options/saved_cmdlines_size - chown root shell /sys/kernel/tracing/options/saved_cmdlines_size + chown root shell /sys/kernel/debug/tracing/saved_cmdlines_size + chown root shell /sys/kernel/tracing/saved_cmdlines_size chown root shell /sys/kernel/debug/tracing/events/sched/sched_switch/enable chown root shell /sys/kernel/tracing/events/sched/sched_switch/enable chown root shell /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable @@ -65,8 +65,8 @@ on post-fs chmod 0664 /sys/kernel/tracing/options/overwrite chmod 0664 /sys/kernel/debug/tracing/options/print-tgid chmod 0664 /sys/kernel/tracing/options/print-tgid - chmod 0664 /sys/kernel/debug/tracing/options/saved_cmdlines_size - chmod 0664 /sys/kernel/tracing/options/saved_cmdlines_size + chmod 0664 /sys/kernel/debug/tracing/saved_cmdlines_size + chmod 0664 /sys/kernel/tracing/saved_cmdlines_size chmod 0664 /sys/kernel/debug/tracing/events/sched/sched_switch/enable chmod 0664 /sys/kernel/tracing/events/sched/sched_switch/enable chmod 0664 /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable diff --git a/services/sensorservice/hidl/SensorManager.cpp b/services/sensorservice/hidl/SensorManager.cpp index 06ff95cdc8..25a3dc50d2 100644 --- a/services/sensorservice/hidl/SensorManager.cpp +++ b/services/sensorservice/hidl/SensorManager.cpp @@ -42,9 +42,10 @@ using ::android::hardware::hidl_vec; using ::android::hardware::Void; using ::android::sp; -SensorManager::SensorManager() - : mInternalManager{::android::SensorManager::getInstanceForPackage( - String16(ISensorManager::descriptor))} { +static const char* POLL_THREAD_NAME = "hidl_ssvc_poll"; + +SensorManager::SensorManager(JavaVM* vm) + : mJavaVm(vm) { } SensorManager::~SensorManager() { @@ -58,7 +59,7 @@ SensorManager::~SensorManager() { // Methods from ::android::frameworks::sensorservice::V1_0::ISensorManager follow. Return<void> SensorManager::getSensorList(getSensorList_cb _hidl_cb) { ::android::Sensor const* const* list; - ssize_t count = mInternalManager.getSensorList(&list); + ssize_t count = getInternalManager().getSensorList(&list); if (count < 0 || !list) { LOG(ERROR) << "::android::SensorManager::getSensorList encounters " << count; _hidl_cb({}, Result::UNKNOWN_ERROR); @@ -74,7 +75,7 @@ Return<void> SensorManager::getSensorList(getSensorList_cb _hidl_cb) { } Return<void> SensorManager::getDefaultSensor(SensorType type, getDefaultSensor_cb _hidl_cb) { - ::android::Sensor const* sensor = mInternalManager.getDefaultSensor(static_cast<int>(type)); + ::android::Sensor const* sensor = getInternalManager().getDefaultSensor(static_cast<int>(type)); if (!sensor) { _hidl_cb({}, Result::NOT_EXIST); return Void(); @@ -110,7 +111,7 @@ Return<void> SensorManager::createAshmemDirectChannel( return Void(); } - createDirectChannel(mInternalManager, size, SENSOR_DIRECT_MEM_TYPE_ASHMEM, + createDirectChannel(getInternalManager(), size, SENSOR_DIRECT_MEM_TYPE_ASHMEM, mem.handle(), _hidl_cb); return Void(); @@ -120,7 +121,7 @@ Return<void> SensorManager::createGrallocDirectChannel( const hidl_handle& buffer, uint64_t size, createGrallocDirectChannel_cb _hidl_cb) { - createDirectChannel(mInternalManager, size, SENSOR_DIRECT_MEM_TYPE_GRALLOC, + createDirectChannel(getInternalManager(), size, SENSOR_DIRECT_MEM_TYPE_GRALLOC, buffer.getNativeHandle(), _hidl_cb); return Void(); @@ -132,7 +133,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; @@ -142,14 +143,35 @@ sp<::android::Looper> SensorManager::getLooper() { } std::unique_lock<std::mutex> lock(mutex); + if (looper != nullptr) { + LOG(INFO) << "Another thread has already set the looper, exiting this one."; + return; + } 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; }); @@ -157,6 +179,15 @@ sp<::android::Looper> SensorManager::getLooper() { return mLooper; } +::android::SensorManager& SensorManager::getInternalManager() { + std::lock_guard<std::mutex> lock(mInternalManagerMutex); + if (mInternalManager == nullptr) { + mInternalManager = &::android::SensorManager::getInstanceForPackage( + String16(ISensorManager::descriptor)); + } + return *mInternalManager; +} + Return<void> SensorManager::createEventQueue( const sp<IEventQueueCallback> &callback, createEventQueue_cb _hidl_cb) { if (callback == nullptr) { @@ -165,7 +196,7 @@ Return<void> SensorManager::createEventQueue( } sp<::android::Looper> looper = getLooper(); - sp<::android::SensorEventQueue> internalQueue = mInternalManager.createEventQueue(); + sp<::android::SensorEventQueue> internalQueue = getInternalManager().createEventQueue(); if (internalQueue == nullptr) { LOG(WARNING) << "::android::SensorManager::createEventQueue returns nullptr."; _hidl_cb(nullptr, Result::UNKNOWN_ERROR); diff --git a/services/sensorservice/hidl/include/sensorservicehidl/SensorManager.h b/services/sensorservice/hidl/include/sensorservicehidl/SensorManager.h index a2372df3d1..e66c8e5d22 100644 --- a/services/sensorservice/hidl/include/sensorservicehidl/SensorManager.h +++ b/services/sensorservice/hidl/include/sensorservicehidl/SensorManager.h @@ -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> @@ -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. @@ -50,11 +52,17 @@ struct SensorManager final : public ISensorManager { Return<void> createEventQueue(const sp<IEventQueueCallback> &callback, createEventQueue_cb _hidl_cb); private: + // Block until ::android::SensorManager is initialized. + ::android::SensorManager& getInternalManager(); sp<::android::Looper> getLooper(); - ::android::SensorManager& mInternalManager; + std::mutex mInternalManagerMutex; + ::android::SensorManager* mInternalManager = nullptr; // does not own + std::mutex mLooperMutex; sp<::android::Looper> mLooper; + + JavaVM* mJavaVm; }; } // namespace implementation |