Path: blob/master/thirdparty/openxr/src/loader/loader_properties.cpp
11325 views
// Copyright (c) 2017-2025 The Khronos Group Inc.1//2// SPDX-License-Identifier: Apache-2.0 OR MIT3//45#include "loader_properties.hpp"6#include <platform_utils.hpp>78#include <string>9#include <unordered_map>10#include <mutex>1112namespace {1314std::mutex& GetOverridePropertiesMutex() {15static std::mutex override_properties_mutex;16return override_properties_mutex;17}1819std::unordered_map<std::string, std::string>& GetOverrideProperties() {20static std::unordered_map<std::string, std::string> override_properties;21return override_properties;22}2324const std::string* TryGetPropertyOverride(const std::string& name) {25const auto& overrideProperties = GetOverrideProperties();26const auto& overrideProperty = overrideProperties.find(name);27if (overrideProperty != overrideProperties.end()) {28return &overrideProperty->second;29}30return nullptr;31}3233} // namespace3435// Loader property overrides take precedence over system environment variables because environment variables are not always36// safe to use (and thus would be ignored). For example, override properties may be the only way to redirect XR_RUNTIME_JSON37// from an elevated process on Windows.3839namespace LoaderProperty {4041std::string Get(const std::string& name) {42std::lock_guard<std::mutex> lock(GetOverridePropertiesMutex());43const std::string* propertyOverride = TryGetPropertyOverride(name);44if (propertyOverride != nullptr) {45return *propertyOverride;46} else {47return PlatformUtilsGetEnv(name.c_str());48}49}5051std::string GetSecure(const std::string& name) {52std::lock_guard<std::mutex> lock(GetOverridePropertiesMutex());53const std::string* propertyOverride = TryGetPropertyOverride(name);54if (propertyOverride != nullptr) {55return *propertyOverride;56} else {57return PlatformUtilsGetSecureEnv(name.c_str());58}59}6061bool IsSet(const std::string& name) {62std::lock_guard<std::mutex> lock(GetOverridePropertiesMutex());63const std::string* propertyOverride = TryGetPropertyOverride(name);64return propertyOverride != nullptr || PlatformUtilsGetEnvSet(name.c_str());65}6667void SetOverride(std::string name, std::string value) {68std::lock_guard<std::mutex> lock(GetOverridePropertiesMutex());69auto& overrideProperties = GetOverrideProperties();70overrideProperties.insert(std::make_pair(std::move(name), std::move(value)));71}7273void ClearOverrides() {74std::lock_guard<std::mutex> lock(GetOverridePropertiesMutex());75auto& overrideProperties = GetOverrideProperties();76overrideProperties.clear();77}7879} // namespace LoaderProperty808182