OSDN Git Service

Revert "Load the gralloc module at library load"
authorJesse Hall <jessehall@google.com>
Mon, 19 Jun 2017 18:48:09 +0000 (11:48 -0700)
committerJesse Hall <jessehall@google.com>
Mon, 19 Jun 2017 18:48:09 +0000 (11:48 -0700)
This reverts commit 33c08a53ac641c9a9e5a6a1ed75cfb924c95258f. Some
gralloc implementations apparently have library initializers (executed
on dlopen) which create anonymous sockets, open device nodes, etc.
which Zygote and some other non-Zygote-child processes that use libui
don't have permissions to do. When the library initializer fails, it
crashes the process.

Reverting this until this initialization code can be made lazy (on
first use of gralloc).

Bug: 62732270
Test: boot fugu to launcher

graphics/mapper/2.0/default/GrallocMapper.cpp

index e06fbcb..d16143d 100644 (file)
@@ -293,31 +293,20 @@ Return<void> GrallocMapper::unlock(void* buffer, unlock_cb hidl_cb) {
     return Void();
 }
 
-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
-
 IMapper* HIDL_FETCH_IMapper(const char* /* name */) {
-    if (!gGralloc.module) return nullptr;
+    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;
+    }
 
-    uint8_t major = (gGralloc.module->module_api_version >> 8) & 0xff;
+    uint8_t major = (module->module_api_version >> 8) & 0xff;
     switch (major) {
         case 1:
-            return new Gralloc1Mapper(gGralloc.module);
+            return new Gralloc1Mapper(module);
         case 0:
-            return new Gralloc0Mapper(gGralloc.module);
+            return new Gralloc0Mapper(module);
         default:
             ALOGE("unknown gralloc module major version %d", major);
             return nullptr;