This part is very specific and doesn't quite fit into the "coding style" section, so let's move it to its own page. Signed-off-by: Andrea Bolognani <abologna@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
7.3 KiB
Adoption of GLib APIs
Libvirt has adopted use of the GLib library. Due to libvirt's long history of development, there are many APIs in libvirt, for which GLib provides an alternative solution. The general rule to follow is that the standard GLib solution will be preferred over historical libvirt APIs. Existing code will be ported over to use GLib APIs over time, but new code should use the GLib APIs straight away where possible.
The following is a list of libvirt APIs that should no longer be used in new code, and their suggested GLib replacements:
VIR_ALLOC
,VIR_REALLOC
,VIR_RESIZE_N
,VIR_EXPAND_N
,VIR_SHRINK_N
,VIR_FREE
,VIR_APPEND_ELEMENT
,VIR_INSERT_ELEMENT
,VIR_DELETE_ELEMENT
Prefer the GLib APIs
g_new0
/g_renew
/g_free
in most cases. There should rarely be a need to useg_malloc
/g_realloc
. Instead of using plain C arrays, it is preferrable to use one of the GLib types,GArray
,GPtrArray
orGByteArray
. These all use a struct to track the array memory and size together and efficiently resize. NEVER MIX use of the classic libvirt memory allocation APIs and GLib APIs within a single method. Keep the style consistent, converting existing code to GLib style in a separate, prior commit.virStrerror
The GLib
g_strerror()
function should be used instead, which has a simpler calling convention as an added benefit.
The following libvirt APIs have been deleted already:
VIR_AUTOPTR
,VIR_AUTOCLEAN
,VIR_AUTOFREE
The GLib macros
g_autoptr
,g_auto
andg_autofree
must be used instead in all new code. In existing code, the GLib macros must never be mixed with libvirt macros within a method, nor should they be mixed withVIR_FREE
. If introducing GLib macros to an existing method, any use of libvirt macros must be converted in an independent commit.VIR_DEFINE_AUTOPTR_FUNC
,VIR_DEFINE_AUTOCLEAN_FUNC
The GLib macros
G_DEFINE_AUTOPTR_CLEANUP_FUNC
andG_DEFINE_AUTO_CLEANUP_CLEAR_FUNC
must be used in all new code. Existing code should be converted to the new macros where relevant. It is permissible to useg_autoptr
,g_auto
on an object whose cleanup function is declared with the libvirt macros and vice-versa.VIR_AUTOUNREF
The GLib macros
g_autoptr
andG_DEFINE_AUTOPTR_CLEANUP_FUNC
should be used to manage autoclean of virObject classes. This matches usage with GObject classes.VIR_STRDUP
,VIR_STRNDUP
Prefer the GLib APIs
g_strdup
andg_strndup
.
deleted version | GLib version | Notes |
---|---|---|
VIR_AUTOPTR |
g_autoptr |
|
VIR_AUTOCLEAN |
g_auto |
|
VIR_AUTOFREE |
g_autofree |
The GLib version does not use parentheses |
VIR_AUTOUNREF |
g_autoptr |
The cleanup function needs to be defined |
VIR_DEFINE_AUTOPTR_FUNC |
G_DEFINE_AUTOPTR_CLEANUP_FUNC |
|
VIR_DEFINE_AUTOCLEAN_FUNC |
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC |
|
VIR_STEAL_PTR |
g_steal_pointer |
a = f(&b) instead of f(a, b) |
VIR_RETURN_PTR |
return g_steal_pointer |
|
ARRAY_CARDINALITY |
G_N_ELEMENTS |
|
ATTRIBUTE_FALLTHROUGH |
G_GNUC_FALLTHROUGH |
|
ATTRIBUTE_FMT_PRINTF |
G_GNUC_PRINTF |
|
ATTRIBUTE_NOINLINE |
G_GNUC_NO_INLINE |
|
ATTRIBUTE_NORETURN |
G_GNUC_NORETURN |
|
ATTRIBUTE_RETURN_CHECK |
G_GNUC_WARN_UNUSED_RESULT |
|
ATTRIBUTE_SENTINEL |
G_GNUC_NULL_TERMINATED |
|
ATTRIBUTE_UNUSED |
G_GNUC_UNUSED |
|
VIR_STRDUP |
g_strdup |
|
VIR_STRNDUP |
g_strndup |
|
virStrerror |
g_strerror |