qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

qapi: Use QNull for a more regular visit_type_null()

Make visit_type_null() take an @obj argument like its buddies. This
helps keep the next commit simple.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Daniel P. Berrange <berrange@redhat.com>

+60 -25
+3 -1
hw/ppc/spapr_drc.c
··· 297 297 void *opaque, Error **errp) 298 298 { 299 299 sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(obj); 300 + QNull *null = NULL; 300 301 Error *err = NULL; 301 302 int fdt_offset_next, fdt_offset, fdt_depth; 302 303 void *fdt; 303 304 304 305 if (!drc->fdt) { 305 - visit_type_null(v, NULL, errp); 306 + visit_type_null(v, NULL, &null, errp); 307 + QDECREF(null); 306 308 return; 307 309 } 308 310
+2 -1
include/qapi/visitor-impl.h
··· 103 103 Error **errp); 104 104 105 105 /* Must be set to visit explicit null values. */ 106 - void (*type_null)(Visitor *v, const char *name, Error **errp); 106 + void (*type_null)(Visitor *v, const char *name, QNull **obj, 107 + Error **errp); 107 108 108 109 /* Must be set for input visitors to visit structs, optional otherwise. 109 110 The core takes care of the return type in the public interface. */
+4 -4
include/qapi/visitor.h
··· 618 618 * @name expresses the relationship of the null value to its parent 619 619 * container; see the general description of @name above. 620 620 * 621 - * Unlike all other visit_type_* functions, no obj parameter is 622 - * needed; rather, this is a witness that an explicit null value is 623 - * expected rather than any other type. 621 + * @obj must be non-NULL. Input visitors set *@obj to the value; 622 + * other visitors ignore *@obj. 624 623 */ 625 - void visit_type_null(Visitor *v, const char *name, Error **errp); 624 + void visit_type_null(Visitor *v, const char *name, QNull **obj, 625 + Error **errp); 626 626 627 627 #endif
+3 -2
qapi/qapi-clone-visitor.c
··· 127 127 /* Value was already cloned by g_memdup() */ 128 128 } 129 129 130 - static void qapi_clone_type_null(Visitor *v, const char *name, Error **errp) 130 + static void qapi_clone_type_null(Visitor *v, const char *name, QNull **obj, 131 + Error **errp) 131 132 { 132 133 QapiCloneVisitor *qcv = to_qcv(v); 133 134 134 135 assert(qcv->depth); 135 - /* Nothing to do */ 136 + *obj = qnull(); 136 137 } 137 138 138 139 static void qapi_clone_free(Visitor *v)
+5 -1
qapi/qapi-dealloc-visitor.c
··· 103 103 } 104 104 } 105 105 106 - static void qapi_dealloc_type_null(Visitor *v, const char *name, Error **errp) 106 + static void qapi_dealloc_type_null(Visitor *v, const char *name, 107 + QNull **obj, Error **errp) 107 108 { 109 + if (obj) { 110 + QDECREF(*obj); 111 + } 108 112 } 109 113 110 114 static void qapi_dealloc_free(Visitor *v)
+4 -3
qapi/qapi-visit-core.c
··· 325 325 error_propagate(errp, err); 326 326 } 327 327 328 - void visit_type_null(Visitor *v, const char *name, Error **errp) 328 + void visit_type_null(Visitor *v, const char *name, QNull **obj, 329 + Error **errp) 329 330 { 330 - trace_visit_type_null(v, name); 331 - v->type_null(v, name, errp); 331 + trace_visit_type_null(v, name, obj); 332 + v->type_null(v, name, obj, errp); 332 333 } 333 334 334 335 static void output_type_enum(Visitor *v, const char *name, int *obj,
+5 -1
qapi/qobject-input-visitor.c
··· 587 587 *obj = qobj; 588 588 } 589 589 590 - static void qobject_input_type_null(Visitor *v, const char *name, Error **errp) 590 + static void qobject_input_type_null(Visitor *v, const char *name, 591 + QNull **obj, Error **errp) 591 592 { 592 593 QObjectInputVisitor *qiv = to_qiv(v); 593 594 QObject *qobj = qobject_input_get_object(qiv, name, true, errp); 594 595 596 + *obj = NULL; 595 597 if (!qobj) { 596 598 return; 597 599 } ··· 599 601 if (qobject_type(qobj) != QTYPE_QNULL) { 600 602 error_setg(errp, QERR_INVALID_PARAMETER_TYPE, 601 603 full_name(qiv, name), "null"); 604 + return; 602 605 } 606 + *obj = qnull(); 603 607 } 604 608 605 609 static void qobject_input_type_size_keyval(Visitor *v, const char *name,
+2 -1
qapi/qobject-output-visitor.c
··· 187 187 qobject_output_add_obj(qov, name, *obj); 188 188 } 189 189 190 - static void qobject_output_type_null(Visitor *v, const char *name, Error **errp) 190 + static void qobject_output_type_null(Visitor *v, const char *name, 191 + QNull **obj, Error **errp) 191 192 { 192 193 QObjectOutputVisitor *qov = to_qov(v); 193 194 qobject_output_add(qov, name, qnull());
+7 -1
qapi/string-input-visitor.c
··· 326 326 *obj = val; 327 327 } 328 328 329 - static void parse_type_null(Visitor *v, const char *name, Error **errp) 329 + static void parse_type_null(Visitor *v, const char *name, QNull **obj, 330 + Error **errp) 330 331 { 331 332 StringInputVisitor *siv = to_siv(v); 332 333 334 + *obj = NULL; 335 + 333 336 if (!siv->string || siv->string[0]) { 334 337 error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", 335 338 "null"); 339 + return; 336 340 } 341 + 342 + *obj = qnull(); 337 343 } 338 344 339 345 static void string_input_free(Visitor *v)
+2 -1
qapi/string-output-visitor.c
··· 256 256 string_output_set(sov, g_strdup_printf("%f", *obj)); 257 257 } 258 258 259 - static void print_type_null(Visitor *v, const char *name, Error **errp) 259 + static void print_type_null(Visitor *v, const char *name, QNull **obj, 260 + Error **errp) 260 261 { 261 262 StringOutputVisitor *sov = to_sov(v); 262 263 char *out;
+1 -1
qapi/trace-events
··· 31 31 visit_type_str(void *v, const char *name, char **obj) "v=%p name=%s obj=%p" 32 32 visit_type_number(void *v, const char *name, double *obj) "v=%p name=%s obj=%p" 33 33 visit_type_any(void *v, const char *name, void *obj) "v=%p name=%s obj=%p" 34 - visit_type_null(void *v, const char *name) "v=%p name=%s" 34 + visit_type_null(void *v, const char *name, void *obj) "v=%p name=%s obj=%p"
+4 -1
target/ppc/translate_init.c
··· 8428 8428 static void getset_compat_deprecated(Object *obj, Visitor *v, const char *name, 8429 8429 void *opaque, Error **errp) 8430 8430 { 8431 + QNull *null = NULL; 8432 + 8431 8433 if (!qtest_enabled()) { 8432 8434 error_report("CPU 'compat' property is deprecated and has no effect; " 8433 8435 "use max-cpu-compat machine property instead"); 8434 8436 } 8435 - visit_type_null(v, name, NULL); 8437 + visit_type_null(v, name, &null, NULL); 8438 + QDECREF(null); 8436 8439 } 8437 8440 8438 8441 static const PropertyInfo ppc_compat_deprecated_propinfo = {
+7 -2
tests/check-qnull.c
··· 38 38 { 39 39 QObject *obj; 40 40 Visitor *v; 41 + QNull *null; 41 42 42 43 /* 43 44 * Most tests of interactions between QObject and visitors are in ··· 49 50 obj = QOBJECT(qnull()); 50 51 v = qobject_input_visitor_new(obj); 51 52 qobject_decref(obj); 52 - visit_type_null(v, NULL, &error_abort); 53 + visit_type_null(v, NULL, &null, &error_abort); 54 + g_assert(obj == QOBJECT(&qnull_)); 55 + QDECREF(null); 53 56 visit_free(v); 54 57 58 + null = NULL; 55 59 v = qobject_output_visitor_new(&obj); 56 - visit_type_null(v, NULL, &error_abort); 60 + visit_type_null(v, NULL, &null, &error_abort); 57 61 visit_complete(v, &obj); 58 62 g_assert(obj == QOBJECT(&qnull_)); 63 + QDECREF(null); 59 64 qobject_decref(obj); 60 65 visit_free(v); 61 66
+9 -4
tests/test-qobject-input-visitor.c
··· 510 510 { 511 511 Visitor *v; 512 512 Error *err = NULL; 513 + QNull *null; 513 514 char *tmp; 514 515 515 516 /* ··· 524 525 v = visitor_input_test_init_full(data, false, 525 526 "{ 'a': null, 'b': '' }"); 526 527 visit_start_struct(v, NULL, NULL, 0, &error_abort); 527 - visit_type_null(v, "a", &error_abort); 528 - visit_type_null(v, "b", &err); 528 + visit_type_null(v, "a", &null, &error_abort); 529 + g_assert(qobject_type(QOBJECT(null)) == QTYPE_QNULL); 530 + QDECREF(null); 531 + visit_type_null(v, "b", &null, &err); 529 532 error_free_or_abort(&err); 533 + g_assert(!null); 530 534 visit_type_str(v, "c", &tmp, &err); 531 - g_assert(!tmp); 532 535 error_free_or_abort(&err); 536 + g_assert(!tmp); 533 537 visit_check_struct(v, &error_abort); 534 538 visit_end_struct(v, NULL); 535 539 } ··· 1087 1091 Error *err = NULL; 1088 1092 Visitor *v; 1089 1093 QObject *any; 1094 + QNull *null; 1090 1095 GenericAlternate *alt; 1091 1096 bool present; 1092 1097 int en; ··· 1120 1125 error_free_or_abort(&err); 1121 1126 visit_type_any(v, "any", &any, &err); 1122 1127 error_free_or_abort(&err); 1123 - visit_type_null(v, "null", &err); 1128 + visit_type_null(v, "null", &null, &err); 1124 1129 error_free_or_abort(&err); 1125 1130 visit_start_list(v, "sub", NULL, 0, &error_abort); 1126 1131 visit_start_struct(v, NULL, NULL, 0, &error_abort);
+2 -1
tests/test-qobject-output-visitor.c
··· 445 445 static void test_visitor_out_null(TestOutputVisitorData *data, 446 446 const void *unused) 447 447 { 448 + QNull *null = NULL; 448 449 QDict *qdict; 449 450 QObject *nil; 450 451 451 452 visit_start_struct(data->ov, NULL, NULL, 0, &error_abort); 452 - visit_type_null(data->ov, "a", &error_abort); 453 + visit_type_null(data->ov, "a", &null, &error_abort); 453 454 visit_check_struct(data->ov, &error_abort); 454 455 visit_end_struct(data->ov, NULL); 455 456 qdict = qobject_to_qdict(visitor_get(data));