summaryrefslogtreecommitdiffstats
path: root/util/log.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/log.c')
-rw-r--r--util/log.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/util/log.c b/util/log.c
index d6eb0378c3..c2198badf2 100644
--- a/util/log.c
+++ b/util/log.c
@@ -42,6 +42,7 @@ static QemuMutex global_mutex;
static char *global_filename;
static FILE *global_file;
static __thread FILE *thread_file;
+static __thread Notifier qemu_log_thread_cleanup_notifier;
int qemu_loglevel;
static bool log_append;
@@ -77,6 +78,12 @@ static int log_thread_id(void)
#endif
}
+static void qemu_log_thread_cleanup(Notifier *n, void *unused)
+{
+ fclose(thread_file);
+ thread_file = NULL;
+}
+
/* Lock/unlock output. */
FILE *qemu_log_trylock(void)
@@ -93,6 +100,8 @@ FILE *qemu_log_trylock(void)
return NULL;
}
thread_file = logfile;
+ qemu_log_thread_cleanup_notifier.notify = qemu_log_thread_cleanup;
+ qemu_thread_atexit_add(&qemu_log_thread_cleanup_notifier);
} else {
rcu_read_lock();
/*
@@ -197,6 +206,15 @@ static bool qemu_set_log_internal(const char *filename, bool changed_name,
QEMU_LOCK_GUARD(&global_mutex);
logfile = global_file;
+ /* The per-thread flag is immutable. */
+ if (log_per_thread) {
+ log_flags |= LOG_PER_THREAD;
+ } else {
+ if (global_filename) {
+ log_flags &= ~LOG_PER_THREAD;
+ }
+ }
+
per_thread = log_flags & LOG_PER_THREAD;
if (changed_name) {