Commit a481bee2 by Courtney Goeltzenleuchter Committed by Commit Bot

Add GetEnvironmentVarOrUnCachedAndroidProperty

GetEnvironmentVarOrAndroidProperty will first return the given variableName from the processes enviroment if defined. If not defined and running on Android, will look up the corresponding property and store it in the environment. The framecapture code wants to see when the Android property changes so add an uncached version of GetEnvironmentVarOrAndroidProperty that always does the getprop command (which can be time consuming). Bug: b/170328907 Change-Id: I0624c0646889435cb6f6eb20a6d3cceb6ae3eb48 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2520107Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarIan Elliott <ianelliott@google.com> Reviewed-by: 's avatarCody Northrop <cnorthrop@google.com> Commit-Queue: Courtney Goeltzenleuchter <courtneygo@google.com>
parent 4323ed0c
...@@ -240,4 +240,13 @@ std::vector<std::string> GetStringsFromEnvironmentVar(const char *varName, const ...@@ -240,4 +240,13 @@ std::vector<std::string> GetStringsFromEnvironmentVar(const char *varName, const
std::string environment = GetEnvironmentVar(varName); std::string environment = GetEnvironmentVar(varName);
return SplitString(environment, separator, TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY); return SplitString(environment, separator, TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
} }
std::vector<std::string> GetCachedStringsFromEnvironmentVarOrAndroidProperty(
const char *varName,
const char *propertyName,
const char *separator)
{
std::string environment = GetEnvironmentVarOrAndroidProperty(varName, propertyName);
return SplitString(environment, separator, TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
}
} // namespace angle } // namespace angle
...@@ -96,6 +96,13 @@ bool ReplaceSubstring(std::string *str, ...@@ -96,6 +96,13 @@ bool ReplaceSubstring(std::string *str,
// Split up a string parsed from an environment variable. // Split up a string parsed from an environment variable.
std::vector<std::string> GetStringsFromEnvironmentVar(const char *varName, const char *separator); std::vector<std::string> GetStringsFromEnvironmentVar(const char *varName, const char *separator);
// Split up a string parsed from environment variable or via Android property, use cached result if
// available.
std::vector<std::string> GetCachedStringsFromEnvironmentVarOrAndroidProperty(
const char *varName,
const char *propertyName,
const char *separator);
} // namespace angle } // namespace angle
#endif // LIBANGLE_STRING_UTILS_H_ #endif // LIBANGLE_STRING_UTILS_H_
...@@ -26,9 +26,27 @@ std::string GetExecutableName() ...@@ -26,9 +26,27 @@ std::string GetExecutableName()
#endif // ANGLE_PLATFORM_ANDROID #endif // ANGLE_PLATFORM_ANDROID
} }
// On Android return value cached in the process environment, if none, call
// GetEnvironmentVarOrUnCachedAndroidProperty if not in environment.
std::string GetEnvironmentVarOrAndroidProperty(const char *variableName, const char *propertyName)
{
#if defined(ANGLE_PLATFORM_ANDROID) && __ANDROID_API__ >= 21
// Can't use GetEnvironmentVar here because that won't allow us to distinguish between the
// environment being set to an empty string vs. not set at all.
const char *variableValue = getenv(variableName);
if (variableValue != nullptr)
{
std::string value(variableValue);
return value;
}
#endif
return GetEnvironmentVarOrUnCachedAndroidProperty(variableName, propertyName);
}
// Call out to 'getprop' on a shell to get an Android property. If the value was set, set an // Call out to 'getprop' on a shell to get an Android property. If the value was set, set an
// environment variable with that value. Return the value of the environment variable. // environment variable with that value. Return the value of the environment variable.
std::string GetEnvironmentVarOrAndroidProperty(const char *variableName, const char *propertyName) std::string GetEnvironmentVarOrUnCachedAndroidProperty(const char *variableName,
const char *propertyName)
{ {
#if defined(ANGLE_PLATFORM_ANDROID) && __ANDROID_API__ >= 21 #if defined(ANGLE_PLATFORM_ANDROID) && __ANDROID_API__ >= 21
std::string sanitizedPropertyName = propertyName; std::string sanitizedPropertyName = propertyName;
......
...@@ -28,6 +28,8 @@ bool SetCWD(const char *dirName); ...@@ -28,6 +28,8 @@ bool SetCWD(const char *dirName);
bool SetEnvironmentVar(const char *variableName, const char *value); bool SetEnvironmentVar(const char *variableName, const char *value);
bool UnsetEnvironmentVar(const char *variableName); bool UnsetEnvironmentVar(const char *variableName);
std::string GetEnvironmentVar(const char *variableName); std::string GetEnvironmentVar(const char *variableName);
std::string GetEnvironmentVarOrUnCachedAndroidProperty(const char *variableName,
const char *propertyName);
std::string GetEnvironmentVarOrAndroidProperty(const char *variableName, const char *propertyName); std::string GetEnvironmentVarOrAndroidProperty(const char *variableName, const char *propertyName);
const char *GetPathSeparatorForEnvironmentVar(); const char *GetPathSeparatorForEnvironmentVar();
bool PrependPathToEnvironmentVar(const char *variableName, const char *path); bool PrependPathToEnvironmentVar(const char *variableName, const char *path);
......
...@@ -118,7 +118,8 @@ std::string GetDefaultOutDirectory() ...@@ -118,7 +118,8 @@ std::string GetDefaultOutDirectory()
std::string GetCaptureTrigger() std::string GetCaptureTrigger()
{ {
return GetEnvironmentVarOrAndroidProperty(kCaptureTriggerVarName, kAndroidCaptureTrigger); return GetEnvironmentVarOrUnCachedAndroidProperty(kCaptureTriggerVarName,
kAndroidCaptureTrigger);
} }
std::ostream &operator<<(std::ostream &os, gl::ContextID contextId) std::ostream &operator<<(std::ostream &os, gl::ContextID contextId)
...@@ -3565,14 +3566,14 @@ FrameCapture::FrameCapture() ...@@ -3565,14 +3566,14 @@ FrameCapture::FrameCapture()
reset(); reset();
std::string enabledFromEnv = std::string enabledFromEnv =
GetEnvironmentVarOrAndroidProperty(kEnabledVarName, kAndroidCaptureEnabled); GetEnvironmentVarOrUnCachedAndroidProperty(kEnabledVarName, kAndroidCaptureEnabled);
if (enabledFromEnv == "0") if (enabledFromEnv == "0")
{ {
mEnabled = false; mEnabled = false;
} }
std::string pathFromEnv = std::string pathFromEnv =
GetEnvironmentVarOrAndroidProperty(kOutDirectoryVarName, kAndroidOutDir); GetEnvironmentVarOrUnCachedAndroidProperty(kOutDirectoryVarName, kAndroidOutDir);
if (pathFromEnv.empty()) if (pathFromEnv.empty())
{ {
mOutDirectory = GetDefaultOutDirectory(); mOutDirectory = GetDefaultOutDirectory();
...@@ -3589,20 +3590,21 @@ FrameCapture::FrameCapture() ...@@ -3589,20 +3590,21 @@ FrameCapture::FrameCapture()
} }
std::string startFromEnv = std::string startFromEnv =
GetEnvironmentVarOrAndroidProperty(kFrameStartVarName, kAndroidFrameStart); GetEnvironmentVarOrUnCachedAndroidProperty(kFrameStartVarName, kAndroidFrameStart);
if (!startFromEnv.empty()) if (!startFromEnv.empty())
{ {
mCaptureStartFrame = atoi(startFromEnv.c_str()); mCaptureStartFrame = atoi(startFromEnv.c_str());
} }
std::string endFromEnv = GetEnvironmentVarOrAndroidProperty(kFrameEndVarName, kAndroidFrameEnd); std::string endFromEnv =
GetEnvironmentVarOrUnCachedAndroidProperty(kFrameEndVarName, kAndroidFrameEnd);
if (!endFromEnv.empty()) if (!endFromEnv.empty())
{ {
mCaptureEndFrame = atoi(endFromEnv.c_str()); mCaptureEndFrame = atoi(endFromEnv.c_str());
} }
std::string captureTriggerFromEnv = std::string captureTriggerFromEnv =
GetEnvironmentVarOrAndroidProperty(kCaptureTriggerVarName, kAndroidCaptureTrigger); GetEnvironmentVarOrUnCachedAndroidProperty(kCaptureTriggerVarName, kAndroidCaptureTrigger);
if (!captureTriggerFromEnv.empty()) if (!captureTriggerFromEnv.empty())
{ {
mCaptureTrigger = atoi(captureTriggerFromEnv.c_str()); mCaptureTrigger = atoi(captureTriggerFromEnv.c_str());
...@@ -3614,7 +3616,7 @@ FrameCapture::FrameCapture() ...@@ -3614,7 +3616,7 @@ FrameCapture::FrameCapture()
} }
std::string labelFromEnv = std::string labelFromEnv =
GetEnvironmentVarOrAndroidProperty(kCaptureLabel, kAndroidCaptureLabel); GetEnvironmentVarOrUnCachedAndroidProperty(kCaptureLabel, kAndroidCaptureLabel);
if (!labelFromEnv.empty()) if (!labelFromEnv.empty())
{ {
// Optional label to provide unique file names and namespaces // Optional label to provide unique file names and namespaces
...@@ -3622,7 +3624,7 @@ FrameCapture::FrameCapture() ...@@ -3622,7 +3624,7 @@ FrameCapture::FrameCapture()
} }
std::string compressionFromEnv = std::string compressionFromEnv =
GetEnvironmentVarOrAndroidProperty(kCompression, kAndroidCompression); GetEnvironmentVarOrUnCachedAndroidProperty(kCompression, kAndroidCompression);
if (compressionFromEnv == "0") if (compressionFromEnv == "0")
{ {
mCompression = false; mCompression = false;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment