All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v3] monitor: let cur_mon be per-thread
@ 2018-04-12  6:11 Peter Xu
  2018-04-12 15:22 ` Eric Blake
                   ` (4 more replies)
  0 siblings, 5 replies; 19+ messages in thread
From: Peter Xu @ 2018-04-12  6:11 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Marc-André Lureau, Eric Blake,
	Markus Armbruster, Stefan Hajnoczi, Dr . David Alan Gilbert,
	peterx

In the future the monitor iothread may be accessing the cur_mon as
well (via monitor_qmp_dispatch_one()).  Before we introduce a real
Out-Of-Band command, let's convert the cur_mon variable to be a
per-thread variable to make sure there won't be a race between threads.

Note that thread variables are not initialized to a valid value when new
thread is created.  However for our case we don't need to set it up,
since the cur_mon variable is only used in such a pattern:

  old_mon = cur_mon;
  cur_mon = xxx;
  (do something, read cur_mon if necessary in the stack)
  cur_mon = old_mon;

It plays a role as stack variable, so no need to be initialized at all.
We only need to make sure the variable won't be changed unexpectedly by
other threads.

Signed-off-by: Peter Xu <peterx@redhat.com>
---
v3:
- fix code style warning from patchew
v2:
- drop qemu-thread changes
---
 include/monitor/monitor.h | 2 +-
 monitor.c                 | 2 +-
 stubs/monitor.c           | 2 +-
 tests/test-util-sockets.c | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h
index d6ab70cae2..2ef5e04b37 100644
--- a/include/monitor/monitor.h
+++ b/include/monitor/monitor.h
@@ -6,7 +6,7 @@
 #include "qapi/qapi-types-misc.h"
 #include "qemu/readline.h"
 
-extern Monitor *cur_mon;
+extern __thread Monitor *cur_mon;
 
 /* flags for monitor_init */
 /* 0x01 unused */
diff --git a/monitor.c b/monitor.c
index 39f8ee17ba..c90c31b6b3 100644
--- a/monitor.c
+++ b/monitor.c
@@ -266,7 +266,7 @@ static mon_cmd_t info_cmds[];
 
 QmpCommandList qmp_commands, qmp_cap_negotiation_commands;
 
-Monitor *cur_mon;
+__thread Monitor *cur_mon;
 
 static QEMUClockType event_clock_type = QEMU_CLOCK_REALTIME;
 
diff --git a/stubs/monitor.c b/stubs/monitor.c
index e018c8f594..3890771bb5 100644
--- a/stubs/monitor.c
+++ b/stubs/monitor.c
@@ -3,7 +3,7 @@
 #include "qemu-common.h"
 #include "monitor/monitor.h"
 
-Monitor *cur_mon = NULL;
+__thread Monitor *cur_mon;
 
 int monitor_get_fd(Monitor *mon, const char *name, Error **errp)
 {
diff --git a/tests/test-util-sockets.c b/tests/test-util-sockets.c
index acadd85e8f..6195a3ac36 100644
--- a/tests/test-util-sockets.c
+++ b/tests/test-util-sockets.c
@@ -69,7 +69,7 @@ int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp)
  * stubs/monitor.c is defined, to make sure monitor.o is discarded
  * otherwise we get duplicate syms at link time.
  */
-Monitor *cur_mon;
+__thread Monitor *cur_mon;
 void monitor_init(Chardev *chr, int flags) {}
 
 
-- 
2.14.3

^ permalink raw reply related	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2018-05-24 11:13 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-04-12  6:11 [Qemu-devel] [PATCH v3] monitor: let cur_mon be per-thread Peter Xu
2018-04-12 15:22 ` Eric Blake
2018-04-13 10:43 ` Marc-André Lureau
2018-04-16  8:37 ` Stefan Hajnoczi
2018-04-16  9:17   ` Peter Xu
2018-04-17  7:08     ` Stefan Hajnoczi
2018-04-17  9:05       ` Markus Armbruster
2018-04-18  5:12         ` Stefan Hajnoczi
2018-04-18  6:35           ` Peter Xu
2018-04-18  7:45             ` Markus Armbruster
2018-04-18  8:01               ` Peter Xu
2018-05-22  3:48 ` Peter Xu
2018-05-23  8:23 ` Markus Armbruster
2018-05-23  9:04   ` Peter Xu
2018-05-23 13:13     ` Markus Armbruster
2018-05-24  4:29       ` Peter Xu
2018-05-24  8:22         ` Markus Armbruster
2018-05-24  8:42           ` Peter Xu
2018-05-24 11:13             ` Markus Armbruster

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.