Merge "liblog: add __android_log_close()"

am: 812d1c7ea2

Change-Id: I2ba5ed22e78564a864bab6b550b6d2bd2609a629
This commit is contained in:
Mark Salyzyn 2016-08-24 16:05:05 +00:00 committed by android-build-merger
commit 6322efe522
3 changed files with 49 additions and 1 deletions

View file

@ -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.
*/

View file

@ -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()

View file

@ -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);
}