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

Commit 283482bd authored by Christopher Ferris's avatar Christopher Ferris Committed by Gerrit Code Review
Browse files

Merge "Enable weak functions properly." into main

parents 0c2ae800 bcaeacc6
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -89,7 +89,8 @@ void CallStack::print(Printer& printer) const {
// The following four functions may be used via weak symbol references from libutils.
// Clients assume that if any of these symbols are available, then deleteStack() is.

#ifdef WEAKS_AVAILABLE
// Apple and Windows does not support this, so only compile on other platforms.
#if !defined(__APPLE__) && !defined(_WIN32)

CallStack::CallStackUPtr CallStack::getCurrentInternal(int ignoreDepth) {
    CallStack::CallStackUPtr stack(new CallStack());
@@ -110,6 +111,6 @@ void CallStack::deleteStack(CallStack* stack) {
    delete stack;
}

#endif // WEAKS_AVAILABLE
#endif  // !defined(__APPLE__) && !defined(_WIN32)

}; // namespace android
+41 −0
Original line number Diff line number Diff line
@@ -18,10 +18,16 @@

#include <thread>

#include <android-base/test_utils.h>
#include <android-base/threads.h>
#include <gtest/gtest.h>
#include <utils/CallStack.h>

#if defined(__ANDROID__)
#include <log/log.h>
#include <log/log_read.h>
#endif

__attribute__((__noinline__)) extern "C" void CurrentCaller(android::String8& backtrace) {
    android::CallStack cs;
    cs.update();
@@ -61,3 +67,38 @@ TEST(CallStackTest, thread_backtrace) {

    ASSERT_NE(-1, cs.toString().find("(ThreadBusyWait")) << "Full backtrace:\n" << cs.toString();
}

#if defined(__ANDROID__)
TEST(CallStackTest, log_stack) {
    android::CallStack::logStack("callstack_test");
    auto logger_list = android_logger_list_open(android_name_to_log_id("main"),
                                                ANDROID_LOG_NONBLOCK, 1000, getpid());
    ASSERT_NE(nullptr, logger_list);
    std::string log;
    while (true) {
        log_msg log_msg;
        auto ret = android_logger_list_read(logger_list, &log_msg);
        if (ret == -EAGAIN) {
            break;
        }
        ASSERT_GT(ret, 0);
        if (log_msg.msg() == nullptr) {
            continue;
        }
        // First get the tag.
        char* msg = &log_msg.msg()[1];
        if (std::string(msg) != "callstack_test") {
            continue;
        }
        // Now move past the tag.
        msg = &msg[strlen(msg) + 1];
        log += msg;
        log += '\n';
    }
    ASSERT_NE("", log) << "No messages found in the log from the test.";
    // Look for a backtrace line such as:
    //   #00 pc 00000000000536e4  libutils_test (testing::Test::Run()+436)
    ASSERT_MATCH(log, "#\\d+ pc \\d+");
    android_logger_list_close(logger_list);
}
#endif