Merge "Load the gralloc module at library load" into oc-dr1-dev
diff --git a/graphics/mapper/2.0/default/GrallocMapper.cpp b/graphics/mapper/2.0/default/GrallocMapper.cpp
index d16143d..e06fbcb 100644
--- a/graphics/mapper/2.0/default/GrallocMapper.cpp
+++ b/graphics/mapper/2.0/default/GrallocMapper.cpp
@@ -293,20 +293,31 @@
return Void();
}
-IMapper* HIDL_FETCH_IMapper(const char* /* name */) {
- const hw_module_t* module = nullptr;
- int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
- if (err) {
- ALOGE("failed to get gralloc module");
- return nullptr;
+namespace {
+// Load the gralloc module when this shared library is loaded, rather than
+// waiting until HIDL_FETCH_IMapper is called. This allows it (and its
+// dependencies) to be loaded by Zygote, reducing app startup time and sharing
+// pages dirtied during library load between all apps.
+struct GrallocModule {
+ const hw_module_t* module;
+ GrallocModule() : module(nullptr) {
+ int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
+ ALOGE_IF(err, "failed to get gralloc module: %s (%d)", strerror(-err),
+ err);
}
+};
+GrallocModule gGralloc;
+} // namespace
- uint8_t major = (module->module_api_version >> 8) & 0xff;
+IMapper* HIDL_FETCH_IMapper(const char* /* name */) {
+ if (!gGralloc.module) return nullptr;
+
+ uint8_t major = (gGralloc.module->module_api_version >> 8) & 0xff;
switch (major) {
case 1:
- return new Gralloc1Mapper(module);
+ return new Gralloc1Mapper(gGralloc.module);
case 0:
- return new Gralloc0Mapper(module);
+ return new Gralloc0Mapper(gGralloc.module);
default:
ALOGE("unknown gralloc module major version %d", major);
return nullptr;