Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 33c08a53 authored by Jesse Hall's avatar Jesse Hall
Browse files

Load the gralloc module at library load

In the a.h.graphics.mapper default implementation, load the gralloc
module in a static constructor that runs when the library is loaded.
This causes Zygote to load the gralloc module and its dependencies
when it loads a.h.graphics.mapper, so that it doesn't have to be
loaded during each activity launch.

Bug: 62353585
Test: boot to launcher, run calculator, confirm gralloc library is in
      /proc/`pid zygote64`/maps

Change-Id: I56defd76b0ba0fba71dea48e2b0d338511563d1f
parent 9424e9d5
Loading
Loading
Loading
Loading
+20 −9
Original line number Diff line number Diff line
@@ -293,20 +293,31 @@ Return<void> GrallocMapper::unlock(void* buffer, unlock_cb hidl_cb) {
    return Void();
}

IMapper* HIDL_FETCH_IMapper(const char* /* name */) {
    const hw_module_t* module = 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);
    if (err) {
        ALOGE("failed to get gralloc module");
        return nullptr;
        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;

    uint8_t major = (module->module_api_version >> 8) & 0xff;
    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;