liblog: add __android_log_close()
Bug: 30963384
(cherry picked from commit df7a4c6bae5f85532d79a93b7d9197a2aab17825)
Change-Id: Iff0634a66c4b690331f5da66f7a6c2364b64480e
diff --git a/include/android/log.h b/include/android/log.h
index 0ea4c29..cf00a76 100644
--- a/include/android/log.h
+++ b/include/android/log.h
@@ -89,6 +89,11 @@
} 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.
*/
int __android_log_write(int prio, const char *tag, const char *text);
diff --git a/liblog/logd_write.c b/liblog/logd_write.c
index fff7cc4..430c276 100644
--- a/liblog/logd_write.c
+++ b/liblog/logd_write.c
@@ -95,6 +95,41 @@
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