summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYiwei Zhang <zzyiwei@google.com>2019-06-28 10:16:49 -0700
committerYiwei Zhang <zzyiwei@google.com>2019-06-28 10:33:58 -0700
commit3c74da9ede3a50335ea1a5237d5565bb472e3141 (patch)
tree90cce5099afa8550da40d200941212416a37b2c1
parent5e3645666e00d21144865177e6e8b3b740b4a4f7 (diff)
downloadnative-3c74da9ede3a50335ea1a5237d5565bb472e3141.tar.gz
GpuStats: move the stats send at Activity launch off UI thread
Prevously when App Activity launches, we send GpuStats on the main UI thread. The async binder to send the stats only takes 30us. However, to get the gpuservice, the sync binder takes around 1.5ms because of the massive binders on CPU at Activity launch. Thus we just move the stats sending to a separate thread off the main UI thread. Now it's just 50us cost on the main UI thread. Bug: 136228448 Test: systrace and check Change-Id: Iff47dbc6a26a9d62ad33e92f93c079ac74fb3ea2
-rw-r--r--libs/graphicsenv/GraphicsEnv.cpp26
1 files changed, 15 insertions, 11 deletions
diff --git a/libs/graphicsenv/GraphicsEnv.cpp b/libs/graphicsenv/GraphicsEnv.cpp
index 1c5fa52855..24b6c2d6de 100644
--- a/libs/graphicsenv/GraphicsEnv.cpp
+++ b/libs/graphicsenv/GraphicsEnv.cpp
@@ -37,6 +37,7 @@
#include <memory>
#include <string>
+#include <thread>
// TODO(b/37049319) Get this from a header once one exists
extern "C" {
@@ -163,17 +164,20 @@ void GraphicsEnv::setDriverPathAndSphalLibraries(const std::string path,
void GraphicsEnv::hintActivityLaunch() {
ATRACE_CALL();
- // If there's already graphics driver preloaded in the process, just send
- // the stats info to GpuStats directly through async binder.
- std::lock_guard<std::mutex> lock(mStatsLock);
- if (mGpuStats.glDriverToSend) {
- mGpuStats.glDriverToSend = false;
- sendGpuStatsLocked(GraphicsEnv::Api::API_GL, true, mGpuStats.glDriverLoadingTime);
- }
- if (mGpuStats.vkDriverToSend) {
- mGpuStats.vkDriverToSend = false;
- sendGpuStatsLocked(GraphicsEnv::Api::API_VK, true, mGpuStats.vkDriverLoadingTime);
- }
+ std::thread trySendGpuStatsThread([this]() {
+ // If there's already graphics driver preloaded in the process, just send
+ // the stats info to GpuStats directly through async binder.
+ std::lock_guard<std::mutex> lock(mStatsLock);
+ if (mGpuStats.glDriverToSend) {
+ mGpuStats.glDriverToSend = false;
+ sendGpuStatsLocked(GraphicsEnv::Api::API_GL, true, mGpuStats.glDriverLoadingTime);
+ }
+ if (mGpuStats.vkDriverToSend) {
+ mGpuStats.vkDriverToSend = false;
+ sendGpuStatsLocked(GraphicsEnv::Api::API_VK, true, mGpuStats.vkDriverLoadingTime);
+ }
+ });
+ trySendGpuStatsThread.detach();
}
void GraphicsEnv::setGpuStats(const std::string& driverPackageName,