[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL for-7.1 24/36] util/log: Introduce qemu_set_log_filename_flags
From: |
Richard Henderson |
Subject: |
[PULL for-7.1 24/36] util/log: Introduce qemu_set_log_filename_flags |
Date: |
Sun, 20 Mar 2022 10:11:23 -0700 |
Provide a function to set both filename and flags at
the same time. This is the common case at startup.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
include/qemu/log.h | 1 +
util/log.c | 122 ++++++++++++++++++++++++++++-----------------
2 files changed, 77 insertions(+), 46 deletions(-)
diff --git a/include/qemu/log.h b/include/qemu/log.h
index c63416c9e0..ef247776cf 100644
--- a/include/qemu/log.h
+++ b/include/qemu/log.h
@@ -82,6 +82,7 @@ extern const QEMULogItem qemu_log_items[];
void qemu_set_log(int log_flags, Error **errp);
void qemu_set_log_filename(const char *filename, Error **errp);
+void qemu_set_log_filename_flags(const char *name, int flags, Error **errp);
void qemu_set_dfilter_ranges(const char *ranges, Error **errp);
bool qemu_log_in_addr_range(uint64_t addr);
int qemu_str_to_log_mask(const char *str);
diff --git a/util/log.c b/util/log.c
index 7e8b152742..46a0d38d41 100644
--- a/util/log.c
+++ b/util/log.c
@@ -126,15 +126,58 @@ static void qemu_logfile_free(QemuLogFile *logfile)
}
/* enable or disable low levels log */
-void qemu_set_log(int log_flags, Error **errp)
+static void qemu_set_log_internal(const char *filename, bool changed_name,
+ int log_flags, Error **errp)
{
- bool need_to_open_file = false;
+ bool need_to_open_file;
QemuLogFile *logfile;
- qemu_loglevel = log_flags;
+ QEMU_LOCK_GUARD(&qemu_logfile_mutex);
+ logfile = qemu_logfile;
+
+ if (changed_name) {
+ char *newname = NULL;
+
+ /*
+ * Allow the user to include %d in their logfile which will be
+ * substituted with the current PID. This is useful for debugging many
+ * nested linux-user tasks but will result in lots of logs.
+ *
+ * filename may be NULL. In that case, log output is sent to stderr
+ */
+ if (filename) {
+ char *pidstr = strstr(filename, "%");
+
+ if (pidstr) {
+ /* We only accept one %d, no other format strings */
+ if (pidstr[1] != 'd' || strchr(pidstr + 2, '%')) {
+ error_setg(errp, "Bad logfile format: %s", filename);
+ return;
+ }
+ newname = g_strdup_printf(filename, getpid());
+ } else {
+ newname = g_strdup(filename);
+ }
+ }
+
+ g_free(logfilename);
+ logfilename = newname;
+ filename = newname;
+
+ if (logfile) {
+ qatomic_rcu_set(&qemu_logfile, NULL);
+ call_rcu(logfile, qemu_logfile_free, rcu);
+ logfile = NULL;
+ }
+ } else {
+ filename = logfilename;
+ }
+
#ifdef CONFIG_TRACE_LOG
- qemu_loglevel |= LOG_TRACE;
+ log_flags |= LOG_TRACE;
#endif
+ qemu_loglevel = log_flags;
+
/*
* In all cases we only log if qemu_loglevel is set.
* Also:
@@ -143,70 +186,57 @@ void qemu_set_log(int log_flags, Error **errp)
* If we are daemonized,
* we will only log if there is a logfilename.
*/
- if (qemu_loglevel && (!is_daemonized() || logfilename)) {
- need_to_open_file = true;
- }
- QEMU_LOCK_GUARD(&qemu_logfile_mutex);
- if (qemu_logfile && !need_to_open_file) {
- logfile = qemu_logfile;
+ need_to_open_file = log_flags && (!is_daemonized() || filename);
+
+ if (logfile && !need_to_open_file) {
qatomic_rcu_set(&qemu_logfile, NULL);
call_rcu(logfile, qemu_logfile_free, rcu);
- } else if (!qemu_logfile && need_to_open_file) {
- logfile = g_new0(QemuLogFile, 1);
- if (logfilename) {
- logfile->fd = fopen(logfilename, log_append ? "a" : "w");
- if (!logfile->fd) {
+ return;
+ }
+ if (!logfile && need_to_open_file) {
+ FILE *fd;
+
+ if (filename) {
+ fd = fopen(filename, log_append ? "a" : "w");
+ if (!fd) {
error_setg_errno(errp, errno, "Error opening logfile %s",
- logfilename);
+ filename);
return;
}
/* In case we are a daemon redirect stderr to logfile */
if (is_daemonized()) {
- dup2(fileno(logfile->fd), STDERR_FILENO);
- fclose(logfile->fd);
+ dup2(fileno(fd), STDERR_FILENO);
+ fclose(fd);
/* This will skip closing logfile in qemu_log_close() */
- logfile->fd = stderr;
+ fd = stderr;
}
} else {
/* Default to stderr if no log file specified */
assert(!is_daemonized());
- logfile->fd = stderr;
+ fd = stderr;
}
log_append = 1;
+
+ logfile = g_new0(QemuLogFile, 1);
+ logfile->fd = fd;
qatomic_rcu_set(&qemu_logfile, logfile);
}
}
-/*
- * Allow the user to include %d in their logfile which will be
- * substituted with the current PID. This is useful for debugging many
- * nested linux-user tasks but will result in lots of logs.
- *
- * filename may be NULL. In that case, log output is sent to stderr
- */
+void qemu_set_log(int log_flags, Error **errp)
+{
+ qemu_set_log_internal(NULL, false, log_flags, errp);
+}
+
void qemu_set_log_filename(const char *filename, Error **errp)
{
- g_free(logfilename);
- logfilename = NULL;
+ qemu_set_log_internal(filename, true, qemu_loglevel, errp);
+}
- if (filename) {
- char *pidstr = strstr(filename, "%");
- if (pidstr) {
- /* We only accept one %d, no other format strings */
- if (pidstr[1] != 'd' || strchr(pidstr + 2, '%')) {
- error_setg(errp, "Bad logfile format: %s", filename);
- return;
- } else {
- logfilename = g_strdup_printf(filename, getpid());
- }
- } else {
- logfilename = g_strdup(filename);
- }
- }
-
- qemu_log_close();
- qemu_set_log(qemu_loglevel, errp);
+void qemu_set_log_filename_flags(const char *name, int flags, Error **errp)
+{
+ qemu_set_log_internal(name, true, flags, errp);
}
/* Returns true if addr is in our debug filter or no filter defined
--
2.25.1
- [PULL for-7.1 09/36] util/log: Remove qemu_log_vprintf, (continued)
- [PULL for-7.1 09/36] util/log: Remove qemu_log_vprintf, Richard Henderson, 2022/03/20
- [PULL for-7.1 10/36] tcg: Pass the locked filepointer to tcg_dump_ops, Richard Henderson, 2022/03/20
- [PULL for-7.1 13/36] accel/tcg: Use cpu_dump_state between qemu_log_lock/unlock, Richard Henderson, 2022/03/20
- [PULL for-7.1 12/36] exec/log: Remove log_disas and log_target_disas, Richard Henderson, 2022/03/20
- [PULL for-7.1 15/36] util/log: Use qemu_log_lock/unlock in qemu_log, Richard Henderson, 2022/03/20
- [PULL for-7.1 18/36] bsd-user: Expand log_page_dump inline, Richard Henderson, 2022/03/20
- [PULL for-7.1 19/36] linux-user: Expand log_page_dump inline, Richard Henderson, 2022/03/20
- [PULL for-7.1 17/36] util/log: Drop call to setvbuf, Richard Henderson, 2022/03/20
- [PULL for-7.1 21/36] include/exec/log: Do not reference QemuLogFile directly, Richard Henderson, 2022/03/20
- [PULL for-7.1 22/36] include/qemu/log: Move entire implementation out-of-line, Richard Henderson, 2022/03/20
- [PULL for-7.1 24/36] util/log: Introduce qemu_set_log_filename_flags,
Richard Henderson <=
- [PULL for-7.1 23/36] sysemu/os-win32: Test for and use _lock_file/_unlock_file, Richard Henderson, 2022/03/20
- [PULL for-7.1 26/36] linux-user: Use qemu_set_log_filename_flags, Richard Henderson, 2022/03/20
- [PULL for-7.1 27/36] softmmu: Use qemu_set_log_filename_flags, Richard Henderson, 2022/03/20
- [PULL for-7.1 28/36] util/log: Remove qemu_log_close, Richard Henderson, 2022/03/20
- [PULL for-7.1 31/36] util/log: Rename qemu_logfile_mutex to global_mutex, Richard Henderson, 2022/03/20
- [PULL for-7.1 33/36] util/log: Combine two logfile closes, Richard Henderson, 2022/03/20
- [PULL for-7.1 35/36] util/log: Limit RCUCloseFILE to file closing, Richard Henderson, 2022/03/20
- [PULL for-7.1 32/36] util/log: Hoist the eval of is_daemonized in qemu_set_log_internal, Richard Henderson, 2022/03/20
- [PULL for-7.1 36/36] util/log: Support per-thread log files, Richard Henderson, 2022/03/20