All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Xu <peterx@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Paolo Bonzini" <pbonzini@redhat.com>,
	"Daniel P . Berrange" <berrange@redhat.com>,
	"Stefan Hajnoczi" <shajnocz@redhat.com>,
	"Fam Zheng" <famz@redhat.com>,
	"Juan Quintela" <quintela@redhat.com>,
	mdroth@linux.vnet.ibm.com, peterx@redhat.com,
	"Eric Blake" <eblake@redhat.com>,
	"Laurent Vivier" <lvivier@redhat.com>,
	"Marc-André Lureau" <marcandre.lureau@gmail.com>,
	"Markus Armbruster" <armbru@redhat.com>,
	"Dr . David Alan Gilbert" <dgilbert@redhat.com>
Subject: [Qemu-devel] [RFC v2 06/22] qjson: add "opaque" field to JSONMessageParser
Date: Fri, 29 Sep 2017 11:38:28 +0800	[thread overview]
Message-ID: <20170929033844.26935-7-peterx@redhat.com> (raw)
In-Reply-To: <20170929033844.26935-1-peterx@redhat.com>

It'll be passed to emit() as well when it happens.  Since at it, add a
typedef for the emitter function.

Signed-off-by: Peter Xu <peterx@redhat.com>
---
 include/qapi/qmp/json-streamer.h | 10 ++++++++--
 monitor.c                        |  7 ++++---
 qga/main.c                       |  5 +++--
 qobject/json-streamer.c          |  6 ++++--
 qobject/qjson.c                  |  5 +++--
 tests/libqtest.c                 |  5 +++--
 6 files changed, 25 insertions(+), 13 deletions(-)

diff --git a/include/qapi/qmp/json-streamer.h b/include/qapi/qmp/json-streamer.h
index 00d8a23af8..9198b67342 100644
--- a/include/qapi/qmp/json-streamer.h
+++ b/include/qapi/qmp/json-streamer.h
@@ -23,9 +23,14 @@ typedef struct JSONToken {
     char str[];
 } JSONToken;
 
+struct JSONMessageParser;
+typedef void (*JSONMessageEmitFunc)(struct JSONMessageParser *parser,
+                                    GQueue *tokens, void *opaque);
+
 typedef struct JSONMessageParser
 {
-    void (*emit)(struct JSONMessageParser *parser, GQueue *tokens);
+    JSONMessageEmitFunc emit;
+    void *opaque;
     JSONLexer lexer;
     int brace_count;
     int bracket_count;
@@ -34,7 +39,8 @@ typedef struct JSONMessageParser
 } JSONMessageParser;
 
 void json_message_parser_init(JSONMessageParser *parser,
-                              void (*func)(JSONMessageParser *, GQueue *));
+                              JSONMessageEmitFunc func,
+                              void *opaque);
 
 int json_message_parser_feed(JSONMessageParser *parser,
                              const char *buffer, size_t size);
diff --git a/monitor.c b/monitor.c
index f42b422584..ebeb54b0d3 100644
--- a/monitor.c
+++ b/monitor.c
@@ -3821,7 +3821,8 @@ static int monitor_can_read(void *opaque)
     return (mon->suspend_cnt == 0) ? 1 : 0;
 }
 
-static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens)
+static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens,
+                               void *opaque)
 {
     QObject *req, *rsp = NULL, *id = NULL;
     QDict *qdict = NULL;
@@ -3968,7 +3969,7 @@ static void monitor_qmp_event(void *opaque, int event)
         break;
     case CHR_EVENT_CLOSED:
         json_message_parser_destroy(&mon->qmp.parser);
-        json_message_parser_init(&mon->qmp.parser, handle_qmp_command);
+        json_message_parser_init(&mon->qmp.parser, handle_qmp_command, NULL);
         mon_refcount--;
         monitor_fdsets_cleanup();
         break;
@@ -4118,7 +4119,7 @@ void monitor_init(Chardev *chr, int flags)
         qemu_chr_fe_set_handlers(&mon->chr, monitor_can_read, monitor_qmp_read,
                                  monitor_qmp_event, NULL, mon, NULL, true);
         qemu_chr_fe_set_echo(&mon->chr, true);
-        json_message_parser_init(&mon->qmp.parser, handle_qmp_command);
+        json_message_parser_init(&mon->qmp.parser, handle_qmp_command, NULL);
     } else {
         qemu_chr_fe_set_handlers(&mon->chr, monitor_can_read, monitor_read,
                                  monitor_event, NULL, mon, NULL, true);
diff --git a/qga/main.c b/qga/main.c
index 62a62755bd..3b5ebbc1ee 100644
--- a/qga/main.c
+++ b/qga/main.c
@@ -593,7 +593,8 @@ static void process_command(GAState *s, QDict *req)
 }
 
 /* handle requests/control events coming in over the channel */
-static void process_event(JSONMessageParser *parser, GQueue *tokens)
+static void process_event(JSONMessageParser *parser, GQueue *tokens,
+                          void *opaque)
 {
     GAState *s = container_of(parser, GAState, parser);
     QDict *qdict;
@@ -1320,7 +1321,7 @@ static int run_agent(GAState *s, GAConfig *config, int socket_activation)
     s->command_state = ga_command_state_new();
     ga_command_state_init(s, s->command_state);
     ga_command_state_init_all(s->command_state);
-    json_message_parser_init(&s->parser, process_event);
+    json_message_parser_init(&s->parser, process_event, NULL);
 
 #ifndef _WIN32
     if (!register_signal_handlers()) {
diff --git a/qobject/json-streamer.c b/qobject/json-streamer.c
index c51c2021f9..8fc1b15321 100644
--- a/qobject/json-streamer.c
+++ b/qobject/json-streamer.c
@@ -102,18 +102,20 @@ out_emit:
      */
     tokens = parser->tokens;
     parser->tokens = g_queue_new();
-    parser->emit(parser, tokens);
+    parser->emit(parser, tokens, parser->opaque);
     parser->token_size = 0;
 }
 
 void json_message_parser_init(JSONMessageParser *parser,
-                              void (*func)(JSONMessageParser *, GQueue *))
+                              JSONMessageEmitFunc func,
+                              void *opaque)
 {
     parser->emit = func;
     parser->brace_count = 0;
     parser->bracket_count = 0;
     parser->tokens = g_queue_new();
     parser->token_size = 0;
+    parser->opaque = opaque;
 
     json_lexer_init(&parser->lexer, json_message_process_token);
 }
diff --git a/qobject/qjson.c b/qobject/qjson.c
index 2e0930884e..f9766febe3 100644
--- a/qobject/qjson.c
+++ b/qobject/qjson.c
@@ -28,7 +28,8 @@ typedef struct JSONParsingState
     Error *err;
 } JSONParsingState;
 
-static void parse_json(JSONMessageParser *parser, GQueue *tokens)
+static void parse_json(JSONMessageParser *parser, GQueue *tokens,
+                       void *opaque)
 {
     JSONParsingState *s = container_of(parser, JSONParsingState, parser);
 
@@ -41,7 +42,7 @@ QObject *qobject_from_jsonv(const char *string, va_list *ap, Error **errp)
 
     state.ap = ap;
 
-    json_message_parser_init(&state.parser, parse_json);
+    json_message_parser_init(&state.parser, parse_json, NULL);
     json_message_parser_feed(&state.parser, string, strlen(string));
     json_message_parser_flush(&state.parser);
     json_message_parser_destroy(&state.parser);
diff --git a/tests/libqtest.c b/tests/libqtest.c
index cbd709470b..09d458ed47 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -390,7 +390,8 @@ typedef struct {
     QDict *response;
 } QMPResponseParser;
 
-static void qmp_response(JSONMessageParser *parser, GQueue *tokens)
+static void qmp_response(JSONMessageParser *parser, GQueue *tokens,
+                         void *opaque)
 {
     QMPResponseParser *qmp = container_of(parser, QMPResponseParser, parser);
     QObject *obj;
@@ -412,7 +413,7 @@ QDict *qmp_fd_receive(int fd)
     bool log = getenv("QTEST_LOG") != NULL;
 
     qmp.response = NULL;
-    json_message_parser_init(&qmp.parser, qmp_response);
+    json_message_parser_init(&qmp.parser, qmp_response, NULL);
     while (!qmp.response) {
         ssize_t len;
         char c;
-- 
2.13.5

  parent reply	other threads:[~2017-09-29  3:39 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-29  3:38 [Qemu-devel] [RFC v2 00/22] QMP: out-of-band (OOB) execution support Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 01/22] char-io: fix possible race on IOWatchPoll Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 02/22] qobject: introduce qstring_get_try_str() Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 03/22] qobject: introduce qobject_get_try_str() Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 04/22] qobject: let object_property_get_str() use new API Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 05/22] monitor: move skip_flush into monitor_data_init Peter Xu
2017-09-29  3:38 ` Peter Xu [this message]
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 07/22] monitor: move the cur_mon hack deeper for QMP Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 08/22] monitor: unify global init Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 09/22] monitor: create monitor dedicate iothread Peter Xu
2017-10-12 12:29   ` Stefan Hajnoczi
2017-10-16  7:16     ` Peter Xu
2017-10-18 15:32       ` Stefan Hajnoczi
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 10/22] monitor: allow to use IO thread for parsing Peter Xu
2017-10-12 12:35   ` Stefan Hajnoczi
2017-10-16  7:37     ` Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 11/22] monitor: introduce monitor_qmp_respond() Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 12/22] monitor: let mon_list be tail queue Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 13/22] monitor: separate QMP parser and dispatcher Peter Xu
2017-10-12 12:50   ` Stefan Hajnoczi
2017-10-16  7:50     ` Peter Xu
2017-10-18 15:31       ` Stefan Hajnoczi
2017-10-19  6:36         ` Peter Xu
2017-10-19 13:13           ` Stefan Hajnoczi
2017-10-20  9:19             ` Paolo Bonzini
2017-10-23  6:07               ` Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 14/22] qmp: add new event "request-dropped" Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 15/22] monitor: send event when request queue full Peter Xu
2017-10-12 12:56   ` Stefan Hajnoczi
2017-10-16  8:11     ` Peter Xu
2017-10-18 15:28       ` Stefan Hajnoczi
2017-10-19  7:16         ` Peter Xu
2017-10-19 13:11           ` Stefan Hajnoczi
2017-10-20  4:26             ` Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 16/22] monitor: enable IO thread for (qmp & !mux) typed Peter Xu
2017-10-12 12:57   ` Stefan Hajnoczi
2017-10-16  8:16     ` Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 17/22] qapi: introduce new cmd option "allow-oob" Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 18/22] qmp: support out-of-band (oob) execution Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 19/22] qmp: let migrate-incoming allow out-of-band Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 20/22] qmp: isolate responses into io thread Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 21/22] qmp: introduce QMPCapability Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 22/22] docs: update QMP documents for OOB commands Peter Xu
2017-09-29  3:58 ` [Qemu-devel] [RFC v2 00/22] QMP: out-of-band (OOB) execution support no-reply
2017-09-29  4:14   ` Peter Xu
2017-09-29 19:03     ` Eric Blake
2017-09-30  0:28       ` Peter Xu
2017-09-29  4:20 ` no-reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170929033844.26935-7-peterx@redhat.com \
    --to=peterx@redhat.com \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=eblake@redhat.com \
    --cc=famz@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=marcandre.lureau@gmail.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=shajnocz@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.