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

Commit 555f89d8 authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

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
parent 161534a3
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ public:
        PING_TRANSACTION        = B_PACK_CHARS('_','P','N','G'),
        DUMP_TRANSACTION        = B_PACK_CHARS('_','D','M','P'),
        INTERFACE_TRANSACTION   = B_PACK_CHARS('_', 'N', 'T', 'F'),
        SYSPROPS_TRANSACTION    = B_PACK_CHARS('_', 'S', 'P', 'R'),

        // Corresponds to TF_ONE_WAY -- an asynchronous call.
        FLAG_ONEWAY             = 0x00000001
+5 −0
Original line number Diff line number Diff line
@@ -121,11 +121,16 @@ private:
        }
    }

    static void changeCallback();

    // init opens the trace marker file for writing and reads the
    // atrace.tags.enableflags system property.  It does this only the first
    // time it is run, using sMutex for synchronization.
    static void init();

    // retrieve the current value of the system property.
    static void loadSystemProperty();

    // sIsReady is a boolean value indicating whether a call to init() has
    // completed in this process.  It is initialized to 0 and set to 1 when the
    // first init() call completes.  It is set to 1 even if a failure occurred
+4 −0
Original line number Diff line number Diff line
@@ -88,6 +88,10 @@ void strreverse(char* begin, char* end);
void k_itoa(int value, char* str, int base);
char* itoa(int val, int base);

typedef void (*sysprop_change_callback)(void);
void add_sysprop_change_callback(sysprop_change_callback cb, int priority);
void report_sysprop_change();

}; // namespace android

#endif // _LIBS_UTILS_MISC_H
+7 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#include <binder/Binder.h>

#include <utils/Atomic.h>
#include <utils/misc.h>
#include <binder/BpBinder.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>
@@ -199,6 +200,12 @@ status_t BBinder::onTransact(
            }
            return dump(fd, args);
        }

        case SYSPROPS_TRANSACTION: {
            report_sysprop_change();
            return NO_ERROR;
        }

        default:
            return UNKNOWN_TRANSACTION;
    }
+18 −4
Original line number Diff line number Diff line
@@ -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 @@ int Tracer::sTraceFD = -1;
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 @@ void Tracer::init() {
            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
Loading