diff options
author | 2024-04-15 21:53:56 +0000 | |
---|---|---|
committer | 2024-04-15 21:54:27 +0000 | |
commit | 01b92c7891d59dc14b6690514ac932547aa4a054 (patch) | |
tree | 36f32f4070b44b0465953bbaf71a13c4e93bbf0e | |
parent | 06bf5557c902dd6a1bb88acbd3b5fd8ec48e1278 (diff) |
Avoid string allocations when checking for permissions
Fixes: 334988349
Test: presubmit, pprof
Change-Id: Id960aa7356ac927e57aa92a704de8691a996ab59
-rw-r--r-- | libs/gui/LayerStatePermissions.cpp | 14 | ||||
-rw-r--r-- | libs/gui/include/gui/LayerStatePermissions.h | 7 |
2 files changed, 10 insertions, 11 deletions
diff --git a/libs/gui/LayerStatePermissions.cpp b/libs/gui/LayerStatePermissions.cpp index 28697ca953..c467cfdc68 100644 --- a/libs/gui/LayerStatePermissions.cpp +++ b/libs/gui/LayerStatePermissions.cpp @@ -23,31 +23,31 @@ #include <gui/LayerState.h> namespace android { -std::unordered_map<std::string, int> LayerStatePermissions::mPermissionMap = { +std::vector<std::pair<String16, int>> LayerStatePermissions::mPermissionMap = { // If caller has ACCESS_SURFACE_FLINGER, they automatically get ROTATE_SURFACE_FLINGER // permission, as well - {"android.permission.ACCESS_SURFACE_FLINGER", + {String16("android.permission.ACCESS_SURFACE_FLINGER"), layer_state_t::Permission::ACCESS_SURFACE_FLINGER | layer_state_t::Permission::ROTATE_SURFACE_FLINGER}, - {"android.permission.ROTATE_SURFACE_FLINGER", + {String16("android.permission.ROTATE_SURFACE_FLINGER"), layer_state_t::Permission::ROTATE_SURFACE_FLINGER}, - {"android.permission.INTERNAL_SYSTEM_WINDOW", + {String16("android.permission.INTERNAL_SYSTEM_WINDOW"), layer_state_t::Permission::INTERNAL_SYSTEM_WINDOW}, }; -static bool callingThreadHasPermission(const std::string& permission __attribute__((unused)), +static bool callingThreadHasPermission(const String16& permission __attribute__((unused)), int pid __attribute__((unused)), int uid __attribute__((unused))) { #ifndef __ANDROID_VNDK__ return uid == AID_GRAPHICS || uid == AID_SYSTEM || - PermissionCache::checkPermission(String16(permission.c_str()), pid, uid); + PermissionCache::checkPermission(permission, pid, uid); #endif // __ANDROID_VNDK__ return false; } uint32_t LayerStatePermissions::getTransactionPermissions(int pid, int uid) { uint32_t permissions = 0; - for (auto [permissionName, permissionVal] : mPermissionMap) { + for (const auto& [permissionName, permissionVal] : mPermissionMap) { if (callingThreadHasPermission(permissionName, pid, uid)) { permissions |= permissionVal; } diff --git a/libs/gui/include/gui/LayerStatePermissions.h b/libs/gui/include/gui/LayerStatePermissions.h index a90f30c621..b6588a2a82 100644 --- a/libs/gui/include/gui/LayerStatePermissions.h +++ b/libs/gui/include/gui/LayerStatePermissions.h @@ -15,15 +15,14 @@ */ #include <stdint.h> -#include <string> -#include <unordered_map> - +#include <utils/String16.h> +#include <vector> namespace android { class LayerStatePermissions { public: static uint32_t getTransactionPermissions(int pid, int uid); private: - static std::unordered_map<std::string, int> mPermissionMap; + static std::vector<std::pair<String16, int>> mPermissionMap; }; } // namespace android
\ No newline at end of file |