From: "Andreas Färber" <afaerber@suse.de>
To: qemu-devel@nongnu.org
Cc: "Michael Roth" <mdroth@linux.vnet.ibm.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Andreas Färber" <afaerber@suse.de>,
"Luiz Capitulino" <lcapitulino@redhat.com>
Subject: [Qemu-devel] [PULL 41/48] qapi: Add human mode to StringOutputVisitor
Date: Mon, 10 Feb 2014 19:36:58 +0100 [thread overview]
Message-ID: <1392057426-31990-42-git-send-email-afaerber@suse.de> (raw)
In-Reply-To: <1392057426-31990-1-git-send-email-afaerber@suse.de>
From: Paolo Bonzini <pbonzini@redhat.com>
This will be used by "info qtree". For numbers it prints both the
decimal and hex values. For sizes it rounds to the nearest power
of 2^10. For strings, it puts quotes around the string and separates
NULL and empty string.
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
---
include/qapi/string-output-visitor.h | 2 +-
include/qom/object.h | 3 +-
qapi/string-output-visitor.c | 55 ++++++++++++++++++++++++++++++++++--
qdev-monitor.c | 2 +-
qom/object.c | 4 +--
tests/test-string-output-visitor.c | 2 +-
tests/test-visitor-serialization.c | 2 +-
7 files changed, 60 insertions(+), 10 deletions(-)
diff --git a/include/qapi/string-output-visitor.h b/include/qapi/string-output-visitor.h
index ec81e42..d99717f 100644
--- a/include/qapi/string-output-visitor.h
+++ b/include/qapi/string-output-visitor.h
@@ -17,7 +17,7 @@
typedef struct StringOutputVisitor StringOutputVisitor;
-StringOutputVisitor *string_output_visitor_new(void);
+StringOutputVisitor *string_output_visitor_new(bool human);
void string_output_visitor_cleanup(StringOutputVisitor *v);
char *string_output_get_string(StringOutputVisitor *v);
diff --git a/include/qom/object.h b/include/qom/object.h
index e0ff212..9c7c361 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -946,12 +946,13 @@ void object_property_parse(Object *obj, const char *string,
* object_property_print:
* @obj: the object
* @name: the name of the property
+ * @human: if true, print for human consumption
* @errp: returns an error if this function fails
*
* Returns a string representation of the value of the property. The
* caller shall free the string.
*/
-char *object_property_print(Object *obj, const char *name,
+char *object_property_print(Object *obj, const char *name, bool human,
Error **errp);
/**
diff --git a/qapi/string-output-visitor.c b/qapi/string-output-visitor.c
index 921653d..67a8798 100644
--- a/qapi/string-output-visitor.c
+++ b/qapi/string-output-visitor.c
@@ -14,10 +14,12 @@
#include "qapi/string-output-visitor.h"
#include "qapi/visitor-impl.h"
#include "qapi/qmp/qerror.h"
+#include "qemu/host-utils.h"
struct StringOutputVisitor
{
Visitor visitor;
+ bool human;
char *string;
};
@@ -31,7 +33,45 @@ static void print_type_int(Visitor *v, int64_t *obj, const char *name,
Error **errp)
{
StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v);
- string_output_set(sov, g_strdup_printf("%lld", (long long) *obj));
+ char *out;
+
+ if (sov->human) {
+ out = g_strdup_printf("%lld (%#llx)", (long long) *obj, (long long) *obj);
+ } else {
+ out = g_strdup_printf("%lld", (long long) *obj);
+ }
+ string_output_set(sov, out);
+}
+
+static void print_type_size(Visitor *v, uint64_t *obj, const char *name,
+ Error **errp)
+{
+ StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v);
+ static const char suffixes[] = { 'B', 'K', 'M', 'G', 'T' };
+ uint64_t div, val;
+ char *out;
+ int i;
+
+ if (!sov->human) {
+ out = g_strdup_printf("%llu", (long long) *obj);
+ string_output_set(sov, out);
+ return;
+ }
+
+ val = *obj;
+
+ /* Compute floor(log2(val)). */
+ i = 64 - clz64(val);
+
+ /* Find the power of 1024 that we'll display as the units. */
+ i /= 10;
+ if (i >= ARRAY_SIZE(suffixes)) {
+ i = ARRAY_SIZE(suffixes) - 1;
+ }
+ div = 1ULL << (i * 10);
+
+ out = g_strdup_printf("%0.03f%c", (double)val/div, suffixes[i]);
+ string_output_set(sov, out);
}
static void print_type_bool(Visitor *v, bool *obj, const char *name,
@@ -45,7 +85,14 @@ static void print_type_str(Visitor *v, char **obj, const char *name,
Error **errp)
{
StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v);
- string_output_set(sov, g_strdup(*obj ? *obj : ""));
+ char *out;
+
+ if (sov->human) {
+ out = *obj ? g_strdup_printf("\"%s\"", *obj) : g_strdup("<null>");
+ } else {
+ out = g_strdup(*obj ? *obj : "");
+ }
+ string_output_set(sov, out);
}
static void print_type_number(Visitor *v, double *obj, const char *name,
@@ -73,14 +120,16 @@ void string_output_visitor_cleanup(StringOutputVisitor *sov)
g_free(sov);
}
-StringOutputVisitor *string_output_visitor_new(void)
+StringOutputVisitor *string_output_visitor_new(bool human)
{
StringOutputVisitor *v;
v = g_malloc0(sizeof(*v));
+ v->human = human;
v->visitor.type_enum = output_type_enum;
v->visitor.type_int = print_type_int;
+ v->visitor.type_size = print_type_size;
v->visitor.type_bool = print_type_bool;
v->visitor.type_str = print_type_str;
v->visitor.type_number = print_type_number;
diff --git a/qdev-monitor.c b/qdev-monitor.c
index 4d1634c..f385fb3 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -577,7 +577,7 @@ static void qdev_print_props(Monitor *mon, DeviceState *dev, Property *props,
if (object_property_get_type(OBJECT(dev), legacy_name, NULL)) {
value = object_property_get_str(OBJECT(dev), legacy_name, &err);
} else {
- value = object_property_print(OBJECT(dev), props->name, &err);
+ value = object_property_print(OBJECT(dev), props->name, false, &err);
}
g_free(legacy_name);
diff --git a/qom/object.c b/qom/object.c
index 62e7e41..660859c 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -948,13 +948,13 @@ void object_property_parse(Object *obj, const char *string,
string_input_visitor_cleanup(mi);
}
-char *object_property_print(Object *obj, const char *name,
+char *object_property_print(Object *obj, const char *name, bool human,
Error **errp)
{
StringOutputVisitor *mo;
char *string;
- mo = string_output_visitor_new();
+ mo = string_output_visitor_new(human);
object_property_get(obj, string_output_get_visitor(mo), name, errp);
string = string_output_get_string(mo);
string_output_visitor_cleanup(mo);
diff --git a/tests/test-string-output-visitor.c b/tests/test-string-output-visitor.c
index 79d815f..56cc21d 100644
--- a/tests/test-string-output-visitor.c
+++ b/tests/test-string-output-visitor.c
@@ -26,7 +26,7 @@ typedef struct TestOutputVisitorData {
static void visitor_output_setup(TestOutputVisitorData *data,
const void *unused)
{
- data->sov = string_output_visitor_new();
+ data->sov = string_output_visitor_new(false);
g_assert(data->sov != NULL);
data->ov = string_output_get_visitor(data->sov);
diff --git a/tests/test-visitor-serialization.c b/tests/test-visitor-serialization.c
index 9aaa587..6bff950 100644
--- a/tests/test-visitor-serialization.c
+++ b/tests/test-visitor-serialization.c
@@ -1083,7 +1083,7 @@ static void string_serialize(void *native_in, void **datap,
{
StringSerializeData *d = g_malloc0(sizeof(*d));
- d->sov = string_output_visitor_new();
+ d->sov = string_output_visitor_new(false);
visit(string_output_get_visitor(d->sov), &native_in, errp);
*datap = d;
}
--
1.8.4.5
next prev parent reply other threads:[~2014-02-10 18:37 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-10 18:36 [Qemu-devel] [PULL 00/48] QOM devices patch queue 2014-02-10 Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 01/48] qtest: don't report signals if qtest driver enabled Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 02/48] prep: Drop from ppcemb-softmmu Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 03/48] ppcemb-softmmu: Drop Mac and e500 emulation Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 04/48] target-ppc: Make ppc40x CPUs available in ppcemb Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 05/48] qom-test: Run for all available machines Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 06/48] qom-test: Test shutdown in addition to startup Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 07/48] tests: Run qom-test for every architecture Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 08/48] nand: Don't use qdev_create() in nand_init() Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 09/48] i2c: Rename i2c_bus to I2CBus Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 10/48] pxa2xx: QOM'ify I2C slave Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 11/48] tosa: QOM'ify DAC Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 12/48] z2: QOM'ify AER915 Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 13/48] wm8750: QOM'ify Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 14/48] ssd0303: QOM'ify Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 15/48] max7310: QOM'ify Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 16/48] lm832x: QOM'ify Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 17/48] ds1338: QOM'ify Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 18/48] twl92230: QOM'ify Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 19/48] i2c: Drop FROM_I2C_SLAVE() macro Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 20/48] tests: Add e1000 qtest Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 21/48] tests: Add vmxnet3 qtest Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 22/48] tests: Add rtl8139 qtest Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 23/48] tests: Add pcnet qtest Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 24/48] tests: Add eepro100 qtest Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 25/48] tests: Add ne2000 qtest Andreas Färber
2014-02-14 19:51 ` Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 26/48] tests: Add virtio-net qtest Andreas Färber
2014-02-14 20:00 ` Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 27/48] tests: Add tpci200 qtest Andreas Färber
2014-02-13 14:27 ` Alberto Garcia
2014-02-10 18:36 ` [Qemu-devel] [PULL 28/48] tests: Add ipoctal232 qtest Andreas Färber
2014-02-13 14:28 ` Alberto Garcia
2014-02-14 20:06 ` Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 29/48] ipack: Convert to QOM realize Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 30/48] ipack: QOM parent field cleanup for IPackBus Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 31/48] ipack: QOM parent field cleanup for IPackDevice Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 32/48] ipoctal232: QOM parent field cleanup Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 33/48] ipack: Move IndustryPack out of hw/char/ Andreas Färber
2014-02-14 20:13 ` Andreas Färber
2014-02-14 20:24 ` Paolo Bonzini
2014-02-10 18:36 ` [Qemu-devel] [PULL 34/48] qtest: Don't segfault with invalid -qtest option Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 35/48] qapi: Add size parser to StringInputVisitor Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 36/48] qdev: Sizes are now parsed by StringInputVisitor Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 37/48] qdev: Remove legacy parsers for hex8/32/64 Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 38/48] qdev: Legacy properties are now read-only Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 39/48] qdev: Legacy properties are just strings Andreas Färber
2014-02-10 18:36 ` [Qemu-devel] [PULL 40/48] qdev: Inline qdev_prop_parse() Andreas Färber
2014-02-10 18:36 ` Andreas Färber [this message]
2014-02-10 18:36 ` [Qemu-devel] [PULL 42/48] qdev: Use human mode in "info qtree" Andreas Färber
2014-02-10 18:37 ` [Qemu-devel] [PULL 43/48] qdev: Remove most legacy printers Andreas Färber
2014-02-10 18:37 ` [Qemu-devel] [PULL 44/48] qdev: Remove hex8/32/64 property types Andreas Färber
2014-02-10 18:37 ` [Qemu-devel] [PULL 45/48] block: Handle "rechs" and "large" translation options Andreas Färber
2014-02-10 18:37 ` [Qemu-devel] [PULL 46/48] qdev: Add enum property types to QAPI schema Andreas Färber
2014-02-10 18:37 ` [Qemu-devel] [PULL 47/48] qdev: Use QAPI type names for properties Andreas Färber
2014-02-10 18:37 ` [Qemu-devel] [PULL 48/48] qapi: Refine human printing of sizes Andreas Färber
2014-02-15 15:08 ` [Qemu-devel] [PULL 00/48] QOM devices patch queue 2014-02-10 Peter Maydell
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=1392057426-31990-42-git-send-email-afaerber@suse.de \
--to=afaerber@suse.de \
--cc=lcapitulino@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=pbonzini@redhat.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).