From patchwork Thu Apr 28 21:45:25 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Blake X-Patchwork-Id: 616460 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3qwr9f5Xz6z9t79 for ; Fri, 29 Apr 2016 07:50:46 +1000 (AEST) Received: from localhost ([::1]:51195 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1avtpc-00024V-HJ for incoming@patchwork.ozlabs.org; Thu, 28 Apr 2016 17:50:44 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55117) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1avtkm-0007ue-Gm for qemu-devel@nongnu.org; Thu, 28 Apr 2016 17:45:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1avtkl-0000HU-G9 for qemu-devel@nongnu.org; Thu, 28 Apr 2016 17:45:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35424) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1avtkl-0000HM-9Q for qemu-devel@nongnu.org; Thu, 28 Apr 2016 17:45:43 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E3C8780E47; Thu, 28 Apr 2016 21:45:42 +0000 (UTC) Received: from red.redhat.com (ovpn-113-21.phx2.redhat.com [10.3.113.21]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3SLjY8d019512; Thu, 28 Apr 2016 17:45:42 -0400 From: Eric Blake To: qemu-devel@nongnu.org Date: Thu, 28 Apr 2016 15:45:25 -0600 Message-Id: <1461879932-9020-18-git-send-email-eblake@redhat.com> In-Reply-To: <1461879932-9020-1-git-send-email-eblake@redhat.com> References: <1461879932-9020-1-git-send-email-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v16 17/24] qmp: Add qmp_output_visitor_reset() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: armbru@redhat.com, Michael Roth Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Add a new qmp_output_visitor_reset(), to make it easier for a caller to reset all state while still reusing an existing visitor, regardless of whether the previous visit was successfully completed. Then use it in the testsuite. The tests needing patching were found by tightening asserts in the QMP output visitor; see the next patch. An audit of all other users of qmp_output_visitor_new() did not find any other attempts to reuse a visitor. Signed-off-by: Eric Blake --- v15: new patch, split off of v14 13/19 --- include/qapi/qmp-output-visitor.h | 1 + qapi/qmp-output-visitor.c | 8 +++++++- tests/test-qmp-output-visitor.c | 6 ++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/include/qapi/qmp-output-visitor.h b/include/qapi/qmp-output-visitor.h index 2266770..5093f0d 100644 --- a/include/qapi/qmp-output-visitor.h +++ b/include/qapi/qmp-output-visitor.h @@ -21,6 +21,7 @@ typedef struct QmpOutputVisitor QmpOutputVisitor; QmpOutputVisitor *qmp_output_visitor_new(void); void qmp_output_visitor_cleanup(QmpOutputVisitor *v); +void qmp_output_visitor_reset(QmpOutputVisitor *v); QObject *qmp_output_get_qobject(QmpOutputVisitor *v); Visitor *qmp_output_get_visitor(QmpOutputVisitor *v); diff --git a/qapi/qmp-output-visitor.c b/qapi/qmp-output-visitor.c index 5681ad3..6c44210 100644 --- a/qapi/qmp-output-visitor.c +++ b/qapi/qmp-output-visitor.c @@ -221,7 +221,7 @@ Visitor *qmp_output_get_visitor(QmpOutputVisitor *v) return &v->visitor; } -void qmp_output_visitor_cleanup(QmpOutputVisitor *v) +void qmp_output_visitor_reset(QmpOutputVisitor *v) { QStackEntry *e, *tmp; @@ -231,6 +231,12 @@ void qmp_output_visitor_cleanup(QmpOutputVisitor *v) } qobject_decref(v->root); + v->root = NULL; +} + +void qmp_output_visitor_cleanup(QmpOutputVisitor *v) +{ + qmp_output_visitor_reset(v); g_free(v); } diff --git a/tests/test-qmp-output-visitor.c b/tests/test-qmp-output-visitor.c index 8acc229..0e83099 100644 --- a/tests/test-qmp-output-visitor.c +++ b/tests/test-qmp-output-visitor.c @@ -139,6 +139,7 @@ static void test_visitor_out_enum(TestOutputVisitorData *data, g_assert_cmpstr(qstring_get_str(qobject_to_qstring(obj)), ==, EnumOne_lookup[i]); qobject_decref(obj); + qmp_output_visitor_reset(data->qov); } } @@ -153,6 +154,7 @@ static void test_visitor_out_enum_errors(TestOutputVisitorData *data, visit_type_EnumOne(data->ov, "unused", &bad_values[i], &err); g_assert(err); error_free(err); + qmp_output_visitor_reset(data->qov); } } @@ -262,6 +264,7 @@ static void test_visitor_out_struct_errors(TestOutputVisitorData *data, visit_type_UserDefOne(data->ov, "unused", &pu, &err); g_assert(err); error_free(err); + qmp_output_visitor_reset(data->qov); } } @@ -366,6 +369,7 @@ static void test_visitor_out_any(TestOutputVisitorData *data, qobject_decref(obj); qobject_decref(qobj); + qmp_output_visitor_reset(data->qov); qdict = qdict_new(); qdict_put(qdict, "integer", qint_from_int(-42)); qdict_put(qdict, "boolean", qbool_from_bool(true)); @@ -442,6 +446,7 @@ static void test_visitor_out_alternate(TestOutputVisitorData *data, qapi_free_UserDefAlternate(tmp); qobject_decref(arg); + qmp_output_visitor_reset(data->qov); tmp = g_new0(UserDefAlternate, 1); tmp->type = QTYPE_QSTRING; tmp->u.s = g_strdup("hello"); @@ -455,6 +460,7 @@ static void test_visitor_out_alternate(TestOutputVisitorData *data, qapi_free_UserDefAlternate(tmp); qobject_decref(arg); + qmp_output_visitor_reset(data->qov); tmp = g_new0(UserDefAlternate, 1); tmp->type = QTYPE_QDICT; tmp->u.udfu.integer = 1;