mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-15 14:57:15 +01:00
Add g_type_ensure() and use it rather than playing games with volatile
https://bugzilla.gnome.org/show_bug.cgi?id=605976
This commit is contained in:
parent
2a4235d0f3
commit
e011d2c921
@ -98,6 +98,7 @@ g_type_add_interface_check
|
|||||||
g_type_remove_interface_check
|
g_type_remove_interface_check
|
||||||
GTypeInterfaceCheckFunc
|
GTypeInterfaceCheckFunc
|
||||||
g_type_value_table_peek
|
g_type_value_table_peek
|
||||||
|
g_type_ensure
|
||||||
|
|
||||||
G_DEFINE_TYPE
|
G_DEFINE_TYPE
|
||||||
G_DEFINE_TYPE_WITH_CODE
|
G_DEFINE_TYPE_WITH_CODE
|
||||||
|
10
gio/gicon.c
10
gio/gicon.c
@ -375,12 +375,10 @@ g_icon_new_from_tokens (char **tokens,
|
|||||||
static void
|
static void
|
||||||
ensure_builtin_icon_types (void)
|
ensure_builtin_icon_types (void)
|
||||||
{
|
{
|
||||||
static volatile GType t;
|
g_type_ensure (G_TYPE_THEMED_ICON);
|
||||||
t = g_themed_icon_get_type ();
|
g_type_ensure (G_TYPE_FILE_ICON);
|
||||||
t = g_file_icon_get_type ();
|
g_type_ensure (G_TYPE_EMBLEMED_ICON);
|
||||||
t = g_emblemed_icon_get_type ();
|
g_type_ensure (G_TYPE_EMBLEM);
|
||||||
t = g_emblem_get_type ();
|
|
||||||
(t); /* To avoid -Wunused-but-set-variable */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -401,7 +401,6 @@ g_inet_address_init (GInetAddress *address)
|
|||||||
GInetAddress *
|
GInetAddress *
|
||||||
g_inet_address_new_from_string (const gchar *string)
|
g_inet_address_new_from_string (const gchar *string)
|
||||||
{
|
{
|
||||||
volatile GType type;
|
|
||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
struct sockaddr_storage sa;
|
struct sockaddr_storage sa;
|
||||||
struct sockaddr_in *sin = (struct sockaddr_in *)&sa;
|
struct sockaddr_in *sin = (struct sockaddr_in *)&sa;
|
||||||
@ -413,8 +412,7 @@ g_inet_address_new_from_string (const gchar *string)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Make sure _g_networking_init() has been called */
|
/* Make sure _g_networking_init() has been called */
|
||||||
type = g_inet_address_get_type ();
|
g_type_ensure (G_TYPE_INET_ADDRESS);
|
||||||
(type); /* To avoid -Wunused-but-set-variable */
|
|
||||||
|
|
||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
memset (&sa, 0, sizeof (sa));
|
memset (&sa, 0, sizeof (sa));
|
||||||
|
@ -909,39 +909,39 @@ _g_io_modules_ensure_loaded (void)
|
|||||||
g_io_module_scope_free (scope);
|
g_io_module_scope_free (scope);
|
||||||
|
|
||||||
/* Initialize types from built-in "modules" */
|
/* Initialize types from built-in "modules" */
|
||||||
g_null_settings_backend_get_type ();
|
g_type_ensure (g_null_settings_backend_get_type ());
|
||||||
g_memory_settings_backend_get_type ();
|
g_type_ensure (g_memory_settings_backend_get_type ());
|
||||||
#if defined(HAVE_SYS_INOTIFY_H) || defined(HAVE_LINUX_INOTIFY_H)
|
#if defined(HAVE_SYS_INOTIFY_H) || defined(HAVE_LINUX_INOTIFY_H)
|
||||||
_g_inotify_directory_monitor_get_type ();
|
g_type_ensure (_g_inotify_directory_monitor_get_type ());
|
||||||
_g_inotify_file_monitor_get_type ();
|
g_type_ensure (_g_inotify_file_monitor_get_type ());
|
||||||
#endif
|
#endif
|
||||||
#if defined(HAVE_FEN)
|
#if defined(HAVE_FEN)
|
||||||
_g_fen_directory_monitor_get_type ();
|
g_type_ensure (_g_fen_directory_monitor_get_type ());
|
||||||
_g_fen_file_monitor_get_type ();
|
g_type_ensure (_g_fen_file_monitor_get_type ());
|
||||||
#endif
|
#endif
|
||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
_g_win32_volume_monitor_get_type ();
|
g_type_ensure (_g_win32_volume_monitor_get_type ());
|
||||||
g_win32_directory_monitor_get_type ();
|
g_type_ensure (g_win32_directory_monitor_get_type ());
|
||||||
g_registry_backend_get_type ();
|
g_type_ensure (g_registry_backend_get_type ());
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_CARBON
|
#ifdef HAVE_CARBON
|
||||||
g_nextstep_settings_backend_get_type ();
|
g_nextstep_settings_backend_get_type ();
|
||||||
#endif
|
#endif
|
||||||
#ifdef G_OS_UNIX
|
#ifdef G_OS_UNIX
|
||||||
_g_unix_volume_monitor_get_type ();
|
g_type_ensure (_g_unix_volume_monitor_get_type ());
|
||||||
#endif
|
#endif
|
||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
_g_winhttp_vfs_get_type ();
|
g_type_ensure (_g_winhttp_vfs_get_type ());
|
||||||
#endif
|
#endif
|
||||||
_g_local_vfs_get_type ();
|
g_type_ensure (_g_local_vfs_get_type ());
|
||||||
_g_dummy_proxy_resolver_get_type ();
|
g_type_ensure (_g_dummy_proxy_resolver_get_type ());
|
||||||
_g_socks4a_proxy_get_type ();
|
g_type_ensure (_g_socks4a_proxy_get_type ());
|
||||||
_g_socks4_proxy_get_type ();
|
g_type_ensure (_g_socks4_proxy_get_type ());
|
||||||
_g_socks5_proxy_get_type ();
|
g_type_ensure (_g_socks5_proxy_get_type ());
|
||||||
_g_dummy_tls_backend_get_type ();
|
g_type_ensure (_g_dummy_tls_backend_get_type ());
|
||||||
g_network_monitor_base_get_type ();
|
g_type_ensure (g_network_monitor_base_get_type ());
|
||||||
#ifdef HAVE_NETLINK
|
#ifdef HAVE_NETLINK
|
||||||
_g_network_monitor_netlink_get_type ();
|
g_type_ensure (_g_network_monitor_netlink_get_type ());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,8 +146,6 @@ g_resolver_real_lookup_service_finish (GResolver *resolver,
|
|||||||
static void
|
static void
|
||||||
g_resolver_class_init (GResolverClass *resolver_class)
|
g_resolver_class_init (GResolverClass *resolver_class)
|
||||||
{
|
{
|
||||||
volatile GType type;
|
|
||||||
|
|
||||||
/* Automatically pass these over to the lookup_records methods */
|
/* Automatically pass these over to the lookup_records methods */
|
||||||
resolver_class->lookup_service = g_resolver_real_lookup_service;
|
resolver_class->lookup_service = g_resolver_real_lookup_service;
|
||||||
resolver_class->lookup_service_async = g_resolver_real_lookup_service_async;
|
resolver_class->lookup_service_async = g_resolver_real_lookup_service_async;
|
||||||
@ -156,8 +154,7 @@ g_resolver_class_init (GResolverClass *resolver_class)
|
|||||||
g_type_class_add_private (resolver_class, sizeof (GResolverPrivate));
|
g_type_class_add_private (resolver_class, sizeof (GResolverPrivate));
|
||||||
|
|
||||||
/* Make sure _g_networking_init() has been called */
|
/* Make sure _g_networking_init() has been called */
|
||||||
type = g_inet_address_get_type ();
|
g_type_ensure (G_TYPE_INET_ADDRESS);
|
||||||
(type); /* To avoid -Wunused-but-set-variable */
|
|
||||||
|
|
||||||
/* Initialize _g_resolver_addrinfo_hints */
|
/* Initialize _g_resolver_addrinfo_hints */
|
||||||
#ifdef AI_ADDRCONFIG
|
#ifdef AI_ADDRCONFIG
|
||||||
|
@ -742,11 +742,9 @@ static void
|
|||||||
g_socket_class_init (GSocketClass *klass)
|
g_socket_class_init (GSocketClass *klass)
|
||||||
{
|
{
|
||||||
GObjectClass *gobject_class G_GNUC_UNUSED = G_OBJECT_CLASS (klass);
|
GObjectClass *gobject_class G_GNUC_UNUSED = G_OBJECT_CLASS (klass);
|
||||||
volatile GType type;
|
|
||||||
|
|
||||||
/* Make sure winsock has been initialized */
|
/* Make sure winsock has been initialized */
|
||||||
type = g_inet_address_get_type ();
|
g_type_ensure (G_TYPE_INET_ADDRESS);
|
||||||
(type); /* To avoid -Wunused-but-set-variable */
|
|
||||||
|
|
||||||
#ifdef SIGPIPE
|
#ifdef SIGPIPE
|
||||||
/* There is no portable, thread-safe way to avoid having the process
|
/* There is no portable, thread-safe way to avoid having the process
|
||||||
|
@ -602,12 +602,10 @@ g_socket_connection_factory_register_type (GType g_type,
|
|||||||
static void
|
static void
|
||||||
init_builtin_types (void)
|
init_builtin_types (void)
|
||||||
{
|
{
|
||||||
volatile GType a_type;
|
|
||||||
#ifndef G_OS_WIN32
|
#ifndef G_OS_WIN32
|
||||||
a_type = g_unix_connection_get_type ();
|
g_type_ensure (G_TYPE_UNIX_CONNECTION);
|
||||||
#endif
|
#endif
|
||||||
a_type = g_tcp_connection_get_type ();
|
g_type_ensure (G_TYPE_TCP_CONNECTION);
|
||||||
(a_type); /* To avoid -Wunused-but-set-variable */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -177,15 +177,11 @@ g_socket_control_message_deserialize (int level,
|
|||||||
GType *message_types;
|
GType *message_types;
|
||||||
guint n_message_types;
|
guint n_message_types;
|
||||||
int i;
|
int i;
|
||||||
#ifndef G_OS_WIN32
|
|
||||||
volatile GType a_type;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Ensure we know about the built in types */
|
/* Ensure we know about the built in types */
|
||||||
#ifndef G_OS_WIN32
|
#ifndef G_OS_WIN32
|
||||||
a_type = g_unix_credentials_message_get_type ();
|
g_type_ensure (G_TYPE_UNIX_CREDENTIALS_MESSAGE);
|
||||||
a_type = g_unix_fd_message_get_type ();
|
g_type_ensure (G_TYPE_UNIX_FD_MESSAGE);
|
||||||
(a_type); /* To avoid -Wunused-but-set-variable */
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
message_types = g_type_children (G_TYPE_SOCKET_CONTROL_MESSAGE, &n_message_types);
|
message_types = g_type_children (G_TYPE_SOCKET_CONTROL_MESSAGE, &n_message_types);
|
||||||
|
@ -473,7 +473,6 @@ g_unix_connection_receive_credentials (GUnixConnection *connection,
|
|||||||
gint nscm;
|
gint nscm;
|
||||||
GSocket *socket;
|
GSocket *socket;
|
||||||
gint n;
|
gint n;
|
||||||
volatile GType credentials_message_gtype;
|
|
||||||
gssize num_bytes_read;
|
gssize num_bytes_read;
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
gboolean turn_off_so_passcreds;
|
gboolean turn_off_so_passcreds;
|
||||||
@ -543,9 +542,7 @@ g_unix_connection_receive_credentials (GUnixConnection *connection,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ensure the type of GUnixCredentialsMessage has been registered with the type system */
|
g_type_ensure (G_TYPE_UNIX_CREDENTIALS_MESSAGE);
|
||||||
credentials_message_gtype = G_TYPE_UNIX_CREDENTIALS_MESSAGE;
|
|
||||||
(credentials_message_gtype); /* To avoid -Wunused-but-set-variable */
|
|
||||||
num_bytes_read = g_socket_receive_message (socket,
|
num_bytes_read = g_socket_receive_message (socket,
|
||||||
NULL, /* GSocketAddress **address */
|
NULL, /* GSocketAddress **address */
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -336,6 +336,7 @@ g_type_default_interface_peek
|
|||||||
g_type_default_interface_ref
|
g_type_default_interface_ref
|
||||||
g_type_default_interface_unref
|
g_type_default_interface_unref
|
||||||
g_type_depth
|
g_type_depth
|
||||||
|
g_type_ensure
|
||||||
g_type_free_instance
|
g_type_free_instance
|
||||||
g_type_from_name
|
g_type_from_name
|
||||||
g_type_fundamental
|
g_type_fundamental
|
||||||
|
@ -4275,7 +4275,7 @@ g_type_init_with_debug_flags (GTypeDebugFlags debug_flags)
|
|||||||
const gchar *env_string;
|
const gchar *env_string;
|
||||||
GTypeInfo info;
|
GTypeInfo info;
|
||||||
TypeNode *node;
|
TypeNode *node;
|
||||||
volatile GType votype;
|
GType type;
|
||||||
|
|
||||||
G_LOCK (type_init_lock);
|
G_LOCK (type_init_lock);
|
||||||
|
|
||||||
@ -4316,16 +4316,16 @@ g_type_init_with_debug_flags (GTypeDebugFlags debug_flags)
|
|||||||
/* void type G_TYPE_NONE
|
/* void type G_TYPE_NONE
|
||||||
*/
|
*/
|
||||||
node = type_node_fundamental_new_W (G_TYPE_NONE, g_intern_static_string ("void"), 0);
|
node = type_node_fundamental_new_W (G_TYPE_NONE, g_intern_static_string ("void"), 0);
|
||||||
votype = NODE_TYPE (node);
|
type = NODE_TYPE (node);
|
||||||
g_assert (votype == G_TYPE_NONE);
|
g_assert (type == G_TYPE_NONE);
|
||||||
|
|
||||||
/* interface fundamental type G_TYPE_INTERFACE (!classed)
|
/* interface fundamental type G_TYPE_INTERFACE (!classed)
|
||||||
*/
|
*/
|
||||||
memset (&info, 0, sizeof (info));
|
memset (&info, 0, sizeof (info));
|
||||||
node = type_node_fundamental_new_W (G_TYPE_INTERFACE, g_intern_static_string ("GInterface"), G_TYPE_FLAG_DERIVABLE);
|
node = type_node_fundamental_new_W (G_TYPE_INTERFACE, g_intern_static_string ("GInterface"), G_TYPE_FLAG_DERIVABLE);
|
||||||
votype = NODE_TYPE (node);
|
type = NODE_TYPE (node);
|
||||||
type_data_make_W (node, &info, NULL);
|
type_data_make_W (node, &info, NULL);
|
||||||
g_assert (votype == G_TYPE_INTERFACE);
|
g_assert (type == G_TYPE_INTERFACE);
|
||||||
|
|
||||||
G_WRITE_UNLOCK (&type_rw_lock);
|
G_WRITE_UNLOCK (&type_rw_lock);
|
||||||
|
|
||||||
@ -4333,7 +4333,7 @@ g_type_init_with_debug_flags (GTypeDebugFlags debug_flags)
|
|||||||
|
|
||||||
/* G_TYPE_TYPE_PLUGIN
|
/* G_TYPE_TYPE_PLUGIN
|
||||||
*/
|
*/
|
||||||
votype = g_type_plugin_get_type ();
|
g_type_ensure (g_type_plugin_get_type ());
|
||||||
|
|
||||||
/* G_TYPE_* value types
|
/* G_TYPE_* value types
|
||||||
*/
|
*/
|
||||||
@ -4653,3 +4653,34 @@ g_type_class_get_private (GTypeClass *klass,
|
|||||||
|
|
||||||
return G_STRUCT_MEMBER_P (klass, offset);
|
return G_STRUCT_MEMBER_P (klass, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_type_ensure:
|
||||||
|
* @type: a #GType.
|
||||||
|
*
|
||||||
|
* Ensures that the indicated @type has been registered with the
|
||||||
|
* type system, and its _class_init() method has been run.
|
||||||
|
*
|
||||||
|
* In theory, simply calling the type's _get_type() method (or using
|
||||||
|
* the corresponding macro) is supposed take care of this. However,
|
||||||
|
* _get_type() methods are often marked %G_GNUC_CONST for performance
|
||||||
|
* reasons, even though this is technically incorrect (since
|
||||||
|
* %G_GNUC_CONST requires that the function not have side effects,
|
||||||
|
* which _get_type() methods do on the first call). As a result, if
|
||||||
|
* you write a bare call to a _get_type() macro, it may get optimized
|
||||||
|
* out by the compiler. Using g_type_ensure() guarantees that the
|
||||||
|
* type's _get_type() method is called.
|
||||||
|
*
|
||||||
|
* Since: 2.34
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
g_type_ensure (GType type)
|
||||||
|
{
|
||||||
|
/* In theory, @type has already been resolved and so there's nothing
|
||||||
|
* to do here. But this protects us in the case where the function
|
||||||
|
* gets inlined (as it might in g_type_init_with_debug_flags()
|
||||||
|
* above).
|
||||||
|
*/
|
||||||
|
if (G_UNLIKELY (type == (GType)-1))
|
||||||
|
g_error ("can't happen");
|
||||||
|
}
|
||||||
|
@ -1258,6 +1258,8 @@ void g_type_add_class_private (GType class_type,
|
|||||||
gpointer g_type_class_get_private (GTypeClass *klass,
|
gpointer g_type_class_get_private (GTypeClass *klass,
|
||||||
GType private_type);
|
GType private_type);
|
||||||
|
|
||||||
|
GLIB_AVAILABLE_IN_2_34
|
||||||
|
void g_type_ensure (GType type);
|
||||||
|
|
||||||
/* --- GType boilerplate --- */
|
/* --- GType boilerplate --- */
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user