Richard Henderson <richard.henderson@linaro.org> writes:
On 3/23/22 10:22, Alex Bennée wrote:
Richard Henderson <richard.henderson@linaro.org> writes:
Inside qemu_log, we perform qemu_log_lock/unlock, which need
not be done if we have already performed the lock beforehand.
Always check the result of qemu_log_lock -- only checking
qemu_loglevel_mask races with the acquisition of the lock
on the logfile.
I'm not sure I like introducing all these raw fprintfs over
introducing
a function like qemu_log__locked().
There's no way to implement qemu_log__locked with rcu. The lookup
itself is what needs the locking; the return value of the FILE* is
then valid until the unlock. To lookup the FILE* again would require
more atomic operations.
That's not what I'm suggesting. qemu_log__locked would be a fairly
simple wrapper around the fprintf:
modified include/qemu/log.h
@@ -70,6 +70,25 @@ void qemu_log_unlock(FILE *fd);
} \
} while (0)
+/**
+ * qemu_log__locked() - log to a locked file
+ * @logfile: FILE handle from qemu_log_lock()
+ * @fmt: printf format
+ * ...: varargs
+ */
+static inline void G_GNUC_PRINTF(2, 3)
+ qemu_log__locked(FILE *logfile, const char *fmt, ...)
+{
+ if (logfile) {
+ va_list ap;
+
+ va_start(ap, fmt);
+ vfprintf(logfile, fmt, ap);
+ va_end(ap);
+ }
+}