summaryrefslogtreecommitdiffstats
path: root/libutils/misc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libutils/misc.cpp')
-rw-r--r--libutils/misc.cpp38
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