4 static int nb_module_init
;
5 static void (*module_initfn
[100])(void);
7 void register_module_init(void (*fn
)(void), module_init_type type
)
9 int i
= nb_module_init
++;
10 module_initfn
[i
] = fn
;
12 typedef struct TestPlug
20 #define TYPE_TEST_PLUG "test-plug"
21 #define TEST_PLUG(obj) TYPE_CHECK(TestPlug, obj, TYPE_TEST_PLUG)
23 static void test_plug_initialize(TestPlug
*obj
, const char *id
)
25 type_initialize(obj
, TYPE_TEST_PLUG
, id
);
28 static int64_t test_plug_get_x(Plug
*obj
)
30 TestPlug
*tp
= TEST_PLUG(obj
);
35 static void test_plug_set_x(Plug
*obj
, int64_t value
)
37 TestPlug
*tp
= TEST_PLUG(obj
);
41 static void test_plug_initfn(TypeInstance
*obj
)
43 TestPlug
*tp
= TEST_PLUG(obj
);
46 snprintf(name
, sizeof(name
), "%s::child", obj
->id
);
47 plug_initialize(&tp
->child
, name
);
50 plug_add_property_int(PLUG(tp
), "x", test_plug_get_x
, test_plug_set_x
, PROP_F_READWRITE
);
51 plug_add_property_plug(PLUG(tp
), "child", &tp
->child
, TYPE_PLUG
);
52 plug_add_property_socket(PLUG(tp
), "slot", &tp
->slot
, TYPE_PLUG
, PROP_F_READWRITE
| PROP_F_MASKABLE
);
55 static const TypeInfo test_plug_type_info
= {
56 .name
= TYPE_TEST_PLUG
,
58 .instance_size
= sizeof(TestPlug
),
59 .instance_init
= test_plug_initfn
,
62 static void register_devices(void)
64 type_register_static(&test_plug_type_info
);
67 device_init(register_devices
);
69 //////////////////////////////
71 typedef struct StringInputVisitor
77 static void string_input_visitor_int(Visitor
*v
, int64_t *obj
, const char *name
, Error
**errp
)
79 StringInputVisitor
*sv
= container_of(v
, StringInputVisitor
, parent
);
80 *obj
= atoi(sv
->value
);
83 static void string_input_visitor_str(Visitor
*v
, char **obj
, const char *name
, Error
**errp
)
85 StringInputVisitor
*sv
= container_of(v
, StringInputVisitor
, parent
);
86 *obj
= qemu_strdup(sv
->value
);
89 static void string_input_visitor_init(StringInputVisitor
*sv
, const char *value
)
91 memset(sv
, 0, sizeof(*sv
));
92 sv
->parent
.type_int
= string_input_visitor_int
;
93 sv
->parent
.type_str
= string_input_visitor_str
;
97 typedef struct StringOutputVisitor
101 } StringOutputVisitor
;
103 static void string_output_visitor_int(Visitor
*v
, int64_t *obj
, const char *name
, Error
**errp
)
105 StringOutputVisitor
*sv
= container_of(v
, StringOutputVisitor
, parent
);
106 snprintf(sv
->value
, sizeof(sv
->value
), "%" PRId64
, *obj
);
109 static void string_output_visitor_str(Visitor
*v
, char **obj
, const char *name
, Error
**errp
)
111 StringOutputVisitor
*sv
= container_of(v
, StringOutputVisitor
, parent
);
113 snprintf(sv
->value
, sizeof(sv
->value
), "%s", *obj
);
116 static void string_output_visitor_init(StringOutputVisitor
*sv
)
118 memset(sv
, 0, sizeof(*sv
));
119 sv
->parent
.type_int
= string_output_visitor_int
;
120 sv
->parent
.type_str
= string_output_visitor_str
;
123 static void print_props(Plug
*plug
, const char *name
, const char *typename
, int flags
, void *opaque
)
125 StringOutputVisitor sov
;
127 string_output_visitor_init(&sov
);
128 plug_get_property(plug
, name
, &sov
.parent
, NULL
);
129 printf("`%s.%s' is a `%s' and has a value of `%s', %s\n", plug_get_id(plug
), name
, typename
, sov
.value
,
130 ((flags
& PROP_F_READWRITE
) == PROP_F_READWRITE
) ? "rw" : "ro"); // FIXME
133 int main(int argc
, char **argv
)
137 StringInputVisitor siv
;
138 StringOutputVisitor sov
;
140 for (i
= 0; i
< nb_module_init
; i
++) {
144 string_input_visitor_init(&siv
, "82");
145 string_output_visitor_init(&sov
);
147 test_plug_initialize(&tp
, "tp");
149 printf("x - %" PRId64
"\n", test_plug_get_x(PLUG(&tp
)));
150 plug_set_property(PLUG(&tp
), "x", &siv
.parent
, NULL
);
152 printf("x - %" PRId64
"\n", test_plug_get_x(PLUG(&tp
)));
154 plug_get_property(PLUG(&tp
), "child", &sov
.parent
, NULL
);
155 printf("child - %s\n", sov
.value
);
157 plug_get_property(PLUG(&tp
), "slot", &sov
.parent
, NULL
);
158 printf("slot - %s\n", sov
.value
);
160 string_input_visitor_init(&siv
, "tp::child");
161 plug_set_property(PLUG(&tp
), "slot", &siv
.parent
, NULL
);
163 plug_get_property(PLUG(&tp
), "slot", &sov
.parent
, NULL
);
164 printf("slot - %s\n", sov
.value
);
166 printf("tp::child - %p\n", &tp
.child
);
167 printf("tp.slot - %p\n", tp
.slot
);
169 plug_foreach_property(PLUG(&tp
), print_props
, NULL
);
171 assert(&tp
.child
== tp
.slot
);