Add callback hack to find out when to reload system properties.

Every IBinder object can accept a new transaction to tell it that
it might want to reload system properties, and in the process
anyone can register a callback to be executed when this happens.

Use this to reload the trace property.

This is very much ONLY for debugging.

Change-Id: I55c67c46f8f3fa9073bef0dfaab4577ed1d47eb4
diff --git a/libs/utils/Trace.cpp b/libs/utils/Trace.cpp
index f3ec485..5cd5731 100644
--- a/libs/utils/Trace.cpp
+++ b/libs/utils/Trace.cpp
@@ -19,6 +19,7 @@
 #include <cutils/properties.h>
 #include <utils/Log.h>
 #include <utils/Trace.h>
+#include <utils/misc.h>
 
 namespace android {
 
@@ -27,10 +28,19 @@
 uint64_t Tracer::sEnabledTags = 0;
 Mutex Tracer::sMutex;
 
+void Tracer::changeCallback() {
+    Mutex::Autolock lock(sMutex);
+    if (sIsReady && sTraceFD >= 0) {
+        loadSystemProperty();
+    }
+}
+
 void Tracer::init() {
     Mutex::Autolock lock(sMutex);
 
     if (!sIsReady) {
+        add_sysprop_change_callback(changeCallback, 0);
+
         const char* const traceFileName =
                 "/sys/kernel/debug/tracing/trace_marker";
         sTraceFD = open(traceFileName, O_WRONLY);
@@ -38,14 +48,18 @@
             ALOGE("error opening trace file: %s (%d)", strerror(errno), errno);
             // sEnabledTags remains zero indicating that no tracing can occur
         } else {
-            char value[PROPERTY_VALUE_MAX];
-            property_get("debug.atrace.tags.enableflags", value, "0");
-            sEnabledTags = (strtoll(value, NULL, 0) & ATRACE_TAG_VALID_MASK)
-                    | ATRACE_TAG_ALWAYS;
+            loadSystemProperty();
         }
 
         android_atomic_release_store(1, &sIsReady);
     }
 }
 
+void Tracer::loadSystemProperty() {
+    char value[PROPERTY_VALUE_MAX];
+    property_get("debug.atrace.tags.enableflags", value, "0");
+    sEnabledTags = (strtoll(value, NULL, 0) & ATRACE_TAG_VALID_MASK)
+            | ATRACE_TAG_ALWAYS;
+}
+
 } // namespace andoid