[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 09/21] qapi: dealloc visitor, support freeing of nes
From: |
Luiz Capitulino |
Subject: |
[Qemu-devel] [PATCH 09/21] qapi: dealloc visitor, support freeing of nested lists |
Date: |
Wed, 28 Sep 2011 11:44:33 -0300 |
From: Michael Roth <address@hidden>
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 <address@hidden>
Signed-off-by: Luiz Capitulino <address@hidden>
---
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,
--
1.7.7.rc0.72.g4b5ea
- [Qemu-devel] [PATCH v1 00/21]: First round of QAPI conversions, Luiz Capitulino, 2011/09/28
- [Qemu-devel] [PATCH 02/21] qerror: add qerror_report_err(), Luiz Capitulino, 2011/09/28
- [Qemu-devel] [PATCH 03/21] qapi: add code generation support for middle mode, Luiz Capitulino, 2011/09/28
- [Qemu-devel] [PATCH 04/21] qapi: use middle mode in QMP server, Luiz Capitulino, 2011/09/28
- [Qemu-devel] [PATCH 01/21] error: let error_is_type take a NULL error, Luiz Capitulino, 2011/09/28
- [Qemu-devel] [PATCH 07/21] qapi: generate qapi_free_* functions for *List types, Luiz Capitulino, 2011/09/28
- [Qemu-devel] [PATCH 05/21] qapi: fixup command generation for functions that return list types, Luiz Capitulino, 2011/09/28
- [Qemu-devel] [PATCH 08/21] qapi: add test cases for generated free functions, Luiz Capitulino, 2011/09/28
- [Qemu-devel] [PATCH 09/21] qapi: dealloc visitor, support freeing of nested lists,
Luiz Capitulino <=
- [Qemu-devel] [PATCH 11/21] qapi: convert query-name, Luiz Capitulino, 2011/09/28
- [Qemu-devel] [PATCH 12/21] qapi: Convert query-version, Luiz Capitulino, 2011/09/28
- [Qemu-devel] [PATCH 16/21] qapi: Convert query-chardev, Luiz Capitulino, 2011/09/28
- [Qemu-devel] [PATCH 06/21] qapi: dealloc visitor, fix premature free and iteration logic, Luiz Capitulino, 2011/09/28