diff options
Diffstat (limited to 'liblog/logd_write.c')
-rw-r--r-- | liblog/logd_write.c | 47 |
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 | ||
55 | static int __write_to_log_init(log_id_t, struct iovec *vec, size_t nr); | 55 | static int __write_to_log_init(log_id_t, struct iovec *vec, size_t nr); |
56 | static int (*write_to_log)(log_id_t, struct iovec *vec, size_t nr) = __write_to_log_init; | 56 | static int (*write_to_log)(log_id_t, struct iovec *vec, size_t nr) = __write_to_log_init; |
57 | #if !defined(_WIN32) | ||
58 | static 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) | ||
63 | static pthread_mutex_t log_init_lock = PTHREAD_MUTEX_INITIALIZER; | ||
64 | |||
65 | static 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 | |||
74 | static 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 |
66 | static int log_fds[(int)LOG_ID_MAX] = { -1, -1, -1, -1, -1 }; | 87 | static 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 | ||
330 | static int __write_to_log_init(log_id_t log_id, struct iovec *vec, size_t nr) | 347 | static 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 | } |