Loading include/android/log.h +5 −0 Original line number Diff line number Diff line Loading @@ -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. */ Loading liblog/logger_write.c +35 −0 Original line number Diff line number Diff line Loading @@ -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() Loading liblog/tests/liblog_test.cpp +9 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); } Loading Loading
include/android/log.h +5 −0 Original line number Diff line number Diff line Loading @@ -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. */ Loading
liblog/logger_write.c +35 −0 Original line number Diff line number Diff line Loading @@ -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() Loading
liblog/tests/liblog_test.cpp +9 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); } Loading