qom.rst (12263B)
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 90In case the ObjectClass implementation can be built as module a 91module_obj() line must be added to make sure qemu loads the module 92when the object is needed. 93 94.. code-block:: c 95 96 module_obj(TYPE_MY_DEVICE); 97 98Class Initialization 99==================== 100 101Before an object is initialized, the class for the object must be 102initialized. There is only one class object for all instance objects 103that is created lazily. 104 105Classes are initialized by first initializing any parent classes (if 106necessary). After the parent class object has initialized, it will be 107copied into the current class object and any additional storage in the 108class object is zero filled. 109 110The effect of this is that classes automatically inherit any virtual 111function pointers that the parent class has already initialized. All 112other fields will be zero filled. 113 114Once all of the parent classes have been initialized, #TypeInfo::class_init 115is called to let the class being instantiated provide default initialize for 116its virtual functions. Here is how the above example might be modified 117to introduce an overridden virtual function: 118 119.. code-block:: c 120 :caption: Overriding a virtual function 121 122 #include "qdev.h" 123 124 void my_device_class_init(ObjectClass *klass, void *class_data) 125 { 126 DeviceClass *dc = DEVICE_CLASS(klass); 127 dc->reset = my_device_reset; 128 } 129 130 static const TypeInfo my_device_info = { 131 .name = TYPE_MY_DEVICE, 132 .parent = TYPE_DEVICE, 133 .instance_size = sizeof(MyDevice), 134 .class_init = my_device_class_init, 135 }; 136 137Introducing new virtual methods requires a class to define its own 138struct and to add a .class_size member to the #TypeInfo. Each method 139will also have a wrapper function to call it easily: 140 141.. code-block:: c 142 :caption: Defining an abstract class 143 144 #include "qdev.h" 145 146 typedef struct MyDeviceClass 147 { 148 DeviceClass parent; 149 150 void (*frobnicate) (MyDevice *obj); 151 } MyDeviceClass; 152 153 static const TypeInfo my_device_info = { 154 .name = TYPE_MY_DEVICE, 155 .parent = TYPE_DEVICE, 156 .instance_size = sizeof(MyDevice), 157 .abstract = true, // or set a default in my_device_class_init 158 .class_size = sizeof(MyDeviceClass), 159 }; 160 161 void my_device_frobnicate(MyDevice *obj) 162 { 163 MyDeviceClass *klass = MY_DEVICE_GET_CLASS(obj); 164 165 klass->frobnicate(obj); 166 } 167 168Interfaces 169========== 170 171Interfaces allow a limited form of multiple inheritance. Instances are 172similar to normal types except for the fact that are only defined by 173their classes and never carry any state. As a consequence, a pointer to 174an interface instance should always be of incomplete type in order to be 175sure it cannot be dereferenced. That is, you should define the 176'typedef struct SomethingIf SomethingIf' so that you can pass around 177``SomethingIf *si`` arguments, but not define a ``struct SomethingIf { ... }``. 178The only things you can validly do with a ``SomethingIf *`` are to pass it as 179an argument to a method on its corresponding SomethingIfClass, or to 180dynamically cast it to an object that implements the interface. 181 182Methods 183======= 184 185A *method* is a function within the namespace scope of 186a class. It usually operates on the object instance by passing it as a 187strongly-typed first argument. 188If it does not operate on an object instance, it is dubbed 189*class method*. 190 191Methods cannot be overloaded. That is, the #ObjectClass and method name 192uniquely identity the function to be called; the signature does not vary 193except for trailing varargs. 194 195Methods are always *virtual*. Overriding a method in 196#TypeInfo.class_init of a subclass leads to any user of the class obtained 197via OBJECT_GET_CLASS() accessing the overridden function. 198The original function is not automatically invoked. It is the responsibility 199of the overriding class to determine whether and when to invoke the method 200being overridden. 201 202To invoke the method being overridden, the preferred solution is to store 203the original value in the overriding class before overriding the method. 204This corresponds to ``{super,base}.method(...)`` in Java and C# 205respectively; this frees the overriding class from hardcoding its parent 206class, which someone might choose to change at some point. 207 208.. code-block:: c 209 :caption: Overriding a virtual method 210 211 typedef struct MyState MyState; 212 213 typedef void (*MyDoSomething)(MyState *obj); 214 215 typedef struct MyClass { 216 ObjectClass parent_class; 217 218 MyDoSomething do_something; 219 } MyClass; 220 221 static void my_do_something(MyState *obj) 222 { 223 // do something 224 } 225 226 static void my_class_init(ObjectClass *oc, void *data) 227 { 228 MyClass *mc = MY_CLASS(oc); 229 230 mc->do_something = my_do_something; 231 } 232 233 static const TypeInfo my_type_info = { 234 .name = TYPE_MY, 235 .parent = TYPE_OBJECT, 236 .instance_size = sizeof(MyState), 237 .class_size = sizeof(MyClass), 238 .class_init = my_class_init, 239 }; 240 241 typedef struct DerivedClass { 242 MyClass parent_class; 243 244 MyDoSomething parent_do_something; 245 } DerivedClass; 246 247 static void derived_do_something(MyState *obj) 248 { 249 DerivedClass *dc = DERIVED_GET_CLASS(obj); 250 251 // do something here 252 dc->parent_do_something(obj); 253 // do something else here 254 } 255 256 static void derived_class_init(ObjectClass *oc, void *data) 257 { 258 MyClass *mc = MY_CLASS(oc); 259 DerivedClass *dc = DERIVED_CLASS(oc); 260 261 dc->parent_do_something = mc->do_something; 262 mc->do_something = derived_do_something; 263 } 264 265 static const TypeInfo derived_type_info = { 266 .name = TYPE_DERIVED, 267 .parent = TYPE_MY, 268 .class_size = sizeof(DerivedClass), 269 .class_init = derived_class_init, 270 }; 271 272Alternatively, object_class_by_name() can be used to obtain the class and 273its non-overridden methods for a specific type. This would correspond to 274``MyClass::method(...)`` in C++. 275 276The first example of such a QOM method was #CPUClass.reset, 277another example is #DeviceClass.realize. 278 279Standard type declaration and definition macros 280=============================================== 281 282A lot of the code outlined above follows a standard pattern and naming 283convention. To reduce the amount of boilerplate code that needs to be 284written for a new type there are two sets of macros to generate the 285common parts in a standard format. 286 287A type is declared using the OBJECT_DECLARE macro family. In types 288which do not require any virtual functions in the class, the 289OBJECT_DECLARE_SIMPLE_TYPE macro is suitable, and is commonly placed 290in the header file: 291 292.. code-block:: c 293 :caption: Declaring a simple type 294 295 OBJECT_DECLARE_SIMPLE_TYPE(MyDevice, my_device, 296 MY_DEVICE, DEVICE) 297 298This is equivalent to the following: 299 300.. code-block:: c 301 :caption: Expansion from declaring a simple type 302 303 typedef struct MyDevice MyDevice; 304 typedef struct MyDeviceClass MyDeviceClass; 305 306 G_DEFINE_AUTOPTR_CLEANUP_FUNC(MyDeviceClass, object_unref) 307 308 #define MY_DEVICE_GET_CLASS(void *obj) \ 309 OBJECT_GET_CLASS(MyDeviceClass, obj, TYPE_MY_DEVICE) 310 #define MY_DEVICE_CLASS(void *klass) \ 311 OBJECT_CLASS_CHECK(MyDeviceClass, klass, TYPE_MY_DEVICE) 312 #define MY_DEVICE(void *obj) 313 OBJECT_CHECK(MyDevice, obj, TYPE_MY_DEVICE) 314 315 struct MyDeviceClass { 316 DeviceClass parent_class; 317 }; 318 319The 'struct MyDevice' needs to be declared separately. 320If the type requires virtual functions to be declared in the class 321struct, then the alternative OBJECT_DECLARE_TYPE() macro can be 322used. This does the same as OBJECT_DECLARE_SIMPLE_TYPE(), but without 323the 'struct MyDeviceClass' definition. 324 325To implement the type, the OBJECT_DEFINE macro family is available. 326In the simple case the OBJECT_DEFINE_TYPE macro is suitable: 327 328.. code-block:: c 329 :caption: Defining a simple type 330 331 OBJECT_DEFINE_TYPE(MyDevice, my_device, MY_DEVICE, DEVICE) 332 333This is equivalent to the following: 334 335.. code-block:: c 336 :caption: Expansion from defining a simple type 337 338 static void my_device_finalize(Object *obj); 339 static void my_device_class_init(ObjectClass *oc, void *data); 340 static void my_device_init(Object *obj); 341 342 static const TypeInfo my_device_info = { 343 .parent = TYPE_DEVICE, 344 .name = TYPE_MY_DEVICE, 345 .instance_size = sizeof(MyDevice), 346 .instance_init = my_device_init, 347 .instance_finalize = my_device_finalize, 348 .class_size = sizeof(MyDeviceClass), 349 .class_init = my_device_class_init, 350 }; 351 352 static void 353 my_device_register_types(void) 354 { 355 type_register_static(&my_device_info); 356 } 357 type_init(my_device_register_types); 358 359This is sufficient to get the type registered with the type 360system, and the three standard methods now need to be implemented 361along with any other logic required for the type. 362 363If the type needs to implement one or more interfaces, then the 364OBJECT_DEFINE_TYPE_WITH_INTERFACES() macro can be used instead. 365This accepts an array of interface type names. 366 367.. code-block:: c 368 :caption: Defining a simple type implementing interfaces 369 370 OBJECT_DEFINE_TYPE_WITH_INTERFACES(MyDevice, my_device, 371 MY_DEVICE, DEVICE, 372 { TYPE_USER_CREATABLE }, 373 { NULL }) 374 375If the type is not intended to be instantiated, then then 376the OBJECT_DEFINE_ABSTRACT_TYPE() macro can be used instead: 377 378.. code-block:: c 379 :caption: Defining a simple abstract type 380 381 OBJECT_DEFINE_ABSTRACT_TYPE(MyDevice, my_device, 382 MY_DEVICE, DEVICE) 383 384 385 386API Reference 387------------- 388 389.. kernel-doc:: include/qom/object.h