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

Commit bcaeacc6 authored by Christopher Ferris's avatar Christopher Ferris
Browse files

Enable weak functions properly.

There is a check for WEAKS_AVAILABLE that is never set. Change this so
so it is available everywhere except apple/windows.

Add new test to verify that on Android the logStackInternal function is
defined.

Bug: 331489939

Test: All unit tests pass.
Change-Id: Ie982eba30ae421931a62718d39ff1f0c282453db
parent bc3476d5
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