[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v6 06/14] trace: avoid conditional code compilation
From: |
Lluís |
Subject: |
[Qemu-devel] [PATCH v6 06/14] trace: avoid conditional code compilation during option parsing |
Date: |
Thu, 25 Aug 2011 17:52:10 +0200 |
User-agent: |
StGit/0.15 |
Uses "QEMU_WEAK" to provide a default implementation that signals it as not
implemented.
Backends can provide their own implementation if the (sub)options are supported.
Signed-off-by: Lluís Vilanova <address@hidden>
---
Makefile | 2 +-
Makefile.objs | 2 ++
qemu-config.c | 4 ----
qemu-options.hx | 6 ++++--
trace/control.c | 23 +++++++++++++++++++++++
trace/control.h | 27 +++++++++++++++++++++++++++
trace/simple.c | 15 ++++++++++++---
trace/simple.h | 8 --------
vl.c | 28 ++++++++++++++++++----------
9 files changed, 87 insertions(+), 28 deletions(-)
create mode 100644 trace/control.c
create mode 100644 trace/control.h
diff --git a/Makefile b/Makefile
index 13be25a..d9e1d72 100644
--- a/Makefile
+++ b/Makefile
@@ -197,7 +197,7 @@ QGALIB_GEN=$(addprefix $(qapi-dir)/, qga-qapi-types.c
qga-qapi-types.h qga-qapi-
$(QGALIB_GEN): $(GENERATED_HEADERS)
$(qga-obj-y) qemu-ga.o: $(QGALIB_GEN)
-qemu-ga$(EXESUF): qemu-ga.o $(qga-obj-y) $(qapi-obj-y) $(trace-obj-y)
$(qobject-obj-y) $(version-obj-y) $(addprefix $(qapi-dir)/, qga-qapi-visit.o
qga-qapi-types.o qga-qmp-marshal.o)
+qemu-ga$(EXESUF): qemu-ga.o $(qga-obj-y) $(qapi-obj-y) $(trace-obj-y)
qemu-timer-common.o $(qobject-obj-y) $(version-obj-y) $(addprefix $(qapi-dir)/,
qga-qapi-visit.o qga-qapi-types.o qga-qmp-marshal.o)
QEMULIBS=libhw32 libhw64 libuser libdis libdis-user
diff --git a/Makefile.objs b/Makefile.objs
index f1dfeda..3530bcf 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -382,6 +382,8 @@ endif
trace-nested-$(CONFIG_TRACE_SIMPLE) += simple.o
trace-obj-$(CONFIG_TRACE_SIMPLE) += qemu-timer-common.o
+trace-nested-y += control.o
+
trace-obj-y += $(addprefix trace/, $(trace-nested-y))
######################################################################
diff --git a/qemu-config.c b/qemu-config.c
index 4b79103..f67d3a5 100644
--- a/qemu-config.c
+++ b/qemu-config.c
@@ -302,7 +302,6 @@ static QemuOptsList qemu_mon_opts = {
},
};
-#ifdef CONFIG_TRACE_SIMPLE
static QemuOptsList qemu_trace_opts = {
.name = "trace",
.implied_opt_name = "trace",
@@ -315,7 +314,6 @@ static QemuOptsList qemu_trace_opts = {
{ /* end of list */ }
},
};
-#endif
static QemuOptsList qemu_cpudef_opts = {
.name = "cpudef",
@@ -516,9 +514,7 @@ static QemuOptsList *vm_config_groups[32] = {
&qemu_global_opts,
&qemu_mon_opts,
&qemu_cpudef_opts,
-#ifdef CONFIG_TRACE_SIMPLE
&qemu_trace_opts,
-#endif
&qemu_option_rom_opts,
&qemu_machine_opts,
&qemu_boot_opts,
diff --git a/qemu-options.hx b/qemu-options.hx
index 8a31b4f..d6421b9 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -2432,17 +2432,19 @@ Normally QEMU loads a configuration file from
@var{sysconfdir}/qemu.conf and
@var{sysconfdir}/address@hidden on startup. The @code{-nodefconfig}
option will prevent QEMU from loading these configuration files at startup.
ETEXI
-#ifdef CONFIG_TRACE_SIMPLE
DEF("trace", HAS_ARG, QEMU_OPTION_trace,
"-trace\n"
" Specify a trace file to log traces to\n",
QEMU_ARCH_ALL)
STEXI
+HXCOMM This line is not accurate, as the option is backend-specific but HX does
+HXCOMM not support conditional compilation of text.
@item -trace
@findex -trace
Specify a trace file to log output traces to.
+
+This option is available only when using the @var{simple} tracing backend.
ETEXI
-#endif
HXCOMM This is the last statement. Insert new options before this line!
STEXI
diff --git a/trace/control.c b/trace/control.c
new file mode 100644
index 0000000..cb14f4b
--- /dev/null
+++ b/trace/control.c
@@ -0,0 +1,23 @@
+/*
+ * Interface for configuring and controlling the state of tracing events.
+ *
+ * Copyright (C) 2011 Lluís Vilanova <address@hidden>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ */
+
+#define QEMU_WEAK_DEFAULT
+
+#include "trace/control.h"
+
+
+bool trace_config_init (void)
+{
+ return false;
+}
+
+bool trace_config_init_file (const char *file)
+{
+ return false;
+}
diff --git a/trace/control.h b/trace/control.h
new file mode 100644
index 0000000..8b52d5e
--- /dev/null
+++ b/trace/control.h
@@ -0,0 +1,27 @@
+/*
+ * Interface for configuring and controlling the state of tracing events.
+ *
+ * Copyright (C) 2011 Lluís Vilanova <address@hidden>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ */
+
+#ifndef TRACE_CONFIG_H
+#define TRACE_CONFIG_H
+
+#include <stdbool.h>
+
+#include "compiler.h"
+
+/* Backends can re-implement routines marked as QEMU_WEAK */
+
+/** Whether any cmdline trace option is avilable. */
+bool trace_config_init (void) QEMU_WEAK;
+/** Configure output trace file.
+ *
+ * @return Whether cmdline option is available.
+ */
+bool trace_config_init_file (const char *file) QEMU_WEAK;
+
+#endif /* TRACE_CONFIG_H */
diff --git a/trace/simple.c b/trace/simple.c
index de355e9..f3891c1 100644
--- a/trace/simple.c
+++ b/trace/simple.c
@@ -16,6 +16,7 @@
#include <pthread.h>
#include "qemu-timer.h"
#include "trace.h"
+#include "trace/control.h"
/** Trace file header event ID */
#define HEADER_EVENT_ID (~(uint64_t)0) /* avoids conflicting with
TraceEventIDs */
@@ -330,7 +331,7 @@ void st_flush_trace_buffer(void)
flush_trace_file(true);
}
-bool st_init(const char *file)
+bool trace_config_init (void)
{
pthread_t thread;
pthread_attr_t attr;
@@ -346,10 +347,18 @@ bool st_init(const char *file)
pthread_sigmask(SIG_SETMASK, &oldset, NULL);
if (ret != 0) {
- return false;
+ fprintf(stderr, "warning: unable to initialize simple trace
backend\n");
+ }
+ else {
+ atexit(st_flush_trace_buffer);
+ st_set_trace_file(NULL);
}
+ return true;
+}
- atexit(st_flush_trace_buffer);
+bool trace_config_init_file (const char *file)
+{
st_set_trace_file(file);
+
return true;
}
diff --git a/trace/simple.h b/trace/simple.h
index 77633ab..08b9a52 100644
--- a/trace/simple.h
+++ b/trace/simple.h
@@ -15,7 +15,6 @@
#include <stdbool.h>
#include <stdio.h>
-#ifdef CONFIG_TRACE_SIMPLE
typedef uint64_t TraceEventID;
typedef struct {
@@ -37,12 +36,5 @@ void st_print_trace_file_status(FILE *stream,
fprintf_function stream_printf);
void st_set_trace_file_enabled(bool enable);
bool st_set_trace_file(const char *file);
void st_flush_trace_buffer(void);
-bool st_init(const char *file);
-#else
-static inline bool st_init(const char *file)
-{
- return true;
-}
-#endif /* !CONFIG_TRACE_SIMPLE */
#endif /* TRACE_SIMPLE_H */
diff --git a/vl.c b/vl.c
index 145d738..ed2db9a 100644
--- a/vl.c
+++ b/vl.c
@@ -156,7 +156,7 @@ int main(int argc, char **argv)
#include "slirp/libslirp.h"
#include "trace.h"
-#include "trace/simple.h"
+#include "trace/control.h"
#include "qemu-queue.h"
#include "cpus.h"
#include "arch_init.h"
@@ -2130,7 +2130,6 @@ int main(int argc, char **argv, char **envp)
int show_vnc_port = 0;
#endif
int defconfig = 1;
- const char *trace_file = NULL;
const char *log_mask = NULL;
const char *log_file = NULL;
GMemVTable mem_trace = {
@@ -2928,14 +2927,27 @@ int main(int argc, char **argv, char **envp)
}
xen_mode = XEN_ATTACH;
break;
-#ifdef CONFIG_TRACE_SIMPLE
case QEMU_OPTION_trace:
+ {
opts = qemu_opts_parse(qemu_find_opts("trace"), optarg, 0);
- if (opts) {
- trace_file = qemu_opt_get(opts, "file");
+ if (!opts) {
+ exit(1);
+ }
+ if (!trace_config_init()) {
+ fprintf(stderr, "qemu: error: option \"-%s\" is not "
+ "supported by the selected tracing backend\n",
+ popt->name);
+ exit(1);
+ }
+ const char *trace_file = qemu_opt_get(opts, "file");
+ if (trace_file && !trace_config_init_file(trace_file)) {
+ fprintf(stderr, "error: suboption \"-%s file\" is not "
+ "supported by the selected tracing backend\n",
+ popt->name);
+ exit(1);
}
break;
-#endif
+ }
case QEMU_OPTION_readconfig:
{
int ret = qemu_read_config_file(optarg);
@@ -2993,10 +3005,6 @@ int main(int argc, char **argv, char **envp)
set_cpu_log(log_mask);
}
- if (!st_init(trace_file)) {
- fprintf(stderr, "warning: unable to initialize simple trace
backend\n");
- }
-
/* If no data_dir is specified then try to find it relative to the
executable path. */
if (!data_dir) {
- [Qemu-devel] [PATCH v6 00/14] trace-state: make the behaviour of "disable" consistent across all backends, Lluís, 2011/08/25
- [Qemu-devel] [PATCH v6 01/14] [simple] Include qemu-timer-common.o in trace-obj-y, Lluís, 2011/08/25
- [Qemu-devel] [PATCH v6 02/14] provide support for default implementations using weak symbols, Lluís, 2011/08/25
- [Qemu-devel] [PATCH v6 03/14] trace: [configure] rename CONFIG_*_TRACE into CONFIG_TRACE_*, Lluís, 2011/08/25
- [Qemu-devel] [PATCH v6 04/14] trace: [make] replace 'ifeq' with values in CONFIG_TRACE_*, Lluís, 2011/08/25
- [Qemu-devel] [PATCH v6 05/14] trace: move backend-specific code into the trace/ directory, Lluís, 2011/08/25
- [Qemu-devel] [PATCH v6 06/14] trace: avoid conditional code compilation during option parsing,
Lluís <=
- [Qemu-devel] [PATCH v6 07/14] trace: generalize the "property" concept in the trace-events file, Lluís, 2011/08/25
- [Qemu-devel] [PATCH v6 08/14] trace-state: separate trace event control and query routines from the simple backend, Lluís, 2011/08/25
- [Qemu-devel] [PATCH v6 10/14] trace-state: add "-trace events" argument to control initial state, Lluís, 2011/08/25
- [Qemu-devel] [PATCH v6 09/14] trace-state: always compile support for controlling and querying trace event states, Lluís, 2011/08/25
- [Qemu-devel] [PATCH v6 11/14] trace-state: always use the "nop" backend on events with the "disable" keyword, Lluís, 2011/08/25
- [Qemu-devel] [PATCH v6 13/14] trace-state: [stderr] add support for dynamically enabling/disabling events, Lluís, 2011/08/25
- [Qemu-devel] [PATCH v6 12/14] trace-state: [simple] disable all trace points by default, Lluís, 2011/08/25
- [Qemu-devel] [PATCH v6 14/14] trace: enable all events, Lluís, 2011/08/25