diff options
Diffstat (limited to 'libutils/misc.cpp')
| -rw-r--r-- | libutils/misc.cpp | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/libutils/misc.cpp b/libutils/misc.cpp index ab72fe6ed..d95fd056b 100644 --- a/libutils/misc.cpp +++ b/libutils/misc.cpp @@ -23,6 +23,13 @@ #include <utils/Log.h> #include <utils/Vector.h> +#if defined(__ANDROID__) +#include <dlfcn.h> +#include <vndksupport/linker.h> +#endif + +extern "C" void do_report_sysprop_change(); + using namespace android; namespace android { @@ -61,7 +68,36 @@ void add_sysprop_change_callback(sysprop_change_callback cb, int priority) { #endif } +#if defined(__ANDROID__) +void (*get_report_sysprop_change_func())() { + void (*func)() = nullptr; + void* handle = android_load_sphal_library("libutils.so", RTLD_NOW); + if (handle != nullptr) { + func = reinterpret_cast<decltype(func)>(dlsym(handle, "do_report_sysprop_change")); + } + + return func; +} +#endif + void report_sysprop_change() { + do_report_sysprop_change(); + +#if defined(__ANDROID__) + // libutils.so is double loaded; from the default namespace and from the + // 'sphal' namespace. Redirect the sysprop change event to the other instance + // of libutils.so loaded in the 'sphal' namespace so that listeners attached + // to that instance is also notified with this event. + static auto func = get_report_sysprop_change_func(); + if (func != nullptr) { + (*func)(); + } +#endif +} + +}; // namespace android + +void do_report_sysprop_change() { #if !defined(_WIN32) pthread_mutex_lock(&gSyspropMutex); Vector<sysprop_change_callback_info> listeners; @@ -76,5 +112,3 @@ void report_sysprop_change() { } #endif } - -}; // namespace android |
