Android-x86
Fork
捐款

  • R/O
  • HTTP
  • SSH
  • HTTPS

system-core: 提交

system/core


Commit MetaInfo

修訂ec24610ba1fa74abfe20fa926da934a6862d445d (tree)
時間2017-01-10 13:24:43
作者Chih-Wei Huang <cwhuang@linu...>
CommiterChih-Wei Huang

Log Message

Android 6.0.1 release 74
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iEYEABECAAYFAlgczu4ACgkQ6K0/gZqxDnitCgCePSzI1XB1U5uYTh/Zi64YsrlT
N+8An0LYcv78UQ/41XTrnjQDUrHXtObc
=d0tS
-----END PGP SIGNATURE-----

Merge tag 'android-6.0.1_r74' into marshmallow-x86

Android 6.0.1 release 74

Change Summary

差異

--- a/include/android/log.h
+++ b/include/android/log.h
@@ -89,6 +89,11 @@ typedef enum android_LogPriority {
8989 } android_LogPriority;
9090
9191 /*
92+ * Release any logger resources (a new log write will immediately re-acquire)
93+ */
94+void __android_log_close();
95+
96+/*
9297 * Send a simple string to the log.
9398 */
9499 int __android_log_write(int prio, const char *tag, const char *text);
--- a/include/sysutils/FrameworkListener.h
+++ b/include/sysutils/FrameworkListener.h
@@ -32,6 +32,7 @@ private:
3232 int mCommandCount;
3333 bool mWithSeq;
3434 FrameworkCommandCollection *mCommands;
35+ bool mSkipToNextNullByte;
3536
3637 public:
3738 FrameworkListener(const char *socketName);
--- a/liblog/logd_write.c
+++ b/liblog/logd_write.c
@@ -323,6 +323,48 @@ const char *android_log_id_to_name(log_id_t log_id)
323323 }
324324 #endif
325325
326+/*
327+ * Release any logger resources. A new log write will immediately re-acquire.
328+ */
329+void __android_log_close()
330+{
331+#if FAKE_LOG_DEVICE
332+ int i;
333+#endif
334+
335+#ifdef HAVE_PTHREADS
336+ pthread_mutex_lock(&log_init_lock);
337+#endif
338+
339+ write_to_log = __write_to_log_init;
340+
341+ /*
342+ * Threads that are actively writing at this point are not held back
343+ * by a lock and are at risk of dropping the messages with a return code
344+ * -EBADF. Prefer to return error code than add the overhead of a lock to
345+ * each log writing call to guarantee delivery. In addition, anyone
346+ * calling this is doing so to release the logging resources and shut down,
347+ * for them to do so with outstanding log requests in other threads is a
348+ * disengenuous use of this function.
349+ */
350+#if FAKE_LOG_DEVICE
351+ for (i = 0; i < LOG_ID_MAX; i++) {
352+ fakeLogClose(log_fds[i]);
353+ log_fds[i] = -1;
354+ }
355+#else
356+ close(logd_fd);
357+ logd_fd = -1;
358+
359+ close(pstore_fd);
360+ pstore_fd = -1;
361+#endif
362+
363+#ifdef HAVE_PTHREADS
364+ pthread_mutex_unlock(&log_init_lock);
365+#endif
366+}
367+
326368 static int __write_to_log_init(log_id_t log_id, struct iovec *vec, size_t nr)
327369 {
328370 #if !defined(_WIN32)
--- a/liblog/logd_write_kern.c
+++ b/liblog/logd_write_kern.c
@@ -104,6 +104,41 @@ static int __write_to_log_kernel(log_id_t log_id, struct iovec *vec, size_t nr)
104104 return ret;
105105 }
106106
107+/*
108+ * Release any logger resources. A new log write will immediately re-acquire.
109+ */
110+void __android_log_close()
111+{
112+#ifdef HAVE_PTHREADS
113+ pthread_mutex_lock(&log_init_lock);
114+#endif
115+
116+ write_to_log = __write_to_log_init;
117+
118+ /*
119+ * Threads that are actively writing at this point are not held back
120+ * by a lock and are at risk of dropping the messages with a return code
121+ * -EBADF. Prefer to return error code than add the overhead of a lock to
122+ * each log writing call to guarantee delivery. In addition, anyone
123+ * calling this is doing so to release the logging resources and shut down,
124+ * for them to do so with outstanding log requests in other threads is a
125+ * disengenuous use of this function.
126+ */
127+
128+ log_close(log_fds[LOG_ID_MAIN]);
129+ log_fds[LOG_ID_MAIN] = -1;
130+ log_close(log_fds[LOG_ID_RADIO]);
131+ log_fds[LOG_ID_RADIO] = -1;
132+ log_close(log_fds[LOG_ID_EVENTS]);
133+ log_fds[LOG_ID_EVENTS] = -1;
134+ log_close(log_fds[LOG_ID_SYSTEM]);
135+ log_fds[LOG_ID_SYSTEM] = -1;
136+
137+#ifdef HAVE_PTHREADS
138+ pthread_mutex_unlock(&log_init_lock);
139+#endif
140+}
141+
107142 static int __write_to_log_init(log_id_t log_id, struct iovec *vec, size_t nr)
108143 {
109144 pthread_mutex_lock(&log_init_lock);
--- a/liblog/tests/liblog_test.cpp
+++ b/liblog/tests/liblog_test.cpp
@@ -127,12 +127,17 @@ TEST(liblog, __android_log_btwrite__android_logger_list_read) {
127127 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
128128 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
129129
130+ // Check that we can close and reopen the logger
130131 log_time ts(CLOCK_MONOTONIC);
131-
132132 ASSERT_LT(0, __android_log_btwrite(0, EVENT_TYPE_LONG, &ts, sizeof(ts)));
133+ __android_log_close();
134+
135+ log_time ts1(CLOCK_MONOTONIC);
136+ ASSERT_LT(0, __android_log_btwrite(0, EVENT_TYPE_LONG, &ts1, sizeof(ts1)));
133137 usleep(1000000);
134138
135139 int count = 0;
140+ int second_count = 0;
136141
137142 for (;;) {
138143 log_msg log_msg;
@@ -156,10 +161,13 @@ TEST(liblog, __android_log_btwrite__android_logger_list_read) {
156161 log_time tx(eventData + 4 + 1);
157162 if (ts == tx) {
158163 ++count;
164+ } else if (ts1 == tx) {
165+ ++second_count;
159166 }
160167 }
161168
162169 EXPECT_EQ(1, count);
170+ EXPECT_EQ(1, second_count);
163171
164172 android_logger_list_close(logger_list);
165173 }
--- a/libsysutils/src/FrameworkListener.cpp
+++ b/libsysutils/src/FrameworkListener.cpp
@@ -49,6 +49,7 @@ void FrameworkListener::init(const char *socketName UNUSED, bool withSeq) {
4949 errorRate = 0;
5050 mCommandCount = 0;
5151 mWithSeq = withSeq;
52+ mSkipToNextNullByte = false;
5253 }
5354
5455 bool FrameworkListener::onDataAvailable(SocketClient *c) {
@@ -59,10 +60,15 @@ bool FrameworkListener::onDataAvailable(SocketClient *c) {
5960 if (len < 0) {
6061 SLOGE("read() failed (%s)", strerror(errno));
6162 return false;
62- } else if (!len)
63+ } else if (!len) {
6364 return false;
64- if(buffer[len-1] != '\0')
65+ } else if (buffer[len-1] != '\0') {
6566 SLOGW("String is not zero-terminated");
67+ android_errorWriteLog(0x534e4554, "29831647");
68+ c->sendMsg(500, "Command too large for buffer", false);
69+ mSkipToNextNullByte = true;
70+ return false;
71+ }
6672
6773 int offset = 0;
6874 int i;
@@ -70,11 +76,16 @@ bool FrameworkListener::onDataAvailable(SocketClient *c) {
7076 for (i = 0; i < len; i++) {
7177 if (buffer[i] == '\0') {
7278 /* IMPORTANT: dispatchCommand() expects a zero-terminated string */
73- dispatchCommand(c, buffer + offset);
79+ if (mSkipToNextNullByte) {
80+ mSkipToNextNullByte = false;
81+ } else {
82+ dispatchCommand(c, buffer + offset);
83+ }
7484 offset = i + 1;
7585 }
7686 }
7787
88+ mSkipToNextNullByte = false;
7889 return true;
7990 }
8091
Show on old repository browser