system/corennnnn
Revision | 4d12c20a5e4a978df6c33ccf496dafa29fa0b45e (tree) |
---|---|
Time | 2016-09-08 04:11:22 |
Author | Mark Salyzyn <salyzyn@goog...> |
Commiter | android-build-merger |
liblog: add android_log_close() am: 2d14969155 am: 3b2fa3eaef am: 7b16dcf969 am: 94ebdd6b39
am: 5f04ac60d6
Change-Id: Ib449f7dd39aff26e47feab9796fac140152bae75
@@ -89,6 +89,11 @@ typedef enum android_LogPriority { | ||
89 | 89 | } android_LogPriority; |
90 | 90 | |
91 | 91 | /* |
92 | + * Release any logger resources (a new log write will immediately re-acquire) | |
93 | + */ | |
94 | +void __android_log_close(); | |
95 | + | |
96 | +/* | |
92 | 97 | * Send a simple string to the log. |
93 | 98 | */ |
94 | 99 | int __android_log_write(int prio, const char *tag, const char *text); |
@@ -323,6 +323,45 @@ const char *android_log_id_to_name(log_id_t log_id) | ||
323 | 323 | } |
324 | 324 | #endif |
325 | 325 | |
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 | +#endif | |
359 | + | |
360 | +#ifdef HAVE_PTHREADS | |
361 | + pthread_mutex_unlock(&log_init_lock); | |
362 | +#endif | |
363 | +} | |
364 | + | |
326 | 365 | static int __write_to_log_init(log_id_t log_id, struct iovec *vec, size_t nr) |
327 | 366 | { |
328 | 367 | #if !defined(_WIN32) |
@@ -104,6 +104,41 @@ static int __write_to_log_kernel(log_id_t log_id, struct iovec *vec, size_t nr) | ||
104 | 104 | return ret; |
105 | 105 | } |
106 | 106 | |
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 | + | |
107 | 142 | static int __write_to_log_init(log_id_t log_id, struct iovec *vec, size_t nr) |
108 | 143 | { |
109 | 144 | pthread_mutex_lock(&log_init_lock); |
@@ -127,12 +127,17 @@ TEST(liblog, __android_log_btwrite__android_logger_list_read) { | ||
127 | 127 | ASSERT_TRUE(NULL != (logger_list = android_logger_list_open( |
128 | 128 | LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid))); |
129 | 129 | |
130 | + // Check that we can close and reopen the logger | |
130 | 131 | log_time ts(CLOCK_MONOTONIC); |
131 | - | |
132 | 132 | 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))); | |
133 | 137 | usleep(1000000); |
134 | 138 | |
135 | 139 | int count = 0; |
140 | + int second_count = 0; | |
136 | 141 | |
137 | 142 | for (;;) { |
138 | 143 | log_msg log_msg; |
@@ -156,10 +161,13 @@ TEST(liblog, __android_log_btwrite__android_logger_list_read) { | ||
156 | 161 | log_time tx(eventData + 4 + 1); |
157 | 162 | if (ts == tx) { |
158 | 163 | ++count; |
164 | + } else if (ts1 == tx) { | |
165 | + ++second_count; | |
159 | 166 | } |
160 | 167 | } |
161 | 168 | |
162 | 169 | EXPECT_EQ(1, count); |
170 | + EXPECT_EQ(1, second_count); | |
163 | 171 | |
164 | 172 | android_logger_list_close(logger_list); |
165 | 173 | } |