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:
commit
e09c5d2ce4
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue