liblog: add __android_log_close() am: 2d14969155 am: 3b2fa3eaef am: 7b16dcf969 am: 94ebdd6b39 am: 5f04ac60d6

am: 4d12c20a5e

Change-Id: Ie41afcef1401543ed3f05dce2834a31487bdc892
This commit is contained in:
Mark Salyzyn 2016-09-07 19:13:53 +00:00 committed by android-build-merger
commit e09c5d2ce4
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

@ -323,6 +323,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)
{
#if !defined(_WIN32)

View File

@ -104,6 +104,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)
{
pthread_mutex_lock(&log_init_lock);

View File

@ -127,12 +127,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;
@ -156,10 +161,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);
}