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;