X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=qapi%2Fqapi-dealloc-visitor.c;h=1334de33cc690057ffc80f766f604dd3f4e8e98c;hb=3494d650273e619606c6cb2c38aa9b8b7bed98e2;hp=8cde4dd0d40edc3891cbfa0b80c8a3baf39449be;hpb=d5f3c29cf8d59fad4f3c657fc0a26510043bec65;p=mirror_qemu.git diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c index 8cde4dd0d4..1334de33cc 100644 --- a/qapi/qapi-dealloc-visitor.c +++ b/qapi/qapi-dealloc-visitor.c @@ -11,14 +11,16 @@ * */ -#include "qapi-dealloc-visitor.h" -#include "qemu-queue.h" +#include "qapi/dealloc-visitor.h" +#include "qemu/queue.h" #include "qemu-common.h" -#include "qemu-objects.h" +#include "qapi/qmp/types.h" +#include "qapi/visitor-impl.h" typedef struct StackEntry { void *value; + bool is_list_head; QTAILQ_ENTRY(StackEntry) node; } StackEntry; @@ -26,6 +28,7 @@ struct QapiDeallocVisitor { Visitor visitor; QTAILQ_HEAD(, StackEntry) stack; + bool is_list_head; }; static QapiDeallocVisitor *to_qov(Visitor *v) @@ -35,9 +38,14 @@ static QapiDeallocVisitor *to_qov(Visitor *v) static void qapi_dealloc_push(QapiDeallocVisitor *qov, void *value) { - StackEntry *e = qemu_mallocz(sizeof(*e)); + 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); } @@ -47,7 +55,7 @@ static void *qapi_dealloc_pop(QapiDeallocVisitor *qov) QObject *value; QTAILQ_REMOVE(&qov->stack, e, node); value = e->value; - qemu_free(e); + g_free(e); return value; } @@ -64,32 +72,49 @@ static void qapi_dealloc_end_struct(Visitor *v, Error **errp) QapiDeallocVisitor *qov = to_qov(v); void **obj = qapi_dealloc_pop(qov); if (obj) { - qemu_free(*obj); + g_free(*obj); } } 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; - qemu_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, Error **errp) { if (obj) { - qemu_free(*obj); + g_free(*obj); } } @@ -108,6 +133,11 @@ static void qapi_dealloc_type_number(Visitor *v, double *obj, const char *name, { } +static void qapi_dealloc_type_size(Visitor *v, uint64_t *obj, const char *name, + Error **errp) +{ +} + static void qapi_dealloc_type_enum(Visitor *v, int *obj, const char *strings[], const char *kind, const char *name, Error **errp) @@ -121,14 +151,14 @@ Visitor *qapi_dealloc_get_visitor(QapiDeallocVisitor *v) void qapi_dealloc_visitor_cleanup(QapiDeallocVisitor *v) { - qemu_free(v); + g_free(v); } QapiDeallocVisitor *qapi_dealloc_visitor_new(void) { QapiDeallocVisitor *v; - v = qemu_mallocz(sizeof(*v)); + v = g_malloc0(sizeof(*v)); v->visitor.start_struct = qapi_dealloc_start_struct; v->visitor.end_struct = qapi_dealloc_end_struct; @@ -140,6 +170,7 @@ QapiDeallocVisitor *qapi_dealloc_visitor_new(void) v->visitor.type_bool = qapi_dealloc_type_bool; v->visitor.type_str = qapi_dealloc_type_str; v->visitor.type_number = qapi_dealloc_type_number; + v->visitor.type_size = qapi_dealloc_type_size; QTAILQ_INIT(&v->stack);