aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLluís <xscript@gmx.net>2011-08-31 20:31:03 +0200
committerStefan Hajnoczi <stefanha@linux.vnet.ibm.com>2011-09-01 10:34:53 +0100
commite4858974ec36afd8a6b3a9e2b0ad8f357f28efc7 (patch)
treeceb7f2b2cdff3c511e1807e65eb862b82cfac16c
parentedb47ec498a5c00607e8d428668d5141822a9eac (diff)
downloadqemu-e4858974ec36afd8a6b3a9e2b0ad8f357f28efc7.zip
qemu-e4858974ec36afd8a6b3a9e2b0ad8f357f28efc7.tar.gz
qemu-e4858974ec36afd8a6b3a9e2b0ad8f357f28efc7.tar.bz2
trace: avoid conditional code compilation during option parsing
A default implementation for backend-specific routines is provided in "trace/default.c", which backends can override by setting "trace_default=no" in "configure". Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
-rw-r--r--Makefile.objs2
-rwxr-xr-xconfigure6
-rw-r--r--qemu-config.c4
-rw-r--r--qemu-options.hx6
-rw-r--r--trace/control.h24
-rw-r--r--trace/default.c21
-rw-r--r--trace/simple.c10
-rw-r--r--trace/simple.h8
-rw-r--r--vl.c17
9 files changed, 72 insertions, 26 deletions
diff --git a/Makefile.objs b/Makefile.objs
index 4f8b0ed..57a80e6 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -379,6 +379,8 @@ ifneq ($(TRACE_BACKEND),dtrace)
trace-obj-y = trace.o
endif
+trace-nested-$(CONFIG_TRACE_DEFAULT) += default.o
+
trace-nested-$(CONFIG_TRACE_SIMPLE) += simple.o
trace-obj-$(CONFIG_TRACE_SIMPLE) += qemu-timer-common.o
diff --git a/configure b/configure
index ebf14ee..4f9b27c 100755
--- a/configure
+++ b/configure
@@ -3064,12 +3064,15 @@ bsd)
;;
esac
+# use default implementation for tracing backend-specific routines
+trace_default=yes
echo "TRACE_BACKEND=$trace_backend" >> $config_host_mak
if test "$trace_backend" = "nop"; then
echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
fi
if test "$trace_backend" = "simple"; then
echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
+ trace_default=no
# Set the appropriate trace file.
trace_file="\"$trace_file-\" FMT_pid"
fi
@@ -3086,6 +3089,9 @@ if test "$trace_backend" = "dtrace"; then
fi
fi
echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
+if test "$trace_default" = "yes"; then
+ echo "CONFIG_TRACE_DEFAULT=y" >> $config_host_mak
+fi
echo "TOOLS=$tools" >> $config_host_mak
echo "ROMS=$roms" >> $config_host_mak
diff --git a/qemu-config.c b/qemu-config.c
index b64edc9..4f3465d 100644
--- a/qemu-config.c
+++ b/qemu-config.c
@@ -303,7 +303,6 @@ static QemuOptsList qemu_mon_opts = {
},
};
-#ifdef CONFIG_TRACE_SIMPLE
static QemuOptsList qemu_trace_opts = {
.name = "trace",
.implied_opt_name = "trace",
@@ -316,7 +315,6 @@ static QemuOptsList qemu_trace_opts = {
{ /* end of list */ }
},
};
-#endif
static QemuOptsList qemu_cpudef_opts = {
.name = "cpudef",
@@ -517,9 +515,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 dcb00b7..2d29933 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -2436,17 +2436,19 @@ Normally QEMU loads a configuration file from @var{sysconfdir}/qemu.conf and
@var{sysconfdir}/target-@var{ARCH}.conf 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.h b/trace/control.h
new file mode 100644
index 0000000..bb54339
--- /dev/null
+++ b/trace/control.h
@@ -0,0 +1,24 @@
+/*
+ * Interface for configuring and controlling the state of tracing events.
+ *
+ * Copyright (C) 2011 Lluís Vilanova <vilanova@ac.upc.edu>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ */
+
+#ifndef TRACE_CONTROL_H
+#define TRACE_CONTROL_H
+
+#include <stdbool.h>
+
+
+/** Initialize the tracing backend.
+ *
+ * @file Name of trace output file; may be NULL.
+ * Corresponds to commandline option "-trace file=...".
+ * @return Whether the backend could be successfully initialized.
+ */
+bool trace_backend_init(const char *file);
+
+#endif /* TRACE_CONTROL_H */
diff --git a/trace/default.c b/trace/default.c
new file mode 100644
index 0000000..42fdb6b
--- /dev/null
+++ b/trace/default.c
@@ -0,0 +1,21 @@
+/*
+ * Default implementation for backend initialization from commandline.
+ *
+ * Copyright (C) 2011 Lluís Vilanova <vilanova@ac.upc.edu>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ */
+
+#include "trace/control.h"
+
+
+bool trace_backend_init(const char *file)
+{
+ if (file) {
+ fprintf(stderr, "error: -trace file=...: "
+ "option not supported by the selected tracing backend\n");
+ return false;
+ }
+ return true;
+}
diff --git a/trace/simple.c b/trace/simple.c
index de355e9..369e860 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_backend_init(const char *file)
{
pthread_t thread;
pthread_attr_t attr;
@@ -346,10 +347,11 @@ 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(file);
}
- atexit(st_flush_trace_buffer);
- 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..60322b6 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 = {
@@ -2138,6 +2137,7 @@ int main(int argc, char **argv, char **envp)
.realloc = realloc_and_trace,
.free = free_and_trace,
};
+ const char *trace_file = NULL;
atexit(qemu_run_exit_notifiers);
error_set_progname(argv[0]);
@@ -2928,14 +2928,15 @@ 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);
}
+ trace_file = qemu_opt_get(opts, "file");
break;
-#endif
+ }
case QEMU_OPTION_readconfig:
{
int ret = qemu_read_config_file(optarg);
@@ -2993,8 +2994,8 @@ 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 (!trace_backend_init(trace_file)) {
+ exit(1);
}
/* If no data_dir is specified then try to find it relative to the