qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Luiz Capitulino <lcapitulino@redhat.com>
To: qemu-devel@nongnu.org
Cc: jan.kiszka@siemens.com, aliguori@us.ibm.com, avi@redhat.com
Subject: [Qemu-devel] [PATCH 06/25] monitor: Setup a dictionary with handler arguments
Date: Mon,  3 Aug 2009 13:57:03 -0300	[thread overview]
Message-ID: <1249318642-19324-7-git-send-email-lcapitulino@redhat.com> (raw)
In-Reply-To: <1249318642-19324-1-git-send-email-lcapitulino@redhat.com>

With this commit monitor_handle_command() will be able to setup a
QEMU dictionary with arguments to command handlers.

However, the current 'args' method is still being used, next changes
will port commands to use the new dictionary.

There are three changes introduced by the dictionary that are worth
noting:

1. The '/' argument type always adds the following standard keys in the
dictionary: 'count', 'format' and 'size'. This way, the argument
name used in the 'args_type' string doesn't matter

2. The 'l' argument type always adds a 'high' order value and a 'low'
order value. To do this the Monitor will append '_h' and '_l' to the
argument name used in the 'args_type' (this is the job of
key_append_str() & friends)

3. The optional argument type '?' doesn't need to pass the additional
'has_arg' argument, instead hanlders can do the same check with
qdict_exists()

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 monitor.c |   56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 56 insertions(+), 0 deletions(-)

diff --git a/monitor.c b/monitor.c
index 83c50a8..676ce7d 100644
--- a/monitor.c
+++ b/monitor.c
@@ -41,6 +41,7 @@
 #include "disas.h"
 #include "balloon.h"
 #include "qemu-timer.h"
+#include "qdict.h"
 #include "migration.h"
 #include "kvm.h"
 #include "acl.h"
@@ -2584,6 +2585,37 @@ static char *key_get_info(const char *type, char **key)
     return ++p;
 }
 
+/**
+ * Append '_' plus the character from 'c' to 'key' and returns
+ * the new string.
+ */
+static char *key_append_chr(const char *key, int c)
+{
+    char *p;
+    size_t len;
+
+    len = strlen(key);
+    p = qemu_malloc(len + 3);
+    memcpy(p, key, len);
+    p[len++] = '_';
+    p[len++] = c;
+    p[len] = '\0';
+
+    return p;
+}
+
+/* Append "_l" to 'key' */
+static char *key_append_low(const char *key)
+{
+    return key_append_chr(key, 'l');
+}
+
+/* Append "_h" to 'key' */
+static char *key_append_high(const char *key)
+{
+    return key_append_chr(key, 'h');
+}
+
 static int default_fmt_format = 'x';
 static int default_fmt_size = 4;
 
@@ -2599,6 +2631,7 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
     char *key;
     void *str_allocated[MAX_ARGS];
     void *args[MAX_ARGS];
+    QDict *qdict;
     void (*handler_0)(Monitor *mon);
     void (*handler_1)(Monitor *mon, void *arg0);
     void (*handler_2)(Monitor *mon, void *arg0, void *arg1);
@@ -2641,6 +2674,8 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
         return;
     }
 
+    qdict = qdict_new();
+
     for(i = 0; i < MAX_ARGS; i++)
         str_allocated[i] = NULL;
 
@@ -2698,6 +2733,8 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
                     goto fail;
                 }
                 args[nb_args++] = str;
+                if (str)
+                    qdict_add(qdict, key, str);
             }
             break;
         case '/':
@@ -2779,12 +2816,16 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
                 args[nb_args++] = (void*)(long)count;
                 args[nb_args++] = (void*)(long)format;
                 args[nb_args++] = (void*)(long)size;
+                qdict_add(qdict, "count", (void*)(long)count);
+                qdict_add(qdict, "format", (void*)(long)format);
+                qdict_add(qdict, "size", (void*)(long)size);
             }
             break;
         case 'i':
         case 'l':
             {
                 int64_t val;
+                int dict_add = 1;
 
                 while (qemu_isspace(*p))
                     p++;
@@ -2807,6 +2848,7 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
                     typestr++;
                     if (nb_args >= MAX_ARGS)
                         goto error_args;
+                    dict_add = has_arg;
                     args[nb_args++] = (void *)(long)has_arg;
                     if (!has_arg) {
                         if (nb_args >= MAX_ARGS)
@@ -2822,15 +2864,27 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
                     if (nb_args >= MAX_ARGS)
                         goto error_args;
                     args[nb_args++] = (void *)(long)val;
+                    if (dict_add)
+                        qdict_add(qdict, key, (void *)(long) val);
                 } else {
+                    char *lkey;
                     if ((nb_args + 1) >= MAX_ARGS)
                         goto error_args;
+                    lkey = key_append_high(key);
 #if TARGET_PHYS_ADDR_BITS > 32
                     args[nb_args++] = (void *)(long)((val >> 32) & 0xffffffff);
+                    qdict_add(qdict, lkey,
+                                    (void *)(long)((val >> 32) & 0xffffffff));
+                    qemu_free(lkey);
 #else
                     args[nb_args++] = (void *)0;
+                    qdict_add(qdict, lkey, (void *)0);
+                    qemu_free(lkey);
 #endif
                     args[nb_args++] = (void *)(long)(val & 0xffffffff);
+                    lkey = key_append_low(key);
+                    qdict_add(qdict, lkey,(void *)(long)(val & 0xffffffff));
+                    qemu_free(lkey);
                 }
             }
             break;
@@ -2858,6 +2912,7 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
                 if (nb_args >= MAX_ARGS)
                     goto error_args;
                 args[nb_args++] = (void *)(long)has_option;
+                qdict_add(qdict, key, (void *)(long)has_option);
             }
             break;
         default:
@@ -2932,6 +2987,7 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
     }
  fail:
     qemu_free(key);
+    qdict_destroy(qdict);
     for(i = 0; i < MAX_ARGS; i++)
         qemu_free(str_allocated[i]);
 }
-- 
1.6.4.rc3.12.gdf73a

  parent reply	other threads:[~2009-08-03 16:58 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-08-03 16:56 [Qemu-devel] [PATCH v1 00/25] Monitor handlers new structure phase 1 Luiz Capitulino
2009-08-03 16:56 ` [Qemu-devel] [PATCH 01/25] Introduce QEMU dictionary data type Luiz Capitulino
2009-08-03 16:56 ` [Qemu-devel] [PATCH 02/25] net: Fix do_set_link() return type Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 03/25] Add wrappers to functions used by the Monitor Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 04/25] monitor: Document missing supported argument types Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 05/25] monitor: New format for handlers " Luiz Capitulino
2009-08-03 16:57 ` Luiz Capitulino [this message]
2009-08-03 16:57 ` [Qemu-devel] [PATCH 07/25] monitor: Export qdict.h header Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 08/25] monitor: New GET_TLONG and GET_TPHYSADDR macros Luiz Capitulino
2009-08-04 17:27   ` Blue Swirl
2009-08-04 19:42     ` Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 09/25] monitor: Port handler_0 to use the dictionary Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 10/25] monitor: Port handler_1 " Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 11/25] monitor: Port handler_2 " Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 12/25] monitor: Port handler_3 " Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 13/25] monitor: Port handler_4 " Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 14/25] monitor: Port handler_5 " Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 15/25] monitor: Port handler_6 " Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 16/25] monitor: Port handler_7 " Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 17/25] monitor: Drop handler_8 and handler_9 handling Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 18/25] monitor: Port handler_10 to use the dictionary Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 19/25] monitor: Split monitor_handle_command() Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 20/25] monitor: Add a new index for str_allocated[] Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 21/25] monitor: Drop args[] from monitor_parse_command() Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 22/25] monitor: Drop 'nb_args' " Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 23/25] Add check support Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 24/25] Introduce dictionary test data file Luiz Capitulino
2009-08-03 16:57 ` [Qemu-devel] [PATCH 25/25] Introduce QDict unit-tests Luiz Capitulino
2009-08-10 20:17 ` [Qemu-devel] [PATCH v1 00/25] Monitor handlers new structure phase 1 Anthony Liguori
2009-08-10 20:42   ` Luiz Capitulino
2009-08-10 20:45     ` Anthony Liguori
2009-08-10 20:59       ` Luiz Capitulino
  -- strict thread matches above, loose matches on Subject: below --
2009-07-28 22:04 [Qemu-devel] [PATCH " Luiz Capitulino
2009-07-28 22:04 ` [Qemu-devel] [PATCH 06/25] monitor: Setup a dictionary with handler arguments Luiz Capitulino

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=1249318642-19324-7-git-send-email-lcapitulino@redhat.com \
    --to=lcapitulino@redhat.com \
    --cc=aliguori@us.ibm.com \
    --cc=avi@redhat.com \
    --cc=jan.kiszka@siemens.com \
    --cc=qemu-devel@nongnu.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).