diff options
| author | Anthony Liguori <aliguori@us.ibm.com> | 2011-10-10 08:21:46 -0500 |
|---|---|---|
| committer | Anthony Liguori <aliguori@us.ibm.com> | 2011-10-10 08:21:46 -0500 |
| commit | ebffe2afceb1a17b5d134b5debf553955fe5ea1a (patch) | |
| tree | 223ee0630a56a8d1410d5ad283996486ec434ab7 /qapi/qapi-dealloc-visitor.c | |
| parent | 057643f6c4751651ab640edb9b445cb3816edffc (diff) | |
| parent | 5bc465e4b1b6f4582a400c0a7033a1c841744278 (diff) | |
| download | focaccia-qemu-ebffe2afceb1a17b5d134b5debf553955fe5ea1a.tar.gz focaccia-qemu-ebffe2afceb1a17b5d134b5debf553955fe5ea1a.zip | |
Merge remote-tracking branch 'qmp/queue/qmp' into staging
Diffstat (limited to 'qapi/qapi-dealloc-visitor.c')
| -rw-r--r-- | qapi/qapi-dealloc-visitor.c | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c index f6290611fe..a154523731 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; @@ -26,6 +27,7 @@ struct QapiDeallocVisitor { Visitor visitor; QTAILQ_HEAD(, StackEntry) stack; + bool is_list_head; }; static QapiDeallocVisitor *to_qov(Visitor *v) @@ -38,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); } @@ -70,19 +77,36 @@ 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); + qapi_dealloc_push(qov, NULL); } -static GenericList *qapi_dealloc_next_list(Visitor *v, GenericList **list, +static GenericList *qapi_dealloc_next_list(Visitor *v, GenericList **listp, Error **errp) { - GenericList *retval = *list; - g_free(retval->value); - *list = retval->next; - return retval; + GenericList *list = *listp; + QapiDeallocVisitor *qov = to_qov(v); + StackEntry *e = QTAILQ_FIRST(&qov->stack); + + if (e && e->is_list_head) { + e->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, |