From patchwork Thu Mar 22 21:38:40 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 148337 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 4C0B3B6F6E for ; Fri, 23 Mar 2012 08:39:13 +1100 (EST) Received: from localhost ([::1]:58002 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SApix-0003sY-7E for incoming@patchwork.ozlabs.org; Thu, 22 Mar 2012 17:39:11 -0400 Received: from eggs.gnu.org ([208.118.235.92]:45384) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SApiq-0003sD-M4 for qemu-devel@nongnu.org; Thu, 22 Mar 2012 17:39:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SApio-0001OF-RB for qemu-devel@nongnu.org; Thu, 22 Mar 2012 17:39:04 -0400 Received: from mail-gy0-f173.google.com ([209.85.160.173]:62237) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SApio-0001O0-JF for qemu-devel@nongnu.org; Thu, 22 Mar 2012 17:39:02 -0400 Received: by ghrr14 with SMTP id r14so2693352ghr.4 for ; Thu, 22 Mar 2012 14:39:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=L0vtjCfdkkxDgwvFeUh0P529P085s64vRKoJuVJQhGU=; b=nnBQ0Imc5DJ7fcYZEUmnJv6z2R2psYO75wk8Js9fAgwlFT1q3T3lnbY/0A9FiC8egK modfCJPq/VcZDjGJdXZikP2yZcLAm/XPLMSz5jBwheaMGgANQG6GzHj90GW+nOezDM/C xbkGRCtW4AWaErSJ8pOwbnEF/IJO4hNNYHWUWL2Vu1isX2KUm9df72TaCnCqz0qkD+15 izfbM/D9YTrr+mAC9pZ276C1xnQI6Ul36yAufgHXvzqTKynRsBrXnprvTsm9sSCJon0D GgzV0DZhMooXUySP1m5eVdj5xiMo43UMuLKVLL6njS5jVMNiCyYML7ZWYJQHG98saNLJ oUKw== Received: by 10.68.200.9 with SMTP id jo9mr23703101pbc.19.1332452340158; Thu, 22 Mar 2012 14:39:00 -0700 (PDT) Received: from yakj.usersys.redhat.com (93-34-182-16.ip50.fastwebnet.it. [93.34.182.16]) by mx.google.com with ESMTPS id k2sm4454342pba.28.2012.03.22.14.38.56 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 22 Mar 2012 14:38:58 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 22 Mar 2012 22:38:40 +0100 Message-Id: <1332452320-21956-1-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.7.9.1 In-Reply-To: <4F6B9874.4020108@redhat.com> References: <4F6B9874.4020108@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.160.173 Cc: eblake@redhat.com, mdroth@linux.vnet.ibm.com, anthony@codemonkey.ws, lcapitulino@redhat.com Subject: [Qemu-devel] [PATCH v2 06/10] qapi: untangle next_list X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Right now, the semantics of next_list are complicated. The caller must: * call start_list * call next_list for each element *including the first* * on the first call to next_list, the second argument should point to NULL and the result is the head of the list. On subsequent calls, the second argument should point to the last node (last result of next_list) and next_list itself tacks the element at the tail of the list. This works for both input and output visitor, but having the visitor write memory when it is only reading the list is ugly. Plus, relying on *list to detect the first call is tricky and undocumented. We can initialize so->entry in next_list instead of start_list, leaving it NULL in start_list. This way next_list sees clearly whether it is on the first call---as a bonus, it discriminates the cases based on internal state of the visitor rather than external state. We can also pull the assignment of the list head from generated code up to next_list. Signed-off-by: Paolo Bonzini Reviewed-by: Michael Roth --- docs/qapi-code-gen.txt | 4 ++-- qapi/qmp-input-visitor.c | 22 +++++++++++++--------- scripts/qapi-visit.py | 4 ++-- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/docs/qapi-code-gen.txt b/docs/qapi-code-gen.txt index 5831e37..ad11767 100644 --- a/docs/qapi-code-gen.txt +++ b/docs/qapi-code-gen.txt @@ -194,11 +194,11 @@ Example: void visit_type_UserDefOneList(Visitor *m, UserDefOneList ** obj, const char *name, Error **errp) { - GenericList *i; + GenericList *i, **prev = (GenericList **)obj; visit_start_list(m, name, errp); - for (i = visit_next_list(m, (GenericList **)obj, errp); i; i = visit_next_list(m, &i, errp)) { + for (; (i = visit_next_list(m, prev, errp)) != NULL; prev = &i) { UserDefOneList *native_i = (UserDefOneList *)i; visit_type_UserDefOne(m, &native_i->value, NULL, errp); } diff --git a/qapi/qmp-input-visitor.c b/qapi/qmp-input-visitor.c index ef9288f..413e333 100644 --- a/qapi/qmp-input-visitor.c +++ b/qapi/qmp-input-visitor.c @@ -64,9 +64,7 @@ static const QObject *qmp_input_get_object(QmpInputVisitor *qiv, static void qmp_input_push(QmpInputVisitor *qiv, const QObject *obj, Error **errp) { qiv->stack[qiv->nb_stack].obj = obj; - if (qobject_type(obj) == QTYPE_QLIST) { - qiv->stack[qiv->nb_stack].entry = qlist_first(qobject_to_qlist(obj)); - } + qiv->stack[qiv->nb_stack].entry = NULL; qiv->nb_stack++; if (qiv->nb_stack >= QIV_STACK_SIZE) { @@ -132,18 +130,24 @@ static GenericList *qmp_input_next_list(Visitor *v, GenericList **list, QmpInputVisitor *qiv = to_qiv(v); GenericList *entry; StackObject *so = &qiv->stack[qiv->nb_stack - 1]; + bool first; + + if (so->entry == NULL) { + so->entry = qlist_first(qobject_to_qlist(so->obj)); + first = true; + } else { + so->entry = qlist_next(so->entry); + first = false; + } if (so->entry == NULL) { return NULL; } entry = g_malloc0(sizeof(*entry)); - if (*list) { - so->entry = qlist_next(so->entry); - if (so->entry == NULL) { - g_free(entry); - return NULL; - } + if (first) { + *list = entry; + } else { (*list)->next = entry; } diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py index a85fb76..1ff81f4 100644 --- a/scripts/qapi-visit.py +++ b/scripts/qapi-visit.py @@ -86,14 +86,14 @@ def generate_visit_list(name, members): void visit_type_%(name)sList(Visitor *m, %(name)sList ** obj, const char *name, Error **errp) { - GenericList *i, **head = (GenericList **)obj; + GenericList *i, **prev = (GenericList **)obj; if (error_is_set(errp)) { return; } visit_start_list(m, name, errp); - for (*head = i = visit_next_list(m, head, errp); i; i = visit_next_list(m, &i, errp)) { + for (; (i = visit_next_list(m, prev, errp)) != NULL; prev = &i) { %(name)sList *native_i = (%(name)sList *)i; visit_type_%(name)s(m, &native_i->value, NULL, errp); }