1=========================== 2The QEMU Object Model (QOM) 3=========================== 4 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 11 - System for dynamically registering types 12 - Support for single-inheritance of types 13 - Multiple inheritance of stateless interfaces 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 378.. kernel-doc:: include/qom/object.h 379