summaryrefslogtreecommitdiffstats
path: root/util
diff options
context:
space:
mode:
authorGreg Kurz2022-10-21 12:57:34 +0200
committerPaolo Bonzini2022-10-31 09:46:34 +0100
commiteff3de52f265df39c6fc668415ad317ec1f24051 (patch)
treef5cf5a9ca592a20a5361813de78d9bb1a403443c /util
parenttarget/i386: Set maximum APIC ID to KVM prior to vCPU creation (diff)
downloadqemu-eff3de52f265df39c6fc668415ad317ec1f24051.tar.gz
qemu-eff3de52f265df39c6fc668415ad317ec1f24051.tar.xz
qemu-eff3de52f265df39c6fc668415ad317ec1f24051.zip
util/log: Close per-thread log file on thread termination
When `-D ${logfile} -d tid` is passed, qemu_log_trylock() creates a dedicated log file for the current thread and opens it. The corresponding file descriptor is cached in a __thread variable. Nothing is done to close the corresponding file descriptor when the thread terminates though and the file descriptor is leaked. The issue was found during code inspection and reproduced manually. Fix that with an atexit notifier. Fixes: 4e51069d6793 ("util/log: Support per-thread log files") Cc: richard.henderson@linaro.org Signed-off-by: Greg Kurz <groug@kaod.org> Message-Id: <20221021105734.555797-1-groug@kaod.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'util')
-rw-r--r--util/log.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/util/log.c b/util/log.c
index d6eb0378c3..39866bdaf2 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();
/*