liblog: add __android_log_close()

am: 2d14969155

Change-Id: Ieb4a9620abfe505c7f036deab79a7abcc6ea64b2
This commit is contained in:
Mark Salyzyn 2016-09-07 18:55:28 +00:00 committed by android-build-merger
commit 3b2fa3eaef
4 changed files with 88 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

@ -282,6 +282,45 @@ const char *android_log_id_to_name(log_id_t log_id)
}
#endif
/*
* Release any logger resources. A new log write will immediately re-acquire.
*/
void __android_log_close()
{
#if FAKE_LOG_DEVICE
int i;
#endif
#ifdef HAVE_PTHREADS
pthread_mutex_lock(&log_init_lock);
#endif
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.
*/
#if FAKE_LOG_DEVICE
for (i = 0; i < LOG_ID_MAX; i++) {
fakeLogClose(log_fds[i]);
log_fds[i] = -1;
}
#else
close(logd_fd);
logd_fd = -1;
#endif
#ifdef HAVE_PTHREADS
pthread_mutex_unlock(&log_init_lock);
#endif
}
static int __write_to_log_init(log_id_t log_id, struct iovec *vec, size_t nr)
{
#ifdef HAVE_PTHREADS

View File

@ -117,6 +117,41 @@ static int __write_to_log_kernel(log_id_t log_id, struct iovec *vec, size_t nr)
return ret;
}
/*
* Release any logger resources. A new log write will immediately re-acquire.
*/
void __android_log_close()
{
#ifdef HAVE_PTHREADS
pthread_mutex_lock(&log_init_lock);
#endif
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.
*/
log_close(log_fds[LOG_ID_MAIN]);
log_fds[LOG_ID_MAIN] = -1;
log_close(log_fds[LOG_ID_RADIO]);
log_fds[LOG_ID_RADIO] = -1;
log_close(log_fds[LOG_ID_EVENTS]);
log_fds[LOG_ID_EVENTS] = -1;
log_close(log_fds[LOG_ID_SYSTEM]);
log_fds[LOG_ID_SYSTEM] = -1;
#ifdef HAVE_PTHREADS
pthread_mutex_unlock(&log_init_lock);
#endif
}
static int __write_to_log_init(log_id_t log_id, struct iovec *vec, size_t nr)
{
#ifdef HAVE_PTHREADS

View File

@ -124,12 +124,17 @@ TEST(liblog, __android_log_btwrite__android_logger_list_read) {
ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
LOG_ID_EVENTS, O_RDONLY | O_NDELAY, 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;
@ -153,10 +158,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);
}