From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:36856) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R9G6K-0002i0-5C for qemu-devel@nongnu.org; Thu, 29 Sep 2011 08:52:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1R9G6J-00087b-2g for qemu-devel@nongnu.org; Thu, 29 Sep 2011 08:52:32 -0400 Received: from e32.co.us.ibm.com ([32.97.110.150]:56227) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R9G6I-00087P-GS for qemu-devel@nongnu.org; Thu, 29 Sep 2011 08:52:30 -0400 Received: from /spool/local by us.ibm.com with XMail ESMTP for from ; Thu, 29 Sep 2011 06:52:28 -0600 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by d03relay02.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p8TCq1jZ134954 for ; Thu, 29 Sep 2011 06:52:08 -0600 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p8TCq0qG027463 for ; Thu, 29 Sep 2011 06:52:01 -0600 Message-ID: <4E8469EF.9080604@us.ibm.com> Date: Thu, 29 Sep 2011 07:51:59 -0500 From: Anthony Liguori MIME-Version: 1.0 References: <1317221085-5825-1-git-send-email-lcapitulino@redhat.com> <1317221085-5825-10-git-send-email-lcapitulino@redhat.com> In-Reply-To: <1317221085-5825-10-git-send-email-lcapitulino@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 09/21] qapi: dealloc visitor, support freeing of nested lists List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Luiz Capitulino Cc: kwolf@redhat.com, armbru@redhat.com, qemu-devel@nongnu.org, mdroth@linux.vnet.ibm.com On 09/28/2011 09:44 AM, Luiz Capitulino wrote: > From: Michael Roth > > Previously our logic for keeping track of when we're visiting the head > of a list was done via a global bool. This can be overwritten if dealing > with nested lists, so use stack entries to track this instead. > > Signed-off-by: Michael Roth > Signed-off-by: Luiz Capitulino Reviewed-by: Anthony Liguori Regards, Anthony Liguori > --- > qapi/qapi-dealloc-visitor.c | 28 +++++++++++++++++++++------- > 1 files changed, 21 insertions(+), 7 deletions(-) > > diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c > index 6b586ad..a154523 100644 > --- a/qapi/qapi-dealloc-visitor.c > +++ b/qapi/qapi-dealloc-visitor.c > @@ -19,6 +19,7 @@ > typedef struct StackEntry > { > void *value; > + bool is_list_head; > QTAILQ_ENTRY(StackEntry) node; > } StackEntry; > > @@ -39,6 +40,11 @@ static void qapi_dealloc_push(QapiDeallocVisitor *qov, void *value) > StackEntry *e = g_malloc0(sizeof(*e)); > > e->value = value; > + > + /* see if we're just pushing a list head tracker */ > + if (value == NULL) { > + e->is_list_head = true; > + } > QTAILQ_INSERT_HEAD(&qov->stack, e, node); > } > > @@ -72,7 +78,7 @@ static void qapi_dealloc_end_struct(Visitor *v, Error **errp) > static void qapi_dealloc_start_list(Visitor *v, const char *name, Error **errp) > { > QapiDeallocVisitor *qov = to_qov(v); > - qov->is_list_head = true; > + qapi_dealloc_push(qov, NULL); > } > > static GenericList *qapi_dealloc_next_list(Visitor *v, GenericList **listp, > @@ -80,19 +86,27 @@ static GenericList *qapi_dealloc_next_list(Visitor *v, GenericList **listp, > { > GenericList *list = *listp; > QapiDeallocVisitor *qov = to_qov(v); > + StackEntry *e = QTAILQ_FIRST(&qov->stack); > > - if (!qov->is_list_head) { > - *listp = list->next; > - g_free(list); > - return *listp; > + if (e&& e->is_list_head) { > + e->is_list_head = false; > + return list; > } > > - qov->is_list_head = false; > - return list; > + if (list) { > + list = list->next; > + g_free(*listp); > + return list; > + } > + > + return NULL; > } > > static void qapi_dealloc_end_list(Visitor *v, Error **errp) > { > + QapiDeallocVisitor *qov = to_qov(v); > + void *obj = qapi_dealloc_pop(qov); > + assert(obj == NULL); /* should've been list head tracker with no payload */ > } > > static void qapi_dealloc_type_str(Visitor *v, char **obj, const char *name,