diff options
| author | 2023-10-24 14:22:58 +0000 | |
|---|---|---|
| committer | 2023-10-24 14:22:58 +0000 | |
| commit | 81083c17be1199f97ba4532848269864bab14e1c (patch) | |
| tree | 7995730874778912b5bcba5edb57656de2c8bb6d | |
| parent | a5eb4588a25aa5fb5cea5c3889c009033d1b2503 (diff) | |
| parent | cb2581e62b3d6ee7c439d5484c3c8dcabeb19730 (diff) | |
Merge "Receive owned copy of KeyCharacterMap in InputDevice" into main
| -rw-r--r-- | core/jni/android_view_InputDevice.cpp | 14 | ||||
| -rw-r--r-- | core/jni/android_view_KeyCharacterMap.cpp | 20 | ||||
| -rw-r--r-- | core/jni/android_view_KeyCharacterMap.h | 2 |
3 files changed, 18 insertions, 18 deletions
diff --git a/core/jni/android_view_InputDevice.cpp b/core/jni/android_view_InputDevice.cpp index f97d41b6a122..262f5e8e761e 100644 --- a/core/jni/android_view_InputDevice.cpp +++ b/core/jni/android_view_InputDevice.cpp @@ -42,13 +42,6 @@ jobject android_view_InputDevice_create(JNIEnv* env, const InputDeviceInfo& devi return NULL; } - // b/274058082: Pass a copy of the key character map to avoid concurrent - // access - std::shared_ptr<KeyCharacterMap> map = deviceInfo.getKeyCharacterMap(); - if (map != nullptr) { - map = std::make_shared<KeyCharacterMap>(*map); - } - ScopedLocalRef<jstring> descriptorObj(env, env->NewStringUTF(deviceInfo.getIdentifier().descriptor.c_str())); if (!descriptorObj.get()) { @@ -67,9 +60,14 @@ jobject android_view_InputDevice_create(JNIEnv* env, const InputDeviceInfo& devi ? layoutInfo->layoutType.c_str() : NULL)); + std::shared_ptr<KeyCharacterMap> map = deviceInfo.getKeyCharacterMap(); + std::unique_ptr<KeyCharacterMap> mapCopy; + if (map != nullptr) { + mapCopy = std::make_unique<KeyCharacterMap>(*map); + } ScopedLocalRef<jobject> kcmObj(env, android_view_KeyCharacterMap_create(env, deviceInfo.getId(), - map)); + std::move(mapCopy))); if (!kcmObj.get()) { return NULL; } diff --git a/core/jni/android_view_KeyCharacterMap.cpp b/core/jni/android_view_KeyCharacterMap.cpp index 7f69e22fb0d1..a79e37afd4cd 100644 --- a/core/jni/android_view_KeyCharacterMap.cpp +++ b/core/jni/android_view_KeyCharacterMap.cpp @@ -48,7 +48,7 @@ static struct { class NativeKeyCharacterMap { public: - NativeKeyCharacterMap(int32_t deviceId, std::shared_ptr<KeyCharacterMap> map) + NativeKeyCharacterMap(int32_t deviceId, std::unique_ptr<KeyCharacterMap> map) : mDeviceId(deviceId), mMap(std::move(map)) {} ~NativeKeyCharacterMap() { @@ -58,16 +58,18 @@ public: return mDeviceId; } - inline const std::shared_ptr<KeyCharacterMap> getMap() const { return mMap; } + inline const std::unique_ptr<KeyCharacterMap>& getMap() const { + return mMap; + } private: int32_t mDeviceId; - std::shared_ptr<KeyCharacterMap> mMap; + std::unique_ptr<KeyCharacterMap> mMap; }; jobject android_view_KeyCharacterMap_create(JNIEnv* env, int32_t deviceId, - const std::shared_ptr<KeyCharacterMap> kcm) { - NativeKeyCharacterMap* nativeMap = new NativeKeyCharacterMap(deviceId, kcm); + std::unique_ptr<KeyCharacterMap> kcm) { + NativeKeyCharacterMap* nativeMap = new NativeKeyCharacterMap(deviceId, std::move(kcm)); if (!nativeMap) { return nullptr; } @@ -91,7 +93,7 @@ static jlong nativeReadFromParcel(JNIEnv *env, jobject clazz, jobject parcelObj) return 0; } - std::shared_ptr<KeyCharacterMap> kcm = nullptr; + std::unique_ptr<KeyCharacterMap> kcm; // Check if map is a null character map if (parcel->readBool()) { kcm = KeyCharacterMap::readFromParcel(parcel); @@ -99,7 +101,7 @@ static jlong nativeReadFromParcel(JNIEnv *env, jobject clazz, jobject parcelObj) return 0; } } - NativeKeyCharacterMap* map = new NativeKeyCharacterMap(deviceId, kcm); + NativeKeyCharacterMap* map = new NativeKeyCharacterMap(deviceId, std::move(kcm)); return reinterpret_cast<jlong>(map); } @@ -230,9 +232,9 @@ static jobjectArray nativeGetEvents(JNIEnv *env, jobject clazz, jlong ptr, } static jboolean nativeEquals(JNIEnv* env, jobject clazz, jlong ptr1, jlong ptr2) { - const std::shared_ptr<KeyCharacterMap>& map1 = + const std::unique_ptr<KeyCharacterMap>& map1 = (reinterpret_cast<NativeKeyCharacterMap*>(ptr1))->getMap(); - const std::shared_ptr<KeyCharacterMap>& map2 = + const std::unique_ptr<KeyCharacterMap>& map2 = (reinterpret_cast<NativeKeyCharacterMap*>(ptr2))->getMap(); if (map1 == nullptr || map2 == nullptr) { return map1 == map2; diff --git a/core/jni/android_view_KeyCharacterMap.h b/core/jni/android_view_KeyCharacterMap.h index be0335380f87..a8aabd1d464a 100644 --- a/core/jni/android_view_KeyCharacterMap.h +++ b/core/jni/android_view_KeyCharacterMap.h @@ -25,7 +25,7 @@ namespace android { /* Creates a KeyCharacterMap object from the given information. */ extern jobject android_view_KeyCharacterMap_create(JNIEnv* env, int32_t deviceId, - const std::shared_ptr<KeyCharacterMap> kcm); + std::unique_ptr<KeyCharacterMap> kcm); } // namespace android |