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

Commit 2fb3f08d authored by Mark Salyzyn's avatar Mark Salyzyn Committed by Narayan Kamath
Browse files

liblog: add __android_log_close()

Bug: 30963384

(cherry picked from commit df7a4c6b)

Change-Id: Iee7cd0db819644299fa086586630e71415643294
parent 0c572d01
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -88,6 +88,11 @@ typedef enum android_LogPriority {
    ANDROID_LOG_SILENT,     /* only for SetMinPriority(); must be last */
} android_LogPriority;

/*
 * Release any logger resources (a new log write will immediately re-acquire)
 */
void __android_log_close();

/*
 * Send a simple string to the log.
 */
+35 −0
Original line number Diff line number Diff line
@@ -132,6 +132,41 @@ LIBLOG_ABI_PUBLIC int __android_log_dev_available()
    }
    return kLogNotAvailable;
}
/*
 * Release any logger resources. A new log write will immediately re-acquire.
 */
LIBLOG_ABI_PUBLIC void __android_log_close()
{
    struct android_log_transport_write *transport;

    __android_log_lock();

    write_to_log = __write_to_log_init;

    /*
     * Threads that are actively writing at this point are not held back
     * by a lock and are at risk of dropping the messages with a return code
     * -EBADF. Prefer to return error code than add the overhead of a lock to
     * each log writing call to guarantee delivery. In addition, anyone
     * calling this is doing so to release the logging resources and shut down,
     * for them to do so with outstanding log requests in other threads is a
     * disengenuous use of this function.
     */

    write_transport_for_each(transport, &__android_log_persist_write) {
        if (transport->close) {
            (*transport->close)();
        }
    }

    write_transport_for_each(transport, &__android_log_transport_write) {
        if (transport->close) {
            (*transport->close)();
        }
    }

    __android_log_unlock();
}

/* log_init_lock assumed */
static int __write_to_log_initialize()
+9 −1
Original line number Diff line number Diff line
@@ -132,12 +132,17 @@ TEST(liblog, __android_log_btwrite__android_logger_list_read) {
    ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
        LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));

    // Check that we can close and reopen the logger
    log_time ts(CLOCK_MONOTONIC);

    ASSERT_LT(0, __android_log_btwrite(0, EVENT_TYPE_LONG, &ts, sizeof(ts)));
    __android_log_close();

    log_time ts1(CLOCK_MONOTONIC);
    ASSERT_LT(0, __android_log_btwrite(0, EVENT_TYPE_LONG, &ts1, sizeof(ts1)));
    usleep(1000000);

    int count = 0;
    int second_count = 0;

    for (;;) {
        log_msg log_msg;
@@ -161,10 +166,13 @@ TEST(liblog, __android_log_btwrite__android_logger_list_read) {
        log_time tx(eventData + 4 + 1);
        if (ts == tx) {
            ++count;
        } else if (ts1 == tx) {
            ++second_count;
        }
    }

    EXPECT_EQ(1, count);
    EXPECT_EQ(1, second_count);

    android_logger_list_close(logger_list);
}