summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'liblog/logd_write.c')
-rw-r--r--liblog/logd_write.c47
1 files changed, 29 insertions, 18 deletions
diff --git a/liblog/logd_write.c b/liblog/logd_write.c
index a4310aee1..83c6dc296 100644
--- a/liblog/logd_write.c
+++ b/liblog/logd_write.c
@@ -54,14 +54,35 @@
54 54
55static int __write_to_log_init(log_id_t, struct iovec *vec, size_t nr); 55static int __write_to_log_init(log_id_t, struct iovec *vec, size_t nr);
56static int (*write_to_log)(log_id_t, struct iovec *vec, size_t nr) = __write_to_log_init; 56static int (*write_to_log)(log_id_t, struct iovec *vec, size_t nr) = __write_to_log_init;
57#if !defined(_WIN32)
58static pthread_mutex_t log_init_lock = PTHREAD_MUTEX_INITIALIZER;
59#endif
60 57
61#ifndef __unused 58#ifndef __unused
62#define __unused __attribute__((__unused__)) 59#define __unused __attribute__((__unused__))
63#endif 60#endif
64 61
62#if !defined(_WIN32)
63static pthread_mutex_t log_init_lock = PTHREAD_MUTEX_INITIALIZER;
64
65static void lock()
66{
67 /*
68 * If we trigger a signal handler in the middle of locked activity and the
69 * signal handler logs a message, we could get into a deadlock state.
70 */
71 pthread_mutex_lock(&log_init_lock);
72}
73
74static void unlock()
75{
76 pthread_mutex_unlock(&log_init_lock);
77}
78
79#else /* !defined(_WIN32) */
80
81#define lock() ((void)0)
82#define unlock() ((void)0)
83
84#endif /* !defined(_WIN32) */
85
65#if FAKE_LOG_DEVICE 86#if FAKE_LOG_DEVICE
66static int log_fds[(int)LOG_ID_MAX] = { -1, -1, -1, -1, -1 }; 87static int log_fds[(int)LOG_ID_MAX] = { -1, -1, -1, -1, -1 };
67#else 88#else
@@ -277,15 +298,11 @@ static int __write_to_log_daemon(log_id_t log_id, struct iovec *vec, size_t nr)
277 if (ret < 0) { 298 if (ret < 0) {
278 ret = -errno; 299 ret = -errno;
279 if (ret == -ENOTCONN) { 300 if (ret == -ENOTCONN) {
280#if !defined(_WIN32) 301 lock();
281 pthread_mutex_lock(&log_init_lock);
282#endif
283 close(logd_fd); 302 close(logd_fd);
284 logd_fd = -1; 303 logd_fd = -1;
285 ret = __write_to_log_initialize(); 304 ret = __write_to_log_initialize();
286#if !defined(_WIN32) 305 unlock();
287 pthread_mutex_unlock(&log_init_lock);
288#endif
289 306
290 if (ret < 0) { 307 if (ret < 0) {
291 return ret; 308 return ret;
@@ -329,18 +346,14 @@ const char *android_log_id_to_name(log_id_t log_id)
329 346
330static int __write_to_log_init(log_id_t log_id, struct iovec *vec, size_t nr) 347static int __write_to_log_init(log_id_t log_id, struct iovec *vec, size_t nr)
331{ 348{
332#if !defined(_WIN32) 349 lock();
333 pthread_mutex_lock(&log_init_lock);
334#endif
335 350
336 if (write_to_log == __write_to_log_init) { 351 if (write_to_log == __write_to_log_init) {
337 int ret; 352 int ret;
338 353
339 ret = __write_to_log_initialize(); 354 ret = __write_to_log_initialize();
340 if (ret < 0) { 355 if (ret < 0) {
341#if !defined(_WIN32) 356 unlock();
342 pthread_mutex_unlock(&log_init_lock);
343#endif
344#if (FAKE_LOG_DEVICE == 0) 357#if (FAKE_LOG_DEVICE == 0)
345 if (pstore_fd >= 0) { 358 if (pstore_fd >= 0) {
346 __write_to_log_daemon(log_id, vec, nr); 359 __write_to_log_daemon(log_id, vec, nr);
@@ -352,9 +365,7 @@ static int __write_to_log_init(log_id_t log_id, struct iovec *vec, size_t nr)
352 write_to_log = __write_to_log_daemon; 365 write_to_log = __write_to_log_daemon;
353 } 366 }
354 367
355#if !defined(_WIN32) 368 unlock();
356 pthread_mutex_unlock(&log_init_lock);
357#endif
358 369
359 return write_to_log(log_id, vec, nr); 370 return write_to_log(log_id, vec, nr);
360} 371}