Types

The GType API is the foundation of the GObject system. It provides the facilities for registering and managing all fundamental data types, user-defined object and interface types.

For type creation and registration purposes, all types fall into one of two categories: static or dynamic. Static types are never loaded or unloaded at run-time as dynamic types may be. Static types are created with g_type_register_static() that gets type specific information passed in via a GTypeInfo structure.

Dynamic types are created with g_type_register_dynamic(), which takes a GTypePlugin structure instead. The remaining type information (the GTypeInfo structure) is retrieved during runtime through GTypePlugin and the g_type_plugin_*() API.

These registration functions are usually called only once from a function whose only purpose is to return the type identifier for a specific class. Once the type (or class or interface) is registered, it may be instantiated, inherited, or implemented depending on exactly what sort of type it is.

There is also a third registration function for registering fundamental types called g_type_register_fundamental(), which requires both a GTypeInfo structure and a GTypeFundamentalInfo structure, but it is rarely used since most fundamental types are predefined rather than user-defined.

Type instance and class structs are limited to a total of 64 KiB, including all parent types. Similarly, type instances’ private data (as created by G_ADD_PRIVATE()) are limited to a total of 64 KiB. If a type instance needs a large static buffer, allocate it separately (typically by using GArray or GPtrArray) and put a pointer to the buffer in the structure.

As mentioned in the GType conventions, type names must be at least three characters long. There is no upper length limit. The first character must be a letter (a–z or A–Z) or an underscore (‘_’). Subsequent characters can be letters, numbers or any of ‘-_+’.

Runtime Debugging

When G_ENABLE_DEBUG is defined during compilation, the GObject library supports an environment variable GOBJECT_DEBUG that can be set to a combination of flags to trigger debugging messages about object bookkeeping and signal emissions during runtime.

The currently supported flags are:

  • objects: Tracks all GObject instances in a global hash table called debug_objects_ht, and prints the still-alive objects on exit.
  • instance-count: Tracks the number of instances of every GType and makes it available via the g_type_get_instance_count() function.
  • signals: Currently unused.