Annotation of qemu/qapi/qapi-dealloc-visitor.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Dealloc Visitor
                      3:  *
                      4:  * Copyright IBM, Corp. 2011
                      5:  *
                      6:  * Authors:
                      7:  *  Michael Roth   <[email protected]>
                      8:  *
                      9:  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
                     10:  * See the COPYING.LIB file in the top-level directory.
                     11:  *
                     12:  */
                     13: 
                     14: #include "qapi-dealloc-visitor.h"
                     15: #include "qemu-queue.h"
                     16: #include "qemu-common.h"
                     17: #include "qemu-objects.h"
                     18: 
                     19: typedef struct StackEntry
                     20: {
                     21:     void *value;
                     22:     QTAILQ_ENTRY(StackEntry) node;
                     23: } StackEntry;
                     24: 
                     25: struct QapiDeallocVisitor
                     26: {
                     27:     Visitor visitor;
                     28:     QTAILQ_HEAD(, StackEntry) stack;
                     29: };
                     30: 
                     31: static QapiDeallocVisitor *to_qov(Visitor *v)
                     32: {
                     33:     return container_of(v, QapiDeallocVisitor, visitor);
                     34: }
                     35: 
                     36: static void qapi_dealloc_push(QapiDeallocVisitor *qov, void *value)
                     37: {
                     38:     StackEntry *e = qemu_mallocz(sizeof(*e));
                     39: 
                     40:     e->value = value;
                     41:     QTAILQ_INSERT_HEAD(&qov->stack, e, node);
                     42: }
                     43: 
                     44: static void *qapi_dealloc_pop(QapiDeallocVisitor *qov)
                     45: {
                     46:     StackEntry *e = QTAILQ_FIRST(&qov->stack);
                     47:     QObject *value;
                     48:     QTAILQ_REMOVE(&qov->stack, e, node);
                     49:     value = e->value;
                     50:     qemu_free(e);
                     51:     return value;
                     52: }
                     53: 
                     54: static void qapi_dealloc_start_struct(Visitor *v, void **obj, const char *kind,
                     55:                                       const char *name, size_t unused,
                     56:                                       Error **errp)
                     57: {
                     58:     QapiDeallocVisitor *qov = to_qov(v);
                     59:     qapi_dealloc_push(qov, obj);
                     60: }
                     61: 
                     62: static void qapi_dealloc_end_struct(Visitor *v, Error **errp)
                     63: {
                     64:     QapiDeallocVisitor *qov = to_qov(v);
                     65:     void **obj = qapi_dealloc_pop(qov);
                     66:     if (obj) {
                     67:         qemu_free(*obj);
                     68:     }
                     69: }
                     70: 
                     71: static void qapi_dealloc_start_list(Visitor *v, const char *name, Error **errp)
                     72: {
                     73: }
                     74: 
                     75: static GenericList *qapi_dealloc_next_list(Visitor *v, GenericList **list,
                     76:                                            Error **errp)
                     77: {
                     78:     GenericList *retval = *list;
                     79:     qemu_free(retval->value);
                     80:     *list = retval->next;
                     81:     return retval;
                     82: }
                     83: 
                     84: static void qapi_dealloc_end_list(Visitor *v, Error **errp)
                     85: {
                     86: }
                     87: 
                     88: static void qapi_dealloc_type_str(Visitor *v, char **obj, const char *name,
                     89:                                   Error **errp)
                     90: {
                     91:     if (obj) {
                     92:         qemu_free(*obj);
                     93:     }
                     94: }
                     95: 
                     96: static void qapi_dealloc_type_int(Visitor *v, int64_t *obj, const char *name,
                     97:                                   Error **errp)
                     98: {
                     99: }
                    100: 
                    101: static void qapi_dealloc_type_bool(Visitor *v, bool *obj, const char *name,
                    102:                                    Error **errp)
                    103: {
                    104: }
                    105: 
                    106: static void qapi_dealloc_type_number(Visitor *v, double *obj, const char *name,
                    107:                                      Error **errp)
                    108: {
                    109: }
                    110: 
                    111: static void qapi_dealloc_type_enum(Visitor *v, int *obj, const char *strings[],
                    112:                                    const char *kind, const char *name,
                    113:                                    Error **errp)
                    114: {
                    115: }
                    116: 
                    117: Visitor *qapi_dealloc_get_visitor(QapiDeallocVisitor *v)
                    118: {
                    119:     return &v->visitor;
                    120: }
                    121: 
                    122: void qapi_dealloc_visitor_cleanup(QapiDeallocVisitor *v)
                    123: {
                    124:     qemu_free(v);
                    125: }
                    126: 
                    127: QapiDeallocVisitor *qapi_dealloc_visitor_new(void)
                    128: {
                    129:     QapiDeallocVisitor *v;
                    130: 
                    131:     v = qemu_mallocz(sizeof(*v));
                    132: 
                    133:     v->visitor.start_struct = qapi_dealloc_start_struct;
                    134:     v->visitor.end_struct = qapi_dealloc_end_struct;
                    135:     v->visitor.start_list = qapi_dealloc_start_list;
                    136:     v->visitor.next_list = qapi_dealloc_next_list;
                    137:     v->visitor.end_list = qapi_dealloc_end_list;
                    138:     v->visitor.type_enum = qapi_dealloc_type_enum;
                    139:     v->visitor.type_int = qapi_dealloc_type_int;
                    140:     v->visitor.type_bool = qapi_dealloc_type_bool;
                    141:     v->visitor.type_str = qapi_dealloc_type_str;
                    142:     v->visitor.type_number = qapi_dealloc_type_number;
                    143: 
                    144:     QTAILQ_INIT(&v->stack);
                    145: 
                    146:     return v;
                    147: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.