diff options
Diffstat (limited to 'common')
-rw-r--r-- | common/msg.c | 70 |
1 files changed, 36 insertions, 34 deletions
diff --git a/common/msg.c b/common/msg.c index 336a6d67cc..a884fa7d5a 100644 --- a/common/msg.c +++ b/common/msg.c @@ -47,9 +47,10 @@ struct mp_log_root { struct mpv_global *global; + pthread_mutex_t lock; pthread_mutex_t log_file_lock; pthread_cond_t log_file_wakeup; - // --- protected by mp_msg_lock + // --- protected by lock char **msg_levels; bool use_terminal; // make accesses to stderr/stdout bool module; @@ -64,13 +65,12 @@ struct mp_log_root { int num_buffers; struct mp_log_buffer *early_buffer; FILE *stats_file; + bstr buffer; // --- must be accessed atomically /* This is incremented every time the msglevels must be reloaded. * (This is perhaps better than maintaining a globally accessible and * synchronized mp_log tree.) */ atomic_ulong reload_counter; - // --- protected by mp_msg_lock - bstr buffer; // --- owner thread only (caller of mp_msg_init() etc.) char *log_path; char *stats_path; @@ -108,9 +108,6 @@ struct mp_log_buffer { int level; }; -// Protects some (not all) state in mp_log_root -static pthread_mutex_t mp_msg_lock = PTHREAD_MUTEX_INITIALIZER; - static const struct mp_log null_log = {0}; struct mp_log *const mp_null_log = (struct mp_log *)&null_log; @@ -126,7 +123,7 @@ static bool match_mod(const char *name, const char *mod) static void update_loglevel(struct mp_log *log) { struct mp_log_root *root = log->root; - pthread_mutex_lock(&mp_msg_lock); + pthread_mutex_lock(&root->lock); log->level = MSGL_STATUS + root->verbose; // default log level if (root->really_quiet) log->level -= 10; @@ -147,7 +144,7 @@ static void update_loglevel(struct mp_log *log) if (log->root->stats_file) log->level = MPMAX(log->level, MSGL_STATS); atomic_store(&log->reload_counter, atomic_load(&log->root->reload_counter)); - pthread_mutex_unlock(&mp_msg_lock); + pthread_mutex_unlock(&root->lock); } // Get the current effective msg level. @@ -212,17 +209,19 @@ static void flush_status_line(struct mp_log_root *root) void mp_msg_flush_status_line(struct mp_log *log) { - pthread_mutex_lock(&mp_msg_lock); - if (log->root) + if (log->root) { + pthread_mutex_lock(&log->root->lock); flush_status_line(log->root); - pthread_mutex_unlock(&mp_msg_lock); + pthread_mutex_unlock(&log->root->lock); + } } bool mp_msg_has_status_line(struct mpv_global *global) { - pthread_mutex_lock(&mp_msg_lock); - bool r = global->log->root->status_lines > 0; - pthread_mutex_unlock(&mp_msg_lock); + struct mp_log_root *root = global->log->root; + pthread_mutex_lock(&root->lock); + bool r = root->status_lines > 0; + pthread_mutex_unlock(&root->lock); return r; } @@ -379,10 +378,10 @@ void mp_msg_va(struct mp_log *log, int lev, const char *format, va_list va) if (!mp_msg_test(log, lev)) return; // do not display - pthread_mutex_lock(&mp_msg_lock); - struct mp_log_root *root = log->root; + pthread_mutex_lock(&root->lock); + root->buffer.len = 0; if (log->partial[0]) @@ -427,7 +426,7 @@ void mp_msg_va(struct mp_log *log, int lev, const char *format, va_list va) } } - pthread_mutex_unlock(&mp_msg_lock); + pthread_mutex_unlock(&root->lock); } static void destroy_log(void *ptr) @@ -492,6 +491,7 @@ void mp_msg_init(struct mpv_global *global) .reload_counter = ATOMIC_VAR_INIT(1), }; + pthread_mutex_init(&root->lock, NULL); pthread_mutex_init(&root->log_file_lock, NULL); pthread_cond_init(&root->log_file_wakeup, NULL); @@ -595,7 +595,7 @@ void mp_msg_update_msglevels(struct mpv_global *global, struct MPOpts *opts) { struct mp_log_root *root = global->log->root; - pthread_mutex_lock(&mp_msg_lock); + pthread_mutex_lock(&root->lock); root->verbose = opts->verbose; root->really_quiet = opts->msg_really_quiet; @@ -609,7 +609,7 @@ void mp_msg_update_msglevels(struct mpv_global *global, struct MPOpts *opts) m_option_type_msglevels.copy(NULL, &root->msg_levels, &opts->msg_levels); atomic_fetch_add(&root->reload_counter, 1); - pthread_mutex_unlock(&mp_msg_lock); + pthread_mutex_unlock(&root->lock); if (check_new_path(global, opts->log_file, &root->log_path)) { terminate_log_file_thread(root); @@ -636,7 +636,7 @@ void mp_msg_update_msglevels(struct mpv_global *global, struct MPOpts *opts) if (check_new_path(global, opts->dump_stats, &root->stats_path)) { bool open_error = false; - pthread_mutex_lock(&mp_msg_lock); + pthread_mutex_lock(&root->lock); if (root->stats_file) fclose(root->stats_file); root->stats_file = NULL; @@ -644,7 +644,7 @@ void mp_msg_update_msglevels(struct mpv_global *global, struct MPOpts *opts) root->stats_file = fopen(root->stats_path, "wb"); open_error = !root->stats_file; } - pthread_mutex_unlock(&mp_msg_lock); + pthread_mutex_unlock(&root->lock); if (open_error) { mp_err(global->log, "Failed to open stats file '%s'\n", @@ -657,9 +657,9 @@ void mp_msg_force_stderr(struct mpv_global *global, bool force_stderr) { struct mp_log_root *root = global->log->root; - pthread_mutex_lock(&mp_msg_lock); + pthread_mutex_lock(&root->lock); root->force_stderr = force_stderr; - pthread_mutex_unlock(&mp_msg_lock); + pthread_mutex_unlock(&root->lock); } // Only to be called from the main thread. @@ -681,6 +681,7 @@ void mp_msg_uninit(struct mpv_global *global) talloc_free(root->stats_path); talloc_free(root->log_path); m_option_type_msglevels.free(&root->msg_levels); + pthread_mutex_destroy(&root->lock); pthread_mutex_destroy(&root->log_file_lock); pthread_cond_destroy(&root->log_file_wakeup); talloc_free(root); @@ -690,27 +691,27 @@ void mp_msg_uninit(struct mpv_global *global) void mp_msg_set_early_logging(struct mpv_global *global, bool enable) { struct mp_log_root *root = global->log->root; - pthread_mutex_lock(&mp_msg_lock); + pthread_mutex_lock(&root->lock); if (enable != !!root->early_buffer) { if (enable) { - pthread_mutex_unlock(&mp_msg_lock); + pthread_mutex_unlock(&root->lock); struct mp_log_buffer *buf = mp_msg_log_buffer_new(global, TERM_BUF, MP_LOG_BUFFER_MSGL_TERM, NULL, NULL); - pthread_mutex_lock(&mp_msg_lock); + pthread_mutex_lock(&root->lock); assert(!root->early_buffer); // no concurrent calls to this function root->early_buffer = buf; } else { struct mp_log_buffer *buf = root->early_buffer; root->early_buffer = NULL; - pthread_mutex_unlock(&mp_msg_lock); + pthread_mutex_unlock(&root->lock); mp_msg_log_buffer_destroy(buf); return; } } - pthread_mutex_unlock(&mp_msg_lock); + pthread_mutex_unlock(&root->lock); } struct mp_log_buffer *mp_msg_log_buffer_new(struct mpv_global *global, @@ -720,7 +721,7 @@ struct mp_log_buffer *mp_msg_log_buffer_new(struct mpv_global *global, { struct mp_log_root *root = global->log->root; - pthread_mutex_lock(&mp_msg_lock); + pthread_mutex_lock(&root->lock); if (level == MP_LOG_BUFFER_MSGL_TERM) { size = TERM_BUF; @@ -734,7 +735,7 @@ struct mp_log_buffer *mp_msg_log_buffer_new(struct mpv_global *global, root->early_buffer = NULL; buffer->wakeup_cb = wakeup_cb; buffer->wakeup_cb_ctx = wakeup_cb_ctx; - pthread_mutex_unlock(&mp_msg_lock); + pthread_mutex_unlock(&root->lock); return buffer; } } @@ -756,7 +757,7 @@ struct mp_log_buffer *mp_msg_log_buffer_new(struct mpv_global *global, MP_TARRAY_APPEND(root, root->buffers, root->num_buffers, buffer); atomic_fetch_add(&root->reload_counter, 1); - pthread_mutex_unlock(&mp_msg_lock); + pthread_mutex_unlock(&root->lock); return buffer; } @@ -773,9 +774,10 @@ void mp_msg_log_buffer_destroy(struct mp_log_buffer *buffer) if (!buffer) return; - pthread_mutex_lock(&mp_msg_lock); - struct mp_log_root *root = buffer->root; + + pthread_mutex_lock(&root->lock); + for (int n = 0; n < root->num_buffers; n++) { if (root->buffers[n] == buffer) { MP_TARRAY_REMOVE_AT(root->buffers, root->num_buffers, n); @@ -794,7 +796,7 @@ found: talloc_free(buffer); atomic_fetch_add(&root->reload_counter, 1); - pthread_mutex_unlock(&mp_msg_lock); + pthread_mutex_unlock(&root->lock); } // Return a queued message, or if the buffer is empty, NULL. |