]> git.proxmox.com Git - mirror_qemu.git/blame - docs/devel/qom.rst
docs/devel/qom: Fix indentation of bulleted list
[mirror_qemu.git] / docs / devel / qom.rst
CommitLineData
cd442a45
EH
1===========================
2The QEMU Object Model (QOM)
3===========================
4
9cb54b18
PB
5.. highlight:: c
6
7The QEMU Object Model provides a framework for registering user creatable
8types and instantiating objects from those types. QOM provides the following
9features:
10
258c7327
EH
11- System for dynamically registering types
12- Support for single-inheritance of types
13- Multiple inheritance of stateless interfaces
9cb54b18
PB
14
15.. code-block:: c
16 :caption: Creating a minimal type
17
18 #include "qdev.h"
19
20 #define TYPE_MY_DEVICE "my-device"
21
22 // No new virtual functions: we can reuse the typedef for the
23 // superclass.
24 typedef DeviceClass MyDeviceClass;
25 typedef struct MyDevice
26 {
27 DeviceState parent;
28
29 int reg0, reg1, reg2;
30 } MyDevice;
31
32 static const TypeInfo my_device_info = {
33 .name = TYPE_MY_DEVICE,
34 .parent = TYPE_DEVICE,
35 .instance_size = sizeof(MyDevice),
36 };
37
38 static void my_device_register_types(void)
39 {
40 type_register_static(&my_device_info);
41 }
42
43 type_init(my_device_register_types)
44
45In the above example, we create a simple type that is described by #TypeInfo.
46#TypeInfo describes information about the type including what it inherits
47from, the instance and class size, and constructor/destructor hooks.
48
49Alternatively several static types could be registered using helper macro
50DEFINE_TYPES()
51
52.. code-block:: c
53
54 static const TypeInfo device_types_info[] = {
55 {
56 .name = TYPE_MY_DEVICE_A,
57 .parent = TYPE_DEVICE,
58 .instance_size = sizeof(MyDeviceA),
59 },
60 {
61 .name = TYPE_MY_DEVICE_B,
62 .parent = TYPE_DEVICE,
63 .instance_size = sizeof(MyDeviceB),
64 },
65 };
66
67 DEFINE_TYPES(device_types_info)
68
69Every type has an #ObjectClass associated with it. #ObjectClass derivatives
70are instantiated dynamically but there is only ever one instance for any
71given type. The #ObjectClass typically holds a table of function pointers
72for the virtual methods implemented by this type.
73
74Using object_new(), a new #Object derivative will be instantiated. You can
75cast an #Object to a subclass (or base-class) type using
76object_dynamic_cast(). You typically want to define macro wrappers around
77OBJECT_CHECK() and OBJECT_CLASS_CHECK() to make it easier to convert to a
78specific type:
79
80.. code-block:: c
81 :caption: Typecasting macros
82
83 #define MY_DEVICE_GET_CLASS(obj) \
84 OBJECT_GET_CLASS(MyDeviceClass, obj, TYPE_MY_DEVICE)
85 #define MY_DEVICE_CLASS(klass) \
86 OBJECT_CLASS_CHECK(MyDeviceClass, klass, TYPE_MY_DEVICE)
87 #define MY_DEVICE(obj) \
88 OBJECT_CHECK(MyDevice, obj, TYPE_MY_DEVICE)
89
90Class Initialization
91====================
92
93Before an object is initialized, the class for the object must be
94initialized. There is only one class object for all instance objects
95that is created lazily.
96
97Classes are initialized by first initializing any parent classes (if
98necessary). After the parent class object has initialized, it will be
99copied into the current class object and any additional storage in the
100class object is zero filled.
101
102The effect of this is that classes automatically inherit any virtual
103function pointers that the parent class has already initialized. All
104other fields will be zero filled.
105
106Once all of the parent classes have been initialized, #TypeInfo::class_init
107is called to let the class being instantiated provide default initialize for
108its virtual functions. Here is how the above example might be modified
109to introduce an overridden virtual function:
110
111.. code-block:: c
112 :caption: Overriding a virtual function
113
114 #include "qdev.h"
115
116 void my_device_class_init(ObjectClass *klass, void *class_data)
117 {
118 DeviceClass *dc = DEVICE_CLASS(klass);
119 dc->reset = my_device_reset;
120 }
121
122 static const TypeInfo my_device_info = {
123 .name = TYPE_MY_DEVICE,
124 .parent = TYPE_DEVICE,
125 .instance_size = sizeof(MyDevice),
126 .class_init = my_device_class_init,
127 };
128
129Introducing new virtual methods requires a class to define its own
130struct and to add a .class_size member to the #TypeInfo. Each method
131will also have a wrapper function to call it easily:
132
133.. code-block:: c
134 :caption: Defining an abstract class
135
136 #include "qdev.h"
137
138 typedef struct MyDeviceClass
139 {
140 DeviceClass parent;
141
142 void (*frobnicate) (MyDevice *obj);
143 } MyDeviceClass;
144
145 static const TypeInfo my_device_info = {
146 .name = TYPE_MY_DEVICE,
147 .parent = TYPE_DEVICE,
148 .instance_size = sizeof(MyDevice),
149 .abstract = true, // or set a default in my_device_class_init
150 .class_size = sizeof(MyDeviceClass),
151 };
152
153 void my_device_frobnicate(MyDevice *obj)
154 {
155 MyDeviceClass *klass = MY_DEVICE_GET_CLASS(obj);
156
157 klass->frobnicate(obj);
158 }
159
160Interfaces
161==========
162
163Interfaces allow a limited form of multiple inheritance. Instances are
164similar to normal types except for the fact that are only defined by
165their classes and never carry any state. As a consequence, a pointer to
166an interface instance should always be of incomplete type in order to be
167sure it cannot be dereferenced. That is, you should define the
168'typedef struct SomethingIf SomethingIf' so that you can pass around
169``SomethingIf *si`` arguments, but not define a ``struct SomethingIf { ... }``.
170The only things you can validly do with a ``SomethingIf *`` are to pass it as
171an argument to a method on its corresponding SomethingIfClass, or to
172dynamically cast it to an object that implements the interface.
173
174Methods
175=======
176
177A <emphasis>method</emphasis> is a function within the namespace scope of
178a class. It usually operates on the object instance by passing it as a
179strongly-typed first argument.
180If it does not operate on an object instance, it is dubbed
181<emphasis>class method</emphasis>.
182
183Methods cannot be overloaded. That is, the #ObjectClass and method name
184uniquely identity the function to be called; the signature does not vary
185except for trailing varargs.
186
187Methods are always <emphasis>virtual</emphasis>. Overriding a method in
188#TypeInfo.class_init of a subclass leads to any user of the class obtained
189via OBJECT_GET_CLASS() accessing the overridden function.
190The original function is not automatically invoked. It is the responsibility
191of the overriding class to determine whether and when to invoke the method
192being overridden.
193
194To invoke the method being overridden, the preferred solution is to store
195the original value in the overriding class before overriding the method.
196This corresponds to ``{super,base}.method(...)`` in Java and C#
197respectively; this frees the overriding class from hardcoding its parent
198class, which someone might choose to change at some point.
199
200.. code-block:: c
201 :caption: Overriding a virtual method
202
203 typedef struct MyState MyState;
204
205 typedef void (*MyDoSomething)(MyState *obj);
206
207 typedef struct MyClass {
208 ObjectClass parent_class;
209
210 MyDoSomething do_something;
211 } MyClass;
212
213 static void my_do_something(MyState *obj)
214 {
215 // do something
216 }
217
218 static void my_class_init(ObjectClass *oc, void *data)
219 {
220 MyClass *mc = MY_CLASS(oc);
221
222 mc->do_something = my_do_something;
223 }
224
225 static const TypeInfo my_type_info = {
226 .name = TYPE_MY,
227 .parent = TYPE_OBJECT,
228 .instance_size = sizeof(MyState),
229 .class_size = sizeof(MyClass),
230 .class_init = my_class_init,
231 };
232
233 typedef struct DerivedClass {
234 MyClass parent_class;
235
236 MyDoSomething parent_do_something;
237 } DerivedClass;
238
239 static void derived_do_something(MyState *obj)
240 {
241 DerivedClass *dc = DERIVED_GET_CLASS(obj);
242
243 // do something here
244 dc->parent_do_something(obj);
245 // do something else here
246 }
247
248 static void derived_class_init(ObjectClass *oc, void *data)
249 {
250 MyClass *mc = MY_CLASS(oc);
251 DerivedClass *dc = DERIVED_CLASS(oc);
252
253 dc->parent_do_something = mc->do_something;
254 mc->do_something = derived_do_something;
255 }
256
257 static const TypeInfo derived_type_info = {
258 .name = TYPE_DERIVED,
259 .parent = TYPE_MY,
260 .class_size = sizeof(DerivedClass),
261 .class_init = derived_class_init,
262 };
263
264Alternatively, object_class_by_name() can be used to obtain the class and
265its non-overridden methods for a specific type. This would correspond to
266``MyClass::method(...)`` in C++.
267
268The first example of such a QOM method was #CPUClass.reset,
269another example is #DeviceClass.realize.
270
271Standard type declaration and definition macros
272===============================================
273
274A lot of the code outlined above follows a standard pattern and naming
275convention. To reduce the amount of boilerplate code that needs to be
276written for a new type there are two sets of macros to generate the
277common parts in a standard format.
278
279A type is declared using the OBJECT_DECLARE macro family. In types
280which do not require any virtual functions in the class, the
281OBJECT_DECLARE_SIMPLE_TYPE macro is suitable, and is commonly placed
282in the header file:
283
284.. code-block:: c
285 :caption: Declaring a simple type
286
287 OBJECT_DECLARE_SIMPLE_TYPE(MyDevice, my_device, MY_DEVICE, DEVICE)
288
289This is equivalent to the following:
290
291.. code-block:: c
292 :caption: Expansion from declaring a simple type
293
294 typedef struct MyDevice MyDevice;
295 typedef struct MyDeviceClass MyDeviceClass;
296
297 G_DEFINE_AUTOPTR_CLEANUP_FUNC(MyDeviceClass, object_unref)
298
299 #define MY_DEVICE_GET_CLASS(void *obj) \
300 OBJECT_GET_CLASS(MyDeviceClass, obj, TYPE_MY_DEVICE)
301 #define MY_DEVICE_CLASS(void *klass) \
302 OBJECT_CLASS_CHECK(MyDeviceClass, klass, TYPE_MY_DEVICE)
303 #define MY_DEVICE(void *obj)
304 OBJECT_CHECK(MyDevice, obj, TYPE_MY_DEVICE)
305
306 struct MyDeviceClass {
307 DeviceClass parent_class;
308 };
309
310The 'struct MyDevice' needs to be declared separately.
311If the type requires virtual functions to be declared in the class
312struct, then the alternative OBJECT_DECLARE_TYPE() macro can be
313used. This does the same as OBJECT_DECLARE_SIMPLE_TYPE(), but without
314the 'struct MyDeviceClass' definition.
315
316To implement the type, the OBJECT_DEFINE macro family is available.
317In the simple case the OBJECT_DEFINE_TYPE macro is suitable:
318
319.. code-block:: c
320 :caption: Defining a simple type
321
322 OBJECT_DEFINE_TYPE(MyDevice, my_device, MY_DEVICE, DEVICE)
323
324This is equivalent to the following:
325
326.. code-block:: c
327 :caption: Expansion from defining a simple type
328
329 static void my_device_finalize(Object *obj);
330 static void my_device_class_init(ObjectClass *oc, void *data);
331 static void my_device_init(Object *obj);
332
333 static const TypeInfo my_device_info = {
334 .parent = TYPE_DEVICE,
335 .name = TYPE_MY_DEVICE,
336 .instance_size = sizeof(MyDevice),
337 .instance_init = my_device_init,
338 .instance_finalize = my_device_finalize,
339 .class_size = sizeof(MyDeviceClass),
340 .class_init = my_device_class_init,
341 };
342
343 static void
344 my_device_register_types(void)
345 {
346 type_register_static(&my_device_info);
347 }
348 type_init(my_device_register_types);
349
350This is sufficient to get the type registered with the type
351system, and the three standard methods now need to be implemented
352along with any other logic required for the type.
353
354If the type needs to implement one or more interfaces, then the
355OBJECT_DEFINE_TYPE_WITH_INTERFACES() macro can be used instead.
356This accepts an array of interface type names.
357
358.. code-block:: c
359 :caption: Defining a simple type implementing interfaces
360
361 OBJECT_DEFINE_TYPE_WITH_INTERFACES(MyDevice, my_device,
362 MY_DEVICE, DEVICE,
363 { TYPE_USER_CREATABLE }, { NULL })
364
365If the type is not intended to be instantiated, then then
366the OBJECT_DEFINE_ABSTRACT_TYPE() macro can be used instead:
367
368.. code-block:: c
369 :caption: Defining a simple abstract type
370
371 OBJECT_DEFINE_ABSTRACT_TYPE(MyDevice, my_device, MY_DEVICE, DEVICE)
372
373
374
375API Reference
376-------------
377
cd442a45 378.. kernel-doc:: include/qom/object.h