mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-08-20 07:38:54 +02:00
Merge branch '600-drop-volatile' into 'master'
Drop use of volatile Closes #600 See merge request GNOME/glib!1719
This commit is contained in:
@@ -480,9 +480,9 @@ A C source template file will typically look like this:
|
|||||||
GType
|
GType
|
||||||
@enum_name@_get_type (void)
|
@enum_name@_get_type (void)
|
||||||
{
|
{
|
||||||
static volatile gsize g_@type@_type_id__volatile;
|
static gsize static_g_@type@_type_id;
|
||||||
|
|
||||||
if (g_once_init_enter (&g_define_type_id__volatile))
|
if (g_once_init_enter (&static_g_@type@_type_id))
|
||||||
{
|
{
|
||||||
static const G@Type@Value values[] = {
|
static const G@Type@Value values[] = {
|
||||||
/*** END value-header ***/
|
/*** END value-header ***/
|
||||||
@@ -498,9 +498,9 @@ GType
|
|||||||
GType g_@type@_type_id =
|
GType g_@type@_type_id =
|
||||||
g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
|
g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
|
||||||
|
|
||||||
g_once_init_leave (&g_@type@_type_id__volatile, g_@type@_type_id);
|
g_once_init_leave (&static_g_@type@_type_id, g_@type@_type_id);
|
||||||
}
|
}
|
||||||
return g_@type@_type_id__volatile;
|
return static_g_@type@_type_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*** END value-tail ***/
|
/*** END value-tail ***/
|
||||||
|
@@ -852,7 +852,7 @@ viewer_editable_default_init (ViewerEditableInterface *iface)
|
|||||||
GType
|
GType
|
||||||
viewer_editable_get_type (void)
|
viewer_editable_get_type (void)
|
||||||
{
|
{
|
||||||
static volatile gsize type_id = 0;
|
static gsize type_id = 0;
|
||||||
if (g_once_init_enter (&type_id)) {
|
if (g_once_init_enter (&type_id)) {
|
||||||
const GTypeInfo info = {
|
const GTypeInfo info = {
|
||||||
sizeof (ViewerEditableInterface),
|
sizeof (ViewerEditableInterface),
|
||||||
|
@@ -393,7 +393,7 @@ struct _GDBusConnection
|
|||||||
* FLAG_CLOSED is the closed property. It may be read at any time, but
|
* FLAG_CLOSED is the closed property. It may be read at any time, but
|
||||||
* may only be written while holding @lock.
|
* may only be written while holding @lock.
|
||||||
*/
|
*/
|
||||||
volatile gint atomic_flags;
|
gint atomic_flags; /* (atomic) */
|
||||||
|
|
||||||
/* If the connection could not be established during initable_init(),
|
/* If the connection could not be established during initable_init(),
|
||||||
* this GError will be set.
|
* this GError will be set.
|
||||||
@@ -1596,7 +1596,7 @@ static gboolean
|
|||||||
g_dbus_connection_send_message_unlocked (GDBusConnection *connection,
|
g_dbus_connection_send_message_unlocked (GDBusConnection *connection,
|
||||||
GDBusMessage *message,
|
GDBusMessage *message,
|
||||||
GDBusSendMessageFlags flags,
|
GDBusSendMessageFlags flags,
|
||||||
volatile guint32 *out_serial,
|
guint32 *out_serial,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
guchar *blob;
|
guchar *blob;
|
||||||
@@ -1708,7 +1708,9 @@ g_dbus_connection_send_message_unlocked (GDBusConnection *connection,
|
|||||||
* will be assigned by @connection and set on @message via
|
* will be assigned by @connection and set on @message via
|
||||||
* g_dbus_message_set_serial(). If @out_serial is not %NULL, then the
|
* g_dbus_message_set_serial(). If @out_serial is not %NULL, then the
|
||||||
* serial number used will be written to this location prior to
|
* serial number used will be written to this location prior to
|
||||||
* submitting the message to the underlying transport.
|
* submitting the message to the underlying transport. While it has a `volatile`
|
||||||
|
* qualifier, this is a historical artifact and the argument passed to it should
|
||||||
|
* not be `volatile`.
|
||||||
*
|
*
|
||||||
* If @connection is closed then the operation will fail with
|
* If @connection is closed then the operation will fail with
|
||||||
* %G_IO_ERROR_CLOSED. If @message is not well-formed,
|
* %G_IO_ERROR_CLOSED. If @message is not well-formed,
|
||||||
@@ -1741,7 +1743,7 @@ g_dbus_connection_send_message (GDBusConnection *connection,
|
|||||||
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
||||||
|
|
||||||
CONNECTION_LOCK (connection);
|
CONNECTION_LOCK (connection);
|
||||||
ret = g_dbus_connection_send_message_unlocked (connection, message, flags, out_serial, error);
|
ret = g_dbus_connection_send_message_unlocked (connection, message, flags, (guint32 *) out_serial, error);
|
||||||
CONNECTION_UNLOCK (connection);
|
CONNECTION_UNLOCK (connection);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -1901,7 +1903,7 @@ g_dbus_connection_send_message_with_reply_unlocked (GDBusConnection *connect
|
|||||||
GDBusMessage *message,
|
GDBusMessage *message,
|
||||||
GDBusSendMessageFlags flags,
|
GDBusSendMessageFlags flags,
|
||||||
gint timeout_msec,
|
gint timeout_msec,
|
||||||
volatile guint32 *out_serial,
|
guint32 *out_serial,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GAsyncReadyCallback callback,
|
GAsyncReadyCallback callback,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
@@ -1909,7 +1911,7 @@ g_dbus_connection_send_message_with_reply_unlocked (GDBusConnection *connect
|
|||||||
GTask *task;
|
GTask *task;
|
||||||
SendMessageData *data;
|
SendMessageData *data;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
volatile guint32 serial;
|
guint32 serial;
|
||||||
|
|
||||||
if (out_serial == NULL)
|
if (out_serial == NULL)
|
||||||
out_serial = &serial;
|
out_serial = &serial;
|
||||||
@@ -1979,7 +1981,9 @@ g_dbus_connection_send_message_with_reply_unlocked (GDBusConnection *connect
|
|||||||
* will be assigned by @connection and set on @message via
|
* will be assigned by @connection and set on @message via
|
||||||
* g_dbus_message_set_serial(). If @out_serial is not %NULL, then the
|
* g_dbus_message_set_serial(). If @out_serial is not %NULL, then the
|
||||||
* serial number used will be written to this location prior to
|
* serial number used will be written to this location prior to
|
||||||
* submitting the message to the underlying transport.
|
* submitting the message to the underlying transport. While it has a `volatile`
|
||||||
|
* qualifier, this is a historical artifact and the argument passed to it should
|
||||||
|
* not be `volatile`.
|
||||||
*
|
*
|
||||||
* If @connection is closed then the operation will fail with
|
* If @connection is closed then the operation will fail with
|
||||||
* %G_IO_ERROR_CLOSED. If @cancellable is canceled, the operation will
|
* %G_IO_ERROR_CLOSED. If @cancellable is canceled, the operation will
|
||||||
@@ -2022,7 +2026,7 @@ g_dbus_connection_send_message_with_reply (GDBusConnection *connection,
|
|||||||
message,
|
message,
|
||||||
flags,
|
flags,
|
||||||
timeout_msec,
|
timeout_msec,
|
||||||
out_serial,
|
(guint32 *) out_serial,
|
||||||
cancellable,
|
cancellable,
|
||||||
callback,
|
callback,
|
||||||
user_data);
|
user_data);
|
||||||
@@ -2105,7 +2109,9 @@ send_message_with_reply_sync_cb (GDBusConnection *connection,
|
|||||||
* will be assigned by @connection and set on @message via
|
* will be assigned by @connection and set on @message via
|
||||||
* g_dbus_message_set_serial(). If @out_serial is not %NULL, then the
|
* g_dbus_message_set_serial(). If @out_serial is not %NULL, then the
|
||||||
* serial number used will be written to this location prior to
|
* serial number used will be written to this location prior to
|
||||||
* submitting the message to the underlying transport.
|
* submitting the message to the underlying transport. While it has a `volatile`
|
||||||
|
* qualifier, this is a historical artifact and the argument passed to it should
|
||||||
|
* not be `volatile`.
|
||||||
*
|
*
|
||||||
* If @connection is closed then the operation will fail with
|
* If @connection is closed then the operation will fail with
|
||||||
* %G_IO_ERROR_CLOSED. If @cancellable is canceled, the operation will
|
* %G_IO_ERROR_CLOSED. If @cancellable is canceled, the operation will
|
||||||
@@ -3082,7 +3088,7 @@ g_dbus_connection_get_peer_credentials (GDBusConnection *connection)
|
|||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static volatile guint _global_filter_id = 1;
|
static guint _global_filter_id = 1; /* (atomic) */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* g_dbus_connection_add_filter:
|
* g_dbus_connection_add_filter:
|
||||||
@@ -3327,9 +3333,9 @@ args_to_rule (const gchar *sender,
|
|||||||
return g_string_free (rule, FALSE);
|
return g_string_free (rule, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static volatile guint _global_subscriber_id = 1;
|
static guint _global_subscriber_id = 1; /* (atomic) */
|
||||||
static volatile guint _global_registration_id = 1;
|
static guint _global_registration_id = 1; /* (atomic) */
|
||||||
static volatile guint _global_subtree_registration_id = 1;
|
static guint _global_subtree_registration_id = 1; /* (atomic) */
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
@@ -5992,7 +5998,7 @@ g_dbus_connection_call_sync_internal (GDBusConnection *connection,
|
|||||||
message,
|
message,
|
||||||
send_flags,
|
send_flags,
|
||||||
timeout_msec,
|
timeout_msec,
|
||||||
NULL, /* volatile guint32 *out_serial */
|
NULL, /* guint32 *out_serial */
|
||||||
cancellable,
|
cancellable,
|
||||||
&local_error);
|
&local_error);
|
||||||
|
|
||||||
|
@@ -84,12 +84,12 @@
|
|||||||
* GQuark
|
* GQuark
|
||||||
* foo_bar_error_quark (void)
|
* foo_bar_error_quark (void)
|
||||||
* {
|
* {
|
||||||
* static volatile gsize quark_volatile = 0;
|
* static gsize quark = 0;
|
||||||
* g_dbus_error_register_error_domain ("foo-bar-error-quark",
|
* g_dbus_error_register_error_domain ("foo-bar-error-quark",
|
||||||
* &quark_volatile,
|
* &quark,
|
||||||
* foo_bar_error_entries,
|
* foo_bar_error_entries,
|
||||||
* G_N_ELEMENTS (foo_bar_error_entries));
|
* G_N_ELEMENTS (foo_bar_error_entries));
|
||||||
* return (GQuark) quark_volatile;
|
* return (GQuark) quark;
|
||||||
* }
|
* }
|
||||||
* ]|
|
* ]|
|
||||||
* With this setup, a D-Bus peer can transparently pass e.g. %FOO_BAR_ERROR_ANOTHER_ERROR and
|
* With this setup, a D-Bus peer can transparently pass e.g. %FOO_BAR_ERROR_ANOTHER_ERROR and
|
||||||
@@ -160,12 +160,12 @@ GQuark
|
|||||||
g_dbus_error_quark (void)
|
g_dbus_error_quark (void)
|
||||||
{
|
{
|
||||||
G_STATIC_ASSERT (G_N_ELEMENTS (g_dbus_error_entries) - 1 == G_DBUS_ERROR_PROPERTY_READ_ONLY);
|
G_STATIC_ASSERT (G_N_ELEMENTS (g_dbus_error_entries) - 1 == G_DBUS_ERROR_PROPERTY_READ_ONLY);
|
||||||
static volatile gsize quark_volatile = 0;
|
static gsize quark = 0;
|
||||||
g_dbus_error_register_error_domain ("g-dbus-error-quark",
|
g_dbus_error_register_error_domain ("g-dbus-error-quark",
|
||||||
&quark_volatile,
|
&quark,
|
||||||
g_dbus_error_entries,
|
g_dbus_error_entries,
|
||||||
G_N_ELEMENTS (g_dbus_error_entries));
|
G_N_ELEMENTS (g_dbus_error_entries));
|
||||||
return (GQuark) quark_volatile;
|
return (GQuark) quark;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -177,6 +177,9 @@ g_dbus_error_quark (void)
|
|||||||
*
|
*
|
||||||
* Helper function for associating a #GError error domain with D-Bus error names.
|
* Helper function for associating a #GError error domain with D-Bus error names.
|
||||||
*
|
*
|
||||||
|
* While @quark_volatile has a `volatile` qualifier, this is a historical
|
||||||
|
* artifact and the argument passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Since: 2.26
|
* Since: 2.26
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
@@ -185,25 +188,31 @@ g_dbus_error_register_error_domain (const gchar *error_domain_quark_na
|
|||||||
const GDBusErrorEntry *entries,
|
const GDBusErrorEntry *entries,
|
||||||
guint num_entries)
|
guint num_entries)
|
||||||
{
|
{
|
||||||
|
gsize *quark;
|
||||||
|
|
||||||
g_return_if_fail (error_domain_quark_name != NULL);
|
g_return_if_fail (error_domain_quark_name != NULL);
|
||||||
g_return_if_fail (quark_volatile != NULL);
|
g_return_if_fail (quark_volatile != NULL);
|
||||||
g_return_if_fail (entries != NULL);
|
g_return_if_fail (entries != NULL);
|
||||||
g_return_if_fail (num_entries > 0);
|
g_return_if_fail (num_entries > 0);
|
||||||
|
|
||||||
if (g_once_init_enter (quark_volatile))
|
/* Drop the volatile qualifier, which should never have been on the argument
|
||||||
|
* in the first place. */
|
||||||
|
quark = (gsize *) quark_volatile;
|
||||||
|
|
||||||
|
if (g_once_init_enter (quark))
|
||||||
{
|
{
|
||||||
guint n;
|
guint n;
|
||||||
GQuark quark;
|
GQuark new_quark;
|
||||||
|
|
||||||
quark = g_quark_from_static_string (error_domain_quark_name);
|
new_quark = g_quark_from_static_string (error_domain_quark_name);
|
||||||
|
|
||||||
for (n = 0; n < num_entries; n++)
|
for (n = 0; n < num_entries; n++)
|
||||||
{
|
{
|
||||||
g_warn_if_fail (g_dbus_error_register_error (quark,
|
g_warn_if_fail (g_dbus_error_register_error (new_quark,
|
||||||
entries[n].error_code,
|
entries[n].error_code,
|
||||||
entries[n].dbus_error_name));
|
entries[n].dbus_error_name));
|
||||||
}
|
}
|
||||||
g_once_init_leave (quark_volatile, quark);
|
g_once_init_leave (quark, new_quark);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -458,7 +458,7 @@ dbus_interface_interface_init (GDBusInterfaceIface *iface)
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
GDBusInterfaceSkeleton *interface;
|
GDBusInterfaceSkeleton *interface;
|
||||||
GDBusInterfaceMethodCallFunc method_call_func;
|
GDBusInterfaceMethodCallFunc method_call_func;
|
||||||
GDBusMethodInvocation *invocation;
|
GDBusMethodInvocation *invocation;
|
||||||
|
@@ -43,7 +43,7 @@ G_BEGIN_DECLS
|
|||||||
struct _GDBusAnnotationInfo
|
struct _GDBusAnnotationInfo
|
||||||
{
|
{
|
||||||
/*< public >*/
|
/*< public >*/
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
gchar *key;
|
gchar *key;
|
||||||
gchar *value;
|
gchar *value;
|
||||||
GDBusAnnotationInfo **annotations;
|
GDBusAnnotationInfo **annotations;
|
||||||
@@ -63,7 +63,7 @@ struct _GDBusAnnotationInfo
|
|||||||
struct _GDBusArgInfo
|
struct _GDBusArgInfo
|
||||||
{
|
{
|
||||||
/*< public >*/
|
/*< public >*/
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
gchar *name;
|
gchar *name;
|
||||||
gchar *signature;
|
gchar *signature;
|
||||||
GDBusAnnotationInfo **annotations;
|
GDBusAnnotationInfo **annotations;
|
||||||
@@ -84,7 +84,7 @@ struct _GDBusArgInfo
|
|||||||
struct _GDBusMethodInfo
|
struct _GDBusMethodInfo
|
||||||
{
|
{
|
||||||
/*< public >*/
|
/*< public >*/
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
gchar *name;
|
gchar *name;
|
||||||
GDBusArgInfo **in_args;
|
GDBusArgInfo **in_args;
|
||||||
GDBusArgInfo **out_args;
|
GDBusArgInfo **out_args;
|
||||||
@@ -105,7 +105,7 @@ struct _GDBusMethodInfo
|
|||||||
struct _GDBusSignalInfo
|
struct _GDBusSignalInfo
|
||||||
{
|
{
|
||||||
/*< public >*/
|
/*< public >*/
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
gchar *name;
|
gchar *name;
|
||||||
GDBusArgInfo **args;
|
GDBusArgInfo **args;
|
||||||
GDBusAnnotationInfo **annotations;
|
GDBusAnnotationInfo **annotations;
|
||||||
@@ -126,7 +126,7 @@ struct _GDBusSignalInfo
|
|||||||
struct _GDBusPropertyInfo
|
struct _GDBusPropertyInfo
|
||||||
{
|
{
|
||||||
/*< public >*/
|
/*< public >*/
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
gchar *name;
|
gchar *name;
|
||||||
gchar *signature;
|
gchar *signature;
|
||||||
GDBusPropertyInfoFlags flags;
|
GDBusPropertyInfoFlags flags;
|
||||||
@@ -149,7 +149,7 @@ struct _GDBusPropertyInfo
|
|||||||
struct _GDBusInterfaceInfo
|
struct _GDBusInterfaceInfo
|
||||||
{
|
{
|
||||||
/*< public >*/
|
/*< public >*/
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
gchar *name;
|
gchar *name;
|
||||||
GDBusMethodInfo **methods;
|
GDBusMethodInfo **methods;
|
||||||
GDBusSignalInfo **signals;
|
GDBusSignalInfo **signals;
|
||||||
@@ -172,7 +172,7 @@ struct _GDBusInterfaceInfo
|
|||||||
struct _GDBusNodeInfo
|
struct _GDBusNodeInfo
|
||||||
{
|
{
|
||||||
/*< public >*/
|
/*< public >*/
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
gchar *path;
|
gchar *path;
|
||||||
GDBusInterfaceInfo **interfaces;
|
GDBusInterfaceInfo **interfaces;
|
||||||
GDBusNodeInfo **nodes;
|
GDBusNodeInfo **nodes;
|
||||||
|
@@ -55,7 +55,7 @@ typedef enum
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
guint id;
|
guint id;
|
||||||
GBusNameOwnerFlags flags;
|
GBusNameOwnerFlags flags;
|
||||||
gchar *name;
|
gchar *name;
|
||||||
@@ -73,7 +73,7 @@ typedef struct
|
|||||||
guint name_acquired_subscription_id;
|
guint name_acquired_subscription_id;
|
||||||
guint name_lost_subscription_id;
|
guint name_lost_subscription_id;
|
||||||
|
|
||||||
volatile gboolean cancelled; /* must hold lock when reading or modifying */
|
gboolean cancelled; /* must hold lock when reading or modifying */
|
||||||
|
|
||||||
gboolean needs_release;
|
gboolean needs_release;
|
||||||
} Client;
|
} Client;
|
||||||
|
@@ -56,7 +56,7 @@ typedef enum
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
guint id;
|
guint id;
|
||||||
gchar *name;
|
gchar *name;
|
||||||
GBusNameWatcherFlags flags;
|
GBusNameWatcherFlags flags;
|
||||||
@@ -78,7 +78,7 @@ typedef struct
|
|||||||
} Client;
|
} Client;
|
||||||
|
|
||||||
/* Must be accessed atomically. */
|
/* Must be accessed atomically. */
|
||||||
static volatile guint next_global_id = 1;
|
static guint next_global_id = 1; /* (atomic) */
|
||||||
|
|
||||||
/* Must be accessed with @lock held. */
|
/* Must be accessed with @lock held. */
|
||||||
static GHashTable *map_id_to_client = NULL;
|
static GHashTable *map_id_to_client = NULL;
|
||||||
|
@@ -265,7 +265,7 @@ ensure_required_types (void)
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
volatile gint refcount;
|
gint refcount; /* (atomic) */
|
||||||
GThread *thread;
|
GThread *thread;
|
||||||
GMainContext *context;
|
GMainContext *context;
|
||||||
GMainLoop *loop;
|
GMainLoop *loop;
|
||||||
@@ -341,12 +341,12 @@ typedef enum {
|
|||||||
|
|
||||||
struct GDBusWorker
|
struct GDBusWorker
|
||||||
{
|
{
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
|
|
||||||
SharedThreadData *shared_thread_data;
|
SharedThreadData *shared_thread_data;
|
||||||
|
|
||||||
/* really a boolean, but GLib 2.28 lacks atomic boolean ops */
|
/* really a boolean, but GLib 2.28 lacks atomic boolean ops */
|
||||||
volatile gint stopped;
|
gint stopped; /* (atomic) */
|
||||||
|
|
||||||
/* TODO: frozen (e.g. G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING) currently
|
/* TODO: frozen (e.g. G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING) currently
|
||||||
* only affects messages received from the other peer (since GDBusServer is the
|
* only affects messages received from the other peer (since GDBusServer is the
|
||||||
@@ -1941,15 +1941,14 @@ _g_dbus_debug_print_unlock (void)
|
|||||||
void
|
void
|
||||||
_g_dbus_initialize (void)
|
_g_dbus_initialize (void)
|
||||||
{
|
{
|
||||||
static volatile gsize initialized = 0;
|
static gsize initialized = 0;
|
||||||
|
|
||||||
if (g_once_init_enter (&initialized))
|
if (g_once_init_enter (&initialized))
|
||||||
{
|
{
|
||||||
volatile GQuark g_dbus_error_domain;
|
|
||||||
const gchar *debug;
|
const gchar *debug;
|
||||||
|
|
||||||
g_dbus_error_domain = G_DBUS_ERROR;
|
/* Ensure the domain is registered. */
|
||||||
(g_dbus_error_domain); /* To avoid -Wunused-but-set-variable */
|
g_dbus_error_quark ();
|
||||||
|
|
||||||
debug = g_getenv ("G_DBUS_DEBUG");
|
debug = g_getenv ("G_DBUS_DEBUG");
|
||||||
if (debug != NULL)
|
if (debug != NULL)
|
||||||
|
@@ -13,9 +13,9 @@
|
|||||||
GType
|
GType
|
||||||
@enum_name@_get_type (void)
|
@enum_name@_get_type (void)
|
||||||
{
|
{
|
||||||
static volatile gsize g_define_type_id__volatile = 0;
|
static gsize static_g_define_type_id = 0;
|
||||||
|
|
||||||
if (g_once_init_enter (&g_define_type_id__volatile))
|
if (g_once_init_enter (&static_g_define_type_id))
|
||||||
{
|
{
|
||||||
static const G@Type@Value values[] = {
|
static const G@Type@Value values[] = {
|
||||||
/*** END value-header ***/
|
/*** END value-header ***/
|
||||||
@@ -29,10 +29,10 @@ GType
|
|||||||
};
|
};
|
||||||
GType g_define_type_id =
|
GType g_define_type_id =
|
||||||
g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
|
g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
|
||||||
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
|
g_once_init_leave (&static_g_define_type_id, g_define_type_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_define_type_id__volatile;
|
return static_g_define_type_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*** END value-tail ***/
|
/*** END value-tail ***/
|
||||||
|
@@ -61,7 +61,7 @@ void
|
|||||||
g_networking_init (void)
|
g_networking_init (void)
|
||||||
{
|
{
|
||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
static volatile gsize inited = 0;
|
static gsize inited = 0;
|
||||||
|
|
||||||
if (g_once_init_enter (&inited))
|
if (g_once_init_enter (&inited))
|
||||||
{
|
{
|
||||||
|
@@ -1398,7 +1398,7 @@ register_lazy_static_resources (void)
|
|||||||
void
|
void
|
||||||
g_static_resource_init (GStaticResource *static_resource)
|
g_static_resource_init (GStaticResource *static_resource)
|
||||||
{
|
{
|
||||||
gpointer next;
|
GStaticResource *next;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
@@ -34,7 +34,7 @@ static gboolean km_debug_enabled = FALSE;
|
|||||||
static GSList *missing_subs_list = NULL;
|
static GSList *missing_subs_list = NULL;
|
||||||
G_LOCK_DEFINE_STATIC (missing_lock);
|
G_LOCK_DEFINE_STATIC (missing_lock);
|
||||||
|
|
||||||
static volatile gboolean scan_missing_running = FALSE;
|
static gboolean scan_missing_running = FALSE; /* must be accessed under @missing_lock */
|
||||||
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -62,7 +62,6 @@ _km_add_missing (kqueue_sub *sub)
|
|||||||
|
|
||||||
KM_W ("adding %s to missing list\n", sub->filename);
|
KM_W ("adding %s to missing list\n", sub->filename);
|
||||||
missing_subs_list = g_slist_prepend (missing_subs_list, sub);
|
missing_subs_list = g_slist_prepend (missing_subs_list, sub);
|
||||||
G_UNLOCK (missing_lock);
|
|
||||||
|
|
||||||
if (!scan_missing_running)
|
if (!scan_missing_running)
|
||||||
{
|
{
|
||||||
@@ -73,6 +72,8 @@ _km_add_missing (kqueue_sub *sub)
|
|||||||
g_source_attach (source, GLIB_PRIVATE_CALL (g_get_worker_context) ());
|
g_source_attach (source, GLIB_PRIVATE_CALL (g_get_worker_context) ());
|
||||||
g_source_unref (source);
|
g_source_unref (source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
G_UNLOCK (missing_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -221,7 +221,7 @@ test_internal_enhanced_stdio (void)
|
|||||||
guint64 size_p0, alsize_p0, size_ps, alsize_ps;
|
guint64 size_p0, alsize_p0, size_ps, alsize_ps;
|
||||||
const gchar *id_p0;
|
const gchar *id_p0;
|
||||||
const gchar *id_p1;
|
const gchar *id_p1;
|
||||||
volatile guint64 time_p0;
|
guint64 time_p0;
|
||||||
gchar *tmp_dir;
|
gchar *tmp_dir;
|
||||||
wchar_t *programdata_dir_w;
|
wchar_t *programdata_dir_w;
|
||||||
wchar_t *users_dir_w;
|
wchar_t *users_dir_w;
|
||||||
|
@@ -43,9 +43,9 @@ G_LOCK_DEFINE_STATIC (write);
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
GFilterOutputStream parent;
|
GFilterOutputStream parent;
|
||||||
|
|
||||||
volatile gint started;
|
gint started; /* (atomic) */
|
||||||
volatile gint finished;
|
gint finished; /* (atomic) */
|
||||||
volatile gint flushed;
|
gint flushed; /* (atomic) */
|
||||||
|
|
||||||
GOutputStream *real_output;
|
GOutputStream *real_output;
|
||||||
} MyOutputStream;
|
} MyOutputStream;
|
||||||
|
@@ -61,9 +61,9 @@ _log (const gchar *format, ...)
|
|||||||
static gboolean
|
static gboolean
|
||||||
test_connection_quit_mainloop (gpointer user_data)
|
test_connection_quit_mainloop (gpointer user_data)
|
||||||
{
|
{
|
||||||
volatile gboolean *quit_mainloop_fired = user_data;
|
gboolean *quit_mainloop_fired = user_data; /* (atomic) */
|
||||||
_log ("quit_mainloop_fired");
|
_log ("quit_mainloop_fired");
|
||||||
*quit_mainloop_fired = TRUE;
|
g_atomic_int_set (quit_mainloop_fired, TRUE);
|
||||||
g_main_loop_quit (loop);
|
g_main_loop_quit (loop);
|
||||||
return G_SOURCE_CONTINUE;
|
return G_SOURCE_CONTINUE;
|
||||||
}
|
}
|
||||||
@@ -113,8 +113,8 @@ on_name_owner_changed (GDBusConnection *connection,
|
|||||||
static void
|
static void
|
||||||
a_gdestroynotify_that_sets_a_gboolean_to_true_and_quits_loop (gpointer user_data)
|
a_gdestroynotify_that_sets_a_gboolean_to_true_and_quits_loop (gpointer user_data)
|
||||||
{
|
{
|
||||||
volatile gboolean *val = user_data;
|
gboolean *val = user_data; /* (atomic) */
|
||||||
*val = TRUE;
|
g_atomic_int_set (val, TRUE);
|
||||||
_log ("destroynotify fired for %p", val);
|
_log ("destroynotify fired for %p", val);
|
||||||
g_main_loop_quit (loop);
|
g_main_loop_quit (loop);
|
||||||
}
|
}
|
||||||
@@ -143,10 +143,10 @@ test_connection_life_cycle (void)
|
|||||||
GDBusConnection *c;
|
GDBusConnection *c;
|
||||||
GDBusConnection *c2;
|
GDBusConnection *c2;
|
||||||
GError *error;
|
GError *error;
|
||||||
volatile gboolean on_signal_registration_freed_called;
|
gboolean on_signal_registration_freed_called; /* (atomic) */
|
||||||
volatile gboolean on_filter_freed_called;
|
gboolean on_filter_freed_called; /* (atomic) */
|
||||||
volatile gboolean on_register_object_freed_called;
|
gboolean on_register_object_freed_called; /* (atomic) */
|
||||||
volatile gboolean quit_mainloop_fired;
|
gboolean quit_mainloop_fired; /* (atomic) */
|
||||||
guint quit_mainloop_id;
|
guint quit_mainloop_id;
|
||||||
guint registration_id;
|
guint registration_id;
|
||||||
|
|
||||||
@@ -208,7 +208,7 @@ test_connection_life_cycle (void)
|
|||||||
g_assert_no_error (error);
|
g_assert_no_error (error);
|
||||||
g_assert_nonnull (c2);
|
g_assert_nonnull (c2);
|
||||||
/* signal registration */
|
/* signal registration */
|
||||||
on_signal_registration_freed_called = FALSE;
|
g_atomic_int_set (&on_signal_registration_freed_called, FALSE);
|
||||||
g_dbus_connection_signal_subscribe (c2,
|
g_dbus_connection_signal_subscribe (c2,
|
||||||
"org.freedesktop.DBus", /* bus name */
|
"org.freedesktop.DBus", /* bus name */
|
||||||
"org.freedesktop.DBus", /* interface */
|
"org.freedesktop.DBus", /* interface */
|
||||||
@@ -220,13 +220,13 @@ test_connection_life_cycle (void)
|
|||||||
(gpointer) &on_signal_registration_freed_called,
|
(gpointer) &on_signal_registration_freed_called,
|
||||||
a_gdestroynotify_that_sets_a_gboolean_to_true_and_quits_loop);
|
a_gdestroynotify_that_sets_a_gboolean_to_true_and_quits_loop);
|
||||||
/* filter func */
|
/* filter func */
|
||||||
on_filter_freed_called = FALSE;
|
g_atomic_int_set (&on_filter_freed_called, FALSE);
|
||||||
g_dbus_connection_add_filter (c2,
|
g_dbus_connection_add_filter (c2,
|
||||||
some_filter_func,
|
some_filter_func,
|
||||||
(gpointer) &on_filter_freed_called,
|
(gpointer) &on_filter_freed_called,
|
||||||
a_gdestroynotify_that_sets_a_gboolean_to_true_and_quits_loop);
|
a_gdestroynotify_that_sets_a_gboolean_to_true_and_quits_loop);
|
||||||
/* object registration */
|
/* object registration */
|
||||||
on_register_object_freed_called = FALSE;
|
g_atomic_int_set (&on_register_object_freed_called, FALSE);
|
||||||
error = NULL;
|
error = NULL;
|
||||||
registration_id = g_dbus_connection_register_object (c2,
|
registration_id = g_dbus_connection_register_object (c2,
|
||||||
"/foo",
|
"/foo",
|
||||||
@@ -239,7 +239,7 @@ test_connection_life_cycle (void)
|
|||||||
g_assert_cmpuint (registration_id, >, 0);
|
g_assert_cmpuint (registration_id, >, 0);
|
||||||
/* ok, finalize the connection and check that all the GDestroyNotify functions are invoked as expected */
|
/* ok, finalize the connection and check that all the GDestroyNotify functions are invoked as expected */
|
||||||
g_object_unref (c2);
|
g_object_unref (c2);
|
||||||
quit_mainloop_fired = FALSE;
|
g_atomic_int_set (&quit_mainloop_fired, FALSE);
|
||||||
quit_mainloop_id = g_timeout_add (30000, test_connection_quit_mainloop, (gpointer) &quit_mainloop_fired);
|
quit_mainloop_id = g_timeout_add (30000, test_connection_quit_mainloop, (gpointer) &quit_mainloop_fired);
|
||||||
_log ("destroynotifies for\n"
|
_log ("destroynotifies for\n"
|
||||||
" register_object %p\n"
|
" register_object %p\n"
|
||||||
@@ -250,21 +250,21 @@ test_connection_life_cycle (void)
|
|||||||
&on_signal_registration_freed_called);
|
&on_signal_registration_freed_called);
|
||||||
while (TRUE)
|
while (TRUE)
|
||||||
{
|
{
|
||||||
if (on_signal_registration_freed_called &&
|
if (g_atomic_int_get (&on_signal_registration_freed_called) &&
|
||||||
on_filter_freed_called &&
|
g_atomic_int_get (&on_filter_freed_called) &&
|
||||||
on_register_object_freed_called)
|
g_atomic_int_get (&on_register_object_freed_called))
|
||||||
break;
|
break;
|
||||||
if (quit_mainloop_fired)
|
if (g_atomic_int_get (&quit_mainloop_fired))
|
||||||
break;
|
break;
|
||||||
_log ("entering loop");
|
_log ("entering loop");
|
||||||
g_main_loop_run (loop);
|
g_main_loop_run (loop);
|
||||||
_log ("exiting loop");
|
_log ("exiting loop");
|
||||||
}
|
}
|
||||||
g_source_remove (quit_mainloop_id);
|
g_source_remove (quit_mainloop_id);
|
||||||
g_assert_true (on_signal_registration_freed_called);
|
g_assert_true (g_atomic_int_get (&on_signal_registration_freed_called));
|
||||||
g_assert_true (on_filter_freed_called);
|
g_assert_true (g_atomic_int_get (&on_filter_freed_called));
|
||||||
g_assert_true (on_register_object_freed_called);
|
g_assert_true (g_atomic_int_get (&on_register_object_freed_called));
|
||||||
g_assert_false (quit_mainloop_fired);
|
g_assert_false (g_atomic_int_get (&quit_mainloop_fired));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check for correct behavior when the bus goes away
|
* Check for correct behavior when the bus goes away
|
||||||
|
@@ -86,8 +86,8 @@ overflow_filter_func (GDBusConnection *connection,
|
|||||||
gboolean incoming,
|
gboolean incoming,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
volatile gint *counter = user_data;
|
gint *counter = user_data; /* (atomic) */
|
||||||
*counter += 1;
|
g_atomic_int_inc (counter);
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,8 +108,8 @@ test_overflow (void)
|
|||||||
GDBusConnection *producer, *consumer;
|
GDBusConnection *producer, *consumer;
|
||||||
GError *error;
|
GError *error;
|
||||||
GTimer *timer;
|
GTimer *timer;
|
||||||
volatile gint n_messages_received;
|
gint n_messages_received; /* (atomic) */
|
||||||
volatile gint n_messages_sent;
|
gint n_messages_sent; /* (atomic) */
|
||||||
|
|
||||||
g_assert_cmpint (socketpair (AF_UNIX, SOCK_STREAM, 0, sv), ==, 0);
|
g_assert_cmpint (socketpair (AF_UNIX, SOCK_STREAM, 0, sv), ==, 0);
|
||||||
|
|
||||||
@@ -129,7 +129,7 @@ test_overflow (void)
|
|||||||
g_dbus_connection_set_exit_on_close (producer, TRUE);
|
g_dbus_connection_set_exit_on_close (producer, TRUE);
|
||||||
g_assert_no_error (error);
|
g_assert_no_error (error);
|
||||||
g_object_unref (socket_connection);
|
g_object_unref (socket_connection);
|
||||||
n_messages_sent = 0;
|
g_atomic_int_set (&n_messages_sent, 0);
|
||||||
g_dbus_connection_add_filter (producer, overflow_filter_func, (gpointer) &n_messages_sent, NULL);
|
g_dbus_connection_add_filter (producer, overflow_filter_func, (gpointer) &n_messages_sent, NULL);
|
||||||
|
|
||||||
/* send enough data that we get an EAGAIN */
|
/* send enough data that we get an EAGAIN */
|
||||||
@@ -155,7 +155,7 @@ test_overflow (void)
|
|||||||
*/
|
*/
|
||||||
g_timeout_add (500, overflow_on_500ms_later_func, NULL);
|
g_timeout_add (500, overflow_on_500ms_later_func, NULL);
|
||||||
g_main_loop_run (loop);
|
g_main_loop_run (loop);
|
||||||
g_assert_cmpint (n_messages_sent, <, OVERFLOW_NUM_SIGNALS);
|
g_assert_cmpint (g_atomic_int_get (&n_messages_sent), <, OVERFLOW_NUM_SIGNALS);
|
||||||
|
|
||||||
/* now suck it all out as a client, and add it up */
|
/* now suck it all out as a client, and add it up */
|
||||||
socket = g_socket_new_from_fd (sv[1], &error);
|
socket = g_socket_new_from_fd (sv[1], &error);
|
||||||
@@ -171,18 +171,18 @@ test_overflow (void)
|
|||||||
&error);
|
&error);
|
||||||
g_assert_no_error (error);
|
g_assert_no_error (error);
|
||||||
g_object_unref (socket_connection);
|
g_object_unref (socket_connection);
|
||||||
n_messages_received = 0;
|
g_atomic_int_set (&n_messages_received, 0);
|
||||||
g_dbus_connection_add_filter (consumer, overflow_filter_func, (gpointer) &n_messages_received, NULL);
|
g_dbus_connection_add_filter (consumer, overflow_filter_func, (gpointer) &n_messages_received, NULL);
|
||||||
g_dbus_connection_start_message_processing (consumer);
|
g_dbus_connection_start_message_processing (consumer);
|
||||||
|
|
||||||
timer = g_timer_new ();
|
timer = g_timer_new ();
|
||||||
g_timer_start (timer);
|
g_timer_start (timer);
|
||||||
|
|
||||||
while (n_messages_received < OVERFLOW_NUM_SIGNALS && g_timer_elapsed (timer, NULL) < OVERFLOW_TIMEOUT_SEC)
|
while (g_atomic_int_get (&n_messages_received) < OVERFLOW_NUM_SIGNALS && g_timer_elapsed (timer, NULL) < OVERFLOW_TIMEOUT_SEC)
|
||||||
g_main_context_iteration (NULL, FALSE);
|
g_main_context_iteration (NULL, FALSE);
|
||||||
|
|
||||||
g_assert_cmpint (n_messages_sent, ==, OVERFLOW_NUM_SIGNALS);
|
g_assert_cmpint (g_atomic_int_get (&n_messages_sent), ==, OVERFLOW_NUM_SIGNALS);
|
||||||
g_assert_cmpint (n_messages_received, ==, OVERFLOW_NUM_SIGNALS);
|
g_assert_cmpint (g_atomic_int_get (&n_messages_received), ==, OVERFLOW_NUM_SIGNALS);
|
||||||
|
|
||||||
g_timer_destroy (timer);
|
g_timer_destroy (timer);
|
||||||
g_object_unref (consumer);
|
g_object_unref (consumer);
|
||||||
|
@@ -1060,7 +1060,7 @@ test_object_set_property (GObject *object,
|
|||||||
static GType
|
static GType
|
||||||
test_enum_get_type (void)
|
test_enum_get_type (void)
|
||||||
{
|
{
|
||||||
static volatile gsize define_type_id = 0;
|
static gsize define_type_id = 0;
|
||||||
|
|
||||||
if (g_once_init_enter (&define_type_id))
|
if (g_once_init_enter (&define_type_id))
|
||||||
{
|
{
|
||||||
@@ -1082,7 +1082,7 @@ test_enum_get_type (void)
|
|||||||
static GType
|
static GType
|
||||||
test_flags_get_type (void)
|
test_flags_get_type (void)
|
||||||
{
|
{
|
||||||
static volatile gsize define_type_id = 0;
|
static gsize define_type_id = 0;
|
||||||
|
|
||||||
if (g_once_init_enter (&define_type_id))
|
if (g_once_init_enter (&define_type_id))
|
||||||
{
|
{
|
||||||
|
@@ -99,7 +99,7 @@ test_start_stop (void)
|
|||||||
|
|
||||||
GMutex mutex_712570;
|
GMutex mutex_712570;
|
||||||
GCond cond_712570;
|
GCond cond_712570;
|
||||||
volatile gboolean finalized;
|
gboolean finalized; /* (atomic) */
|
||||||
|
|
||||||
GType test_threaded_socket_service_get_type (void);
|
GType test_threaded_socket_service_get_type (void);
|
||||||
typedef GThreadedSocketService TestThreadedSocketService;
|
typedef GThreadedSocketService TestThreadedSocketService;
|
||||||
@@ -120,7 +120,7 @@ test_threaded_socket_service_finalize (GObject *object)
|
|||||||
/* Signal the main thread that finalization completed successfully
|
/* Signal the main thread that finalization completed successfully
|
||||||
* rather than hanging.
|
* rather than hanging.
|
||||||
*/
|
*/
|
||||||
finalized = TRUE;
|
g_atomic_int_set (&finalized, TRUE);
|
||||||
g_cond_signal (&cond_712570);
|
g_cond_signal (&cond_712570);
|
||||||
g_mutex_unlock (&mutex_712570);
|
g_mutex_unlock (&mutex_712570);
|
||||||
}
|
}
|
||||||
@@ -235,7 +235,7 @@ test_threaded_712570 (void)
|
|||||||
*/
|
*/
|
||||||
g_object_unref (service);
|
g_object_unref (service);
|
||||||
|
|
||||||
while (!finalized)
|
while (!g_atomic_int_get (&finalized))
|
||||||
g_cond_wait (&cond_712570, &mutex_712570);
|
g_cond_wait (&cond_712570, &mutex_712570);
|
||||||
g_mutex_unlock (&mutex_712570);
|
g_mutex_unlock (&mutex_712570);
|
||||||
}
|
}
|
||||||
|
150
gio/tests/task.c
150
gio/tests/task.c
@@ -957,7 +957,7 @@ task_weak_notify (gpointer user_data,
|
|||||||
gboolean *weak_notify_ran = user_data;
|
gboolean *weak_notify_ran = user_data;
|
||||||
|
|
||||||
g_mutex_lock (&run_in_thread_mutex);
|
g_mutex_lock (&run_in_thread_mutex);
|
||||||
*weak_notify_ran = TRUE;
|
g_atomic_int_set (weak_notify_ran, TRUE);
|
||||||
g_cond_signal (&run_in_thread_cond);
|
g_cond_signal (&run_in_thread_cond);
|
||||||
g_mutex_unlock (&run_in_thread_mutex);
|
g_mutex_unlock (&run_in_thread_mutex);
|
||||||
}
|
}
|
||||||
@@ -1007,7 +1007,7 @@ run_in_thread_thread (GTask *task,
|
|||||||
g_assert (g_thread_self () != main_thread);
|
g_assert (g_thread_self () != main_thread);
|
||||||
|
|
||||||
g_mutex_lock (&run_in_thread_mutex);
|
g_mutex_lock (&run_in_thread_mutex);
|
||||||
*thread_ran = TRUE;
|
g_atomic_int_set (thread_ran, TRUE);
|
||||||
g_cond_signal (&run_in_thread_cond);
|
g_cond_signal (&run_in_thread_cond);
|
||||||
g_mutex_unlock (&run_in_thread_mutex);
|
g_mutex_unlock (&run_in_thread_mutex);
|
||||||
|
|
||||||
@@ -1018,8 +1018,8 @@ static void
|
|||||||
test_run_in_thread (void)
|
test_run_in_thread (void)
|
||||||
{
|
{
|
||||||
GTask *task;
|
GTask *task;
|
||||||
volatile gboolean thread_ran = FALSE;
|
gboolean thread_ran = FALSE; /* (atomic) */
|
||||||
volatile gboolean weak_notify_ran = FALSE;
|
gboolean weak_notify_ran = FALSE; /* (atomic) */
|
||||||
gboolean notification_emitted = FALSE;
|
gboolean notification_emitted = FALSE;
|
||||||
gboolean done = FALSE;
|
gboolean done = FALSE;
|
||||||
|
|
||||||
@@ -1033,12 +1033,12 @@ test_run_in_thread (void)
|
|||||||
g_task_run_in_thread (task, run_in_thread_thread);
|
g_task_run_in_thread (task, run_in_thread_thread);
|
||||||
|
|
||||||
g_mutex_lock (&run_in_thread_mutex);
|
g_mutex_lock (&run_in_thread_mutex);
|
||||||
while (!thread_ran)
|
while (!g_atomic_int_get (&thread_ran))
|
||||||
g_cond_wait (&run_in_thread_cond, &run_in_thread_mutex);
|
g_cond_wait (&run_in_thread_cond, &run_in_thread_mutex);
|
||||||
g_mutex_unlock (&run_in_thread_mutex);
|
g_mutex_unlock (&run_in_thread_mutex);
|
||||||
|
|
||||||
g_assert (done == FALSE);
|
g_assert (done == FALSE);
|
||||||
g_assert (weak_notify_ran == FALSE);
|
g_assert_false (g_atomic_int_get (&weak_notify_ran));
|
||||||
|
|
||||||
g_main_loop_run (loop);
|
g_main_loop_run (loop);
|
||||||
|
|
||||||
@@ -1050,7 +1050,7 @@ test_run_in_thread (void)
|
|||||||
g_object_unref (task);
|
g_object_unref (task);
|
||||||
|
|
||||||
g_mutex_lock (&run_in_thread_mutex);
|
g_mutex_lock (&run_in_thread_mutex);
|
||||||
while (!weak_notify_ran)
|
while (!g_atomic_int_get (&weak_notify_ran))
|
||||||
g_cond_wait (&run_in_thread_cond, &run_in_thread_mutex);
|
g_cond_wait (&run_in_thread_cond, &run_in_thread_mutex);
|
||||||
g_mutex_unlock (&run_in_thread_mutex);
|
g_mutex_unlock (&run_in_thread_mutex);
|
||||||
}
|
}
|
||||||
@@ -1081,7 +1081,7 @@ run_in_thread_sync_thread (GTask *task,
|
|||||||
|
|
||||||
g_assert (g_thread_self () != main_thread);
|
g_assert (g_thread_self () != main_thread);
|
||||||
|
|
||||||
*thread_ran = TRUE;
|
g_atomic_int_set (thread_ran, TRUE);
|
||||||
g_task_return_int (task, magic);
|
g_task_return_int (task, magic);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1102,7 +1102,7 @@ test_run_in_thread_sync (void)
|
|||||||
g_task_set_task_data (task, &thread_ran, NULL);
|
g_task_set_task_data (task, &thread_ran, NULL);
|
||||||
g_task_run_in_thread_sync (task, run_in_thread_sync_thread);
|
g_task_run_in_thread_sync (task, run_in_thread_sync_thread);
|
||||||
|
|
||||||
g_assert (thread_ran == TRUE);
|
g_assert_true (g_atomic_int_get (&thread_ran));
|
||||||
g_assert (task != NULL);
|
g_assert (task != NULL);
|
||||||
g_assert (!g_task_had_error (task));
|
g_assert (!g_task_had_error (task));
|
||||||
g_assert_true (g_task_get_completed (task));
|
g_assert_true (g_task_get_completed (task));
|
||||||
@@ -1487,8 +1487,8 @@ test_return_on_cancel (void)
|
|||||||
{
|
{
|
||||||
GTask *task;
|
GTask *task;
|
||||||
GCancellable *cancellable;
|
GCancellable *cancellable;
|
||||||
volatile ThreadState thread_state;
|
ThreadState thread_state; /* (atomic) */
|
||||||
volatile gboolean weak_notify_ran = FALSE;
|
gboolean weak_notify_ran = FALSE; /* (atomic) */
|
||||||
gboolean callback_ran;
|
gboolean callback_ran;
|
||||||
gboolean notification_emitted = FALSE;
|
gboolean notification_emitted = FALSE;
|
||||||
|
|
||||||
@@ -1498,7 +1498,7 @@ test_return_on_cancel (void)
|
|||||||
* early.
|
* early.
|
||||||
*/
|
*/
|
||||||
callback_ran = FALSE;
|
callback_ran = FALSE;
|
||||||
thread_state = THREAD_STARTING;
|
g_atomic_int_set (&thread_state, THREAD_STARTING);
|
||||||
task = g_task_new (NULL, cancellable, return_on_cancel_callback, &callback_ran);
|
task = g_task_new (NULL, cancellable, return_on_cancel_callback, &callback_ran);
|
||||||
g_signal_connect (task, "notify::completed",
|
g_signal_connect (task, "notify::completed",
|
||||||
(GCallback) completed_cb, ¬ification_emitted);
|
(GCallback) completed_cb, ¬ification_emitted);
|
||||||
@@ -1509,18 +1509,18 @@ test_return_on_cancel (void)
|
|||||||
g_task_run_in_thread (task, return_on_cancel_thread);
|
g_task_run_in_thread (task, return_on_cancel_thread);
|
||||||
g_object_unref (task);
|
g_object_unref (task);
|
||||||
|
|
||||||
while (thread_state == THREAD_STARTING)
|
while (g_atomic_int_get (&thread_state) == THREAD_STARTING)
|
||||||
g_cond_wait (&roc_init_cond, &roc_init_mutex);
|
g_cond_wait (&roc_init_cond, &roc_init_mutex);
|
||||||
g_mutex_unlock (&roc_init_mutex);
|
g_mutex_unlock (&roc_init_mutex);
|
||||||
|
|
||||||
g_assert (thread_state == THREAD_RUNNING);
|
g_assert_cmpint (g_atomic_int_get (&thread_state), ==, THREAD_RUNNING);
|
||||||
g_assert (callback_ran == FALSE);
|
g_assert (callback_ran == FALSE);
|
||||||
|
|
||||||
g_cancellable_cancel (cancellable);
|
g_cancellable_cancel (cancellable);
|
||||||
g_mutex_unlock (&roc_finish_mutex);
|
g_mutex_unlock (&roc_finish_mutex);
|
||||||
g_main_loop_run (loop);
|
g_main_loop_run (loop);
|
||||||
|
|
||||||
g_assert (thread_state == THREAD_COMPLETED);
|
g_assert_cmpint (g_atomic_int_get (&thread_state), ==, THREAD_COMPLETED);
|
||||||
g_assert (callback_ran == TRUE);
|
g_assert (callback_ran == TRUE);
|
||||||
g_assert_true (notification_emitted);
|
g_assert_true (notification_emitted);
|
||||||
|
|
||||||
@@ -1529,7 +1529,7 @@ test_return_on_cancel (void)
|
|||||||
/* If return-on-cancel is TRUE, it does return early */
|
/* If return-on-cancel is TRUE, it does return early */
|
||||||
callback_ran = FALSE;
|
callback_ran = FALSE;
|
||||||
notification_emitted = FALSE;
|
notification_emitted = FALSE;
|
||||||
thread_state = THREAD_STARTING;
|
g_atomic_int_set (&thread_state, THREAD_STARTING);
|
||||||
task = g_task_new (NULL, cancellable, return_on_cancel_callback, &callback_ran);
|
task = g_task_new (NULL, cancellable, return_on_cancel_callback, &callback_ran);
|
||||||
g_object_weak_ref (G_OBJECT (task), task_weak_notify, (gpointer)&weak_notify_ran);
|
g_object_weak_ref (G_OBJECT (task), task_weak_notify, (gpointer)&weak_notify_ran);
|
||||||
g_signal_connect (task, "notify::completed",
|
g_signal_connect (task, "notify::completed",
|
||||||
@@ -1542,27 +1542,27 @@ test_return_on_cancel (void)
|
|||||||
g_task_run_in_thread (task, return_on_cancel_thread);
|
g_task_run_in_thread (task, return_on_cancel_thread);
|
||||||
g_object_unref (task);
|
g_object_unref (task);
|
||||||
|
|
||||||
while (thread_state == THREAD_STARTING)
|
while (g_atomic_int_get (&thread_state) == THREAD_STARTING)
|
||||||
g_cond_wait (&roc_init_cond, &roc_init_mutex);
|
g_cond_wait (&roc_init_cond, &roc_init_mutex);
|
||||||
g_mutex_unlock (&roc_init_mutex);
|
g_mutex_unlock (&roc_init_mutex);
|
||||||
|
|
||||||
g_assert (thread_state == THREAD_RUNNING);
|
g_assert_cmpint (g_atomic_int_get (&thread_state), ==, THREAD_RUNNING);
|
||||||
g_assert (callback_ran == FALSE);
|
g_assert (callback_ran == FALSE);
|
||||||
|
|
||||||
g_cancellable_cancel (cancellable);
|
g_cancellable_cancel (cancellable);
|
||||||
g_main_loop_run (loop);
|
g_main_loop_run (loop);
|
||||||
g_assert (thread_state == THREAD_RUNNING);
|
g_assert_cmpint (g_atomic_int_get (&thread_state), ==, THREAD_RUNNING);
|
||||||
g_assert (callback_ran == TRUE);
|
g_assert (callback_ran == TRUE);
|
||||||
|
|
||||||
g_assert (weak_notify_ran == FALSE);
|
g_assert_false (g_atomic_int_get (&weak_notify_ran));
|
||||||
|
|
||||||
while (thread_state == THREAD_RUNNING)
|
while (g_atomic_int_get (&thread_state) == THREAD_RUNNING)
|
||||||
g_cond_wait (&roc_finish_cond, &roc_finish_mutex);
|
g_cond_wait (&roc_finish_cond, &roc_finish_mutex);
|
||||||
g_mutex_unlock (&roc_finish_mutex);
|
g_mutex_unlock (&roc_finish_mutex);
|
||||||
|
|
||||||
g_assert (thread_state == THREAD_CANCELLED);
|
g_assert_cmpint (g_atomic_int_get (&thread_state), ==, THREAD_CANCELLED);
|
||||||
g_mutex_lock (&run_in_thread_mutex);
|
g_mutex_lock (&run_in_thread_mutex);
|
||||||
while (!weak_notify_ran)
|
while (!g_atomic_int_get (&weak_notify_ran))
|
||||||
g_cond_wait (&run_in_thread_cond, &run_in_thread_mutex);
|
g_cond_wait (&run_in_thread_cond, &run_in_thread_mutex);
|
||||||
g_mutex_unlock (&run_in_thread_mutex);
|
g_mutex_unlock (&run_in_thread_mutex);
|
||||||
|
|
||||||
@@ -1574,7 +1574,7 @@ test_return_on_cancel (void)
|
|||||||
*/
|
*/
|
||||||
callback_ran = FALSE;
|
callback_ran = FALSE;
|
||||||
notification_emitted = FALSE;
|
notification_emitted = FALSE;
|
||||||
thread_state = THREAD_STARTING;
|
g_atomic_int_set (&thread_state, THREAD_STARTING);
|
||||||
task = g_task_new (NULL, cancellable, return_on_cancel_callback, &callback_ran);
|
task = g_task_new (NULL, cancellable, return_on_cancel_callback, &callback_ran);
|
||||||
g_signal_connect (task, "notify::completed",
|
g_signal_connect (task, "notify::completed",
|
||||||
(GCallback) completed_cb, ¬ification_emitted);
|
(GCallback) completed_cb, ¬ification_emitted);
|
||||||
@@ -1591,17 +1591,17 @@ test_return_on_cancel (void)
|
|||||||
g_main_loop_run (loop);
|
g_main_loop_run (loop);
|
||||||
g_assert (callback_ran == TRUE);
|
g_assert (callback_ran == TRUE);
|
||||||
|
|
||||||
while (thread_state == THREAD_STARTING)
|
while (g_atomic_int_get (&thread_state) == THREAD_STARTING)
|
||||||
g_cond_wait (&roc_init_cond, &roc_init_mutex);
|
g_cond_wait (&roc_init_cond, &roc_init_mutex);
|
||||||
g_mutex_unlock (&roc_init_mutex);
|
g_mutex_unlock (&roc_init_mutex);
|
||||||
|
|
||||||
g_assert (thread_state == THREAD_RUNNING);
|
g_assert_cmpint (g_atomic_int_get (&thread_state), ==, THREAD_RUNNING);
|
||||||
|
|
||||||
while (thread_state == THREAD_RUNNING)
|
while (g_atomic_int_get (&thread_state) == THREAD_RUNNING)
|
||||||
g_cond_wait (&roc_finish_cond, &roc_finish_mutex);
|
g_cond_wait (&roc_finish_cond, &roc_finish_mutex);
|
||||||
g_mutex_unlock (&roc_finish_mutex);
|
g_mutex_unlock (&roc_finish_mutex);
|
||||||
|
|
||||||
g_assert (thread_state == THREAD_CANCELLED);
|
g_assert_cmpint (g_atomic_int_get (&thread_state), ==, THREAD_CANCELLED);
|
||||||
g_assert_true (notification_emitted);
|
g_assert_true (notification_emitted);
|
||||||
|
|
||||||
g_object_unref (cancellable);
|
g_object_unref (cancellable);
|
||||||
@@ -1621,7 +1621,7 @@ test_return_on_cancel_sync (void)
|
|||||||
{
|
{
|
||||||
GTask *task;
|
GTask *task;
|
||||||
GCancellable *cancellable;
|
GCancellable *cancellable;
|
||||||
volatile ThreadState thread_state;
|
ThreadState thread_state; /* (atomic) */
|
||||||
GThread *runner_thread;
|
GThread *runner_thread;
|
||||||
gssize ret;
|
gssize ret;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
@@ -1630,7 +1630,7 @@ test_return_on_cancel_sync (void)
|
|||||||
|
|
||||||
/* If return-on-cancel is FALSE, the task does not return early.
|
/* If return-on-cancel is FALSE, the task does not return early.
|
||||||
*/
|
*/
|
||||||
thread_state = THREAD_STARTING;
|
g_atomic_int_set (&thread_state, THREAD_STARTING);
|
||||||
task = g_task_new (NULL, cancellable, run_in_thread_sync_callback, NULL);
|
task = g_task_new (NULL, cancellable, run_in_thread_sync_callback, NULL);
|
||||||
|
|
||||||
g_task_set_task_data (task, (gpointer)&thread_state, NULL);
|
g_task_set_task_data (task, (gpointer)&thread_state, NULL);
|
||||||
@@ -1639,16 +1639,16 @@ test_return_on_cancel_sync (void)
|
|||||||
runner_thread = g_thread_new ("return-on-cancel-sync runner thread",
|
runner_thread = g_thread_new ("return-on-cancel-sync runner thread",
|
||||||
cancel_sync_runner_thread, task);
|
cancel_sync_runner_thread, task);
|
||||||
|
|
||||||
while (thread_state == THREAD_STARTING)
|
while (g_atomic_int_get (&thread_state) == THREAD_STARTING)
|
||||||
g_cond_wait (&roc_init_cond, &roc_init_mutex);
|
g_cond_wait (&roc_init_cond, &roc_init_mutex);
|
||||||
g_mutex_unlock (&roc_init_mutex);
|
g_mutex_unlock (&roc_init_mutex);
|
||||||
|
|
||||||
g_assert (thread_state == THREAD_RUNNING);
|
g_assert_cmpint (g_atomic_int_get (&thread_state), ==, THREAD_RUNNING);
|
||||||
|
|
||||||
g_cancellable_cancel (cancellable);
|
g_cancellable_cancel (cancellable);
|
||||||
g_mutex_unlock (&roc_finish_mutex);
|
g_mutex_unlock (&roc_finish_mutex);
|
||||||
g_thread_join (runner_thread);
|
g_thread_join (runner_thread);
|
||||||
g_assert (thread_state == THREAD_COMPLETED);
|
g_assert_cmpint (g_atomic_int_get (&thread_state), ==, THREAD_COMPLETED);
|
||||||
|
|
||||||
ret = g_task_propagate_int (task, &error);
|
ret = g_task_propagate_int (task, &error);
|
||||||
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
|
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
|
||||||
@@ -1660,7 +1660,7 @@ test_return_on_cancel_sync (void)
|
|||||||
g_cancellable_reset (cancellable);
|
g_cancellable_reset (cancellable);
|
||||||
|
|
||||||
/* If return-on-cancel is TRUE, it does return early */
|
/* If return-on-cancel is TRUE, it does return early */
|
||||||
thread_state = THREAD_STARTING;
|
g_atomic_int_set (&thread_state, THREAD_STARTING);
|
||||||
task = g_task_new (NULL, cancellable, run_in_thread_sync_callback, NULL);
|
task = g_task_new (NULL, cancellable, run_in_thread_sync_callback, NULL);
|
||||||
g_task_set_return_on_cancel (task, TRUE);
|
g_task_set_return_on_cancel (task, TRUE);
|
||||||
|
|
||||||
@@ -1670,15 +1670,15 @@ test_return_on_cancel_sync (void)
|
|||||||
runner_thread = g_thread_new ("return-on-cancel-sync runner thread",
|
runner_thread = g_thread_new ("return-on-cancel-sync runner thread",
|
||||||
cancel_sync_runner_thread, task);
|
cancel_sync_runner_thread, task);
|
||||||
|
|
||||||
while (thread_state == THREAD_STARTING)
|
while (g_atomic_int_get (&thread_state) == THREAD_STARTING)
|
||||||
g_cond_wait (&roc_init_cond, &roc_init_mutex);
|
g_cond_wait (&roc_init_cond, &roc_init_mutex);
|
||||||
g_mutex_unlock (&roc_init_mutex);
|
g_mutex_unlock (&roc_init_mutex);
|
||||||
|
|
||||||
g_assert (thread_state == THREAD_RUNNING);
|
g_assert_cmpint (g_atomic_int_get (&thread_state), ==, THREAD_RUNNING);
|
||||||
|
|
||||||
g_cancellable_cancel (cancellable);
|
g_cancellable_cancel (cancellable);
|
||||||
g_thread_join (runner_thread);
|
g_thread_join (runner_thread);
|
||||||
g_assert (thread_state == THREAD_RUNNING);
|
g_assert_cmpint (g_atomic_int_get (&thread_state), ==, THREAD_RUNNING);
|
||||||
|
|
||||||
ret = g_task_propagate_int (task, &error);
|
ret = g_task_propagate_int (task, &error);
|
||||||
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
|
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
|
||||||
@@ -1687,18 +1687,18 @@ test_return_on_cancel_sync (void)
|
|||||||
|
|
||||||
g_object_unref (task);
|
g_object_unref (task);
|
||||||
|
|
||||||
while (thread_state == THREAD_RUNNING)
|
while (g_atomic_int_get (&thread_state) == THREAD_RUNNING)
|
||||||
g_cond_wait (&roc_finish_cond, &roc_finish_mutex);
|
g_cond_wait (&roc_finish_cond, &roc_finish_mutex);
|
||||||
g_mutex_unlock (&roc_finish_mutex);
|
g_mutex_unlock (&roc_finish_mutex);
|
||||||
|
|
||||||
g_assert (thread_state == THREAD_CANCELLED);
|
g_assert_cmpint (g_atomic_int_get (&thread_state), ==, THREAD_CANCELLED);
|
||||||
|
|
||||||
g_cancellable_reset (cancellable);
|
g_cancellable_reset (cancellable);
|
||||||
|
|
||||||
/* If the task is already cancelled before it starts, it returns
|
/* If the task is already cancelled before it starts, it returns
|
||||||
* immediately, but the thread func still runs.
|
* immediately, but the thread func still runs.
|
||||||
*/
|
*/
|
||||||
thread_state = THREAD_STARTING;
|
g_atomic_int_set (&thread_state, THREAD_STARTING);
|
||||||
task = g_task_new (NULL, cancellable, run_in_thread_sync_callback, NULL);
|
task = g_task_new (NULL, cancellable, run_in_thread_sync_callback, NULL);
|
||||||
g_task_set_return_on_cancel (task, TRUE);
|
g_task_set_return_on_cancel (task, TRUE);
|
||||||
|
|
||||||
@@ -1711,7 +1711,7 @@ test_return_on_cancel_sync (void)
|
|||||||
cancel_sync_runner_thread, task);
|
cancel_sync_runner_thread, task);
|
||||||
|
|
||||||
g_thread_join (runner_thread);
|
g_thread_join (runner_thread);
|
||||||
g_assert (thread_state == THREAD_STARTING);
|
g_assert_cmpint (g_atomic_int_get (&thread_state), ==, THREAD_STARTING);
|
||||||
|
|
||||||
ret = g_task_propagate_int (task, &error);
|
ret = g_task_propagate_int (task, &error);
|
||||||
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
|
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
|
||||||
@@ -1720,17 +1720,17 @@ test_return_on_cancel_sync (void)
|
|||||||
|
|
||||||
g_object_unref (task);
|
g_object_unref (task);
|
||||||
|
|
||||||
while (thread_state == THREAD_STARTING)
|
while (g_atomic_int_get (&thread_state) == THREAD_STARTING)
|
||||||
g_cond_wait (&roc_init_cond, &roc_init_mutex);
|
g_cond_wait (&roc_init_cond, &roc_init_mutex);
|
||||||
g_mutex_unlock (&roc_init_mutex);
|
g_mutex_unlock (&roc_init_mutex);
|
||||||
|
|
||||||
g_assert (thread_state == THREAD_RUNNING);
|
g_assert_cmpint (g_atomic_int_get (&thread_state), ==, THREAD_RUNNING);
|
||||||
|
|
||||||
while (thread_state == THREAD_RUNNING)
|
while (g_atomic_int_get (&thread_state) == THREAD_RUNNING)
|
||||||
g_cond_wait (&roc_finish_cond, &roc_finish_mutex);
|
g_cond_wait (&roc_finish_cond, &roc_finish_mutex);
|
||||||
g_mutex_unlock (&roc_finish_mutex);
|
g_mutex_unlock (&roc_finish_mutex);
|
||||||
|
|
||||||
g_assert (thread_state == THREAD_CANCELLED);
|
g_assert_cmpint (g_atomic_int_get (&thread_state), ==, THREAD_CANCELLED);
|
||||||
|
|
||||||
g_object_unref (cancellable);
|
g_object_unref (cancellable);
|
||||||
}
|
}
|
||||||
@@ -1776,7 +1776,7 @@ return_on_cancel_atomic_thread (GTask *task,
|
|||||||
gpointer task_data,
|
gpointer task_data,
|
||||||
GCancellable *cancellable)
|
GCancellable *cancellable)
|
||||||
{
|
{
|
||||||
gint *state = task_data;
|
gint *state = task_data; /* (atomic) */
|
||||||
|
|
||||||
g_assert (source_object == g_task_get_source_object (task));
|
g_assert (source_object == g_task_get_source_object (task));
|
||||||
g_assert (task_data == g_task_get_task_data (task));
|
g_assert (task_data == g_task_get_task_data (task));
|
||||||
@@ -1784,34 +1784,34 @@ return_on_cancel_atomic_thread (GTask *task,
|
|||||||
g_assert_false (g_task_get_completed (task));
|
g_assert_false (g_task_get_completed (task));
|
||||||
|
|
||||||
g_assert (g_thread_self () != main_thread);
|
g_assert (g_thread_self () != main_thread);
|
||||||
g_assert_cmpint (*state, ==, 0);
|
g_assert_cmpint (g_atomic_int_get (state), ==, 0);
|
||||||
|
|
||||||
g_mutex_lock (&roca_mutex_1);
|
g_mutex_lock (&roca_mutex_1);
|
||||||
*state = 1;
|
g_atomic_int_set (state, 1);
|
||||||
g_cond_signal (&roca_cond_1);
|
g_cond_signal (&roca_cond_1);
|
||||||
g_mutex_unlock (&roca_mutex_1);
|
g_mutex_unlock (&roca_mutex_1);
|
||||||
|
|
||||||
g_mutex_lock (&roca_mutex_2);
|
g_mutex_lock (&roca_mutex_2);
|
||||||
if (g_task_set_return_on_cancel (task, FALSE))
|
if (g_task_set_return_on_cancel (task, FALSE))
|
||||||
*state = 2;
|
g_atomic_int_set (state, 2);
|
||||||
else
|
else
|
||||||
*state = 3;
|
g_atomic_int_set (state, 3);
|
||||||
g_cond_signal (&roca_cond_2);
|
g_cond_signal (&roca_cond_2);
|
||||||
g_mutex_unlock (&roca_mutex_2);
|
g_mutex_unlock (&roca_mutex_2);
|
||||||
|
|
||||||
g_mutex_lock (&roca_mutex_1);
|
g_mutex_lock (&roca_mutex_1);
|
||||||
if (g_task_set_return_on_cancel (task, TRUE))
|
if (g_task_set_return_on_cancel (task, TRUE))
|
||||||
*state = 4;
|
g_atomic_int_set (state, 4);
|
||||||
else
|
else
|
||||||
*state = 5;
|
g_atomic_int_set (state, 5);
|
||||||
g_cond_signal (&roca_cond_1);
|
g_cond_signal (&roca_cond_1);
|
||||||
g_mutex_unlock (&roca_mutex_1);
|
g_mutex_unlock (&roca_mutex_1);
|
||||||
|
|
||||||
g_mutex_lock (&roca_mutex_2);
|
g_mutex_lock (&roca_mutex_2);
|
||||||
if (g_task_set_return_on_cancel (task, TRUE))
|
if (g_task_set_return_on_cancel (task, TRUE))
|
||||||
*state = 6;
|
g_atomic_int_set (state, 6);
|
||||||
else
|
else
|
||||||
*state = 7;
|
g_atomic_int_set (state, 7);
|
||||||
g_cond_signal (&roca_cond_2);
|
g_cond_signal (&roca_cond_2);
|
||||||
g_mutex_unlock (&roca_mutex_2);
|
g_mutex_unlock (&roca_mutex_2);
|
||||||
|
|
||||||
@@ -1823,7 +1823,7 @@ test_return_on_cancel_atomic (void)
|
|||||||
{
|
{
|
||||||
GTask *task;
|
GTask *task;
|
||||||
GCancellable *cancellable;
|
GCancellable *cancellable;
|
||||||
volatile gint state;
|
gint state; /* (atomic) */
|
||||||
gboolean notification_emitted = FALSE;
|
gboolean notification_emitted = FALSE;
|
||||||
gboolean callback_ran;
|
gboolean callback_ran;
|
||||||
|
|
||||||
@@ -1832,7 +1832,7 @@ test_return_on_cancel_atomic (void)
|
|||||||
g_mutex_lock (&roca_mutex_2);
|
g_mutex_lock (&roca_mutex_2);
|
||||||
|
|
||||||
/* If we don't cancel it, each set_return_on_cancel() call will succeed */
|
/* If we don't cancel it, each set_return_on_cancel() call will succeed */
|
||||||
state = 0;
|
g_atomic_int_set (&state, 0);
|
||||||
callback_ran = FALSE;
|
callback_ran = FALSE;
|
||||||
task = g_task_new (NULL, cancellable, return_on_cancel_atomic_callback, &callback_ran);
|
task = g_task_new (NULL, cancellable, return_on_cancel_atomic_callback, &callback_ran);
|
||||||
g_task_set_return_on_cancel (task, TRUE);
|
g_task_set_return_on_cancel (task, TRUE);
|
||||||
@@ -1843,23 +1843,23 @@ test_return_on_cancel_atomic (void)
|
|||||||
g_task_run_in_thread (task, return_on_cancel_atomic_thread);
|
g_task_run_in_thread (task, return_on_cancel_atomic_thread);
|
||||||
g_object_unref (task);
|
g_object_unref (task);
|
||||||
|
|
||||||
g_assert_cmpint (state, ==, 0);
|
g_assert_cmpint (g_atomic_int_get (&state), ==, 0);
|
||||||
|
|
||||||
while (state == 0)
|
while (g_atomic_int_get (&state) == 0)
|
||||||
g_cond_wait (&roca_cond_1, &roca_mutex_1);
|
g_cond_wait (&roca_cond_1, &roca_mutex_1);
|
||||||
g_assert (state == 1);
|
g_assert_cmpint (g_atomic_int_get (&state), ==, 1);
|
||||||
|
|
||||||
while (state == 1)
|
while (g_atomic_int_get (&state) == 1)
|
||||||
g_cond_wait (&roca_cond_2, &roca_mutex_2);
|
g_cond_wait (&roca_cond_2, &roca_mutex_2);
|
||||||
g_assert (state == 2);
|
g_assert_cmpint (g_atomic_int_get (&state), ==, 2);
|
||||||
|
|
||||||
while (state == 2)
|
while (g_atomic_int_get (&state) == 2)
|
||||||
g_cond_wait (&roca_cond_1, &roca_mutex_1);
|
g_cond_wait (&roca_cond_1, &roca_mutex_1);
|
||||||
g_assert (state == 4);
|
g_assert_cmpint (g_atomic_int_get (&state), ==, 4);
|
||||||
|
|
||||||
while (state == 4)
|
while (g_atomic_int_get (&state) == 4)
|
||||||
g_cond_wait (&roca_cond_2, &roca_mutex_2);
|
g_cond_wait (&roca_cond_2, &roca_mutex_2);
|
||||||
g_assert (state == 6);
|
g_assert_cmpint (g_atomic_int_get (&state), ==, 6);
|
||||||
|
|
||||||
/* callback assumes there'll be a cancelled error */
|
/* callback assumes there'll be a cancelled error */
|
||||||
g_cancellable_cancel (cancellable);
|
g_cancellable_cancel (cancellable);
|
||||||
@@ -1876,7 +1876,7 @@ test_return_on_cancel_atomic (void)
|
|||||||
* task won't complete right away, and further
|
* task won't complete right away, and further
|
||||||
* g_task_set_return_on_cancel() calls will return FALSE.
|
* g_task_set_return_on_cancel() calls will return FALSE.
|
||||||
*/
|
*/
|
||||||
state = 0;
|
g_atomic_int_set (&state, 0);
|
||||||
callback_ran = FALSE;
|
callback_ran = FALSE;
|
||||||
notification_emitted = FALSE;
|
notification_emitted = FALSE;
|
||||||
task = g_task_new (NULL, cancellable, return_on_cancel_atomic_callback, &callback_ran);
|
task = g_task_new (NULL, cancellable, return_on_cancel_atomic_callback, &callback_ran);
|
||||||
@@ -1887,16 +1887,16 @@ test_return_on_cancel_atomic (void)
|
|||||||
g_task_set_task_data (task, (gpointer)&state, NULL);
|
g_task_set_task_data (task, (gpointer)&state, NULL);
|
||||||
g_task_run_in_thread (task, return_on_cancel_atomic_thread);
|
g_task_run_in_thread (task, return_on_cancel_atomic_thread);
|
||||||
|
|
||||||
g_assert_cmpint (state, ==, 0);
|
g_assert_cmpint (g_atomic_int_get (&state), ==, 0);
|
||||||
|
|
||||||
while (state == 0)
|
while (g_atomic_int_get (&state) == 0)
|
||||||
g_cond_wait (&roca_cond_1, &roca_mutex_1);
|
g_cond_wait (&roca_cond_1, &roca_mutex_1);
|
||||||
g_assert (state == 1);
|
g_assert_cmpint (g_atomic_int_get (&state), ==, 1);
|
||||||
g_assert (g_task_get_return_on_cancel (task));
|
g_assert (g_task_get_return_on_cancel (task));
|
||||||
|
|
||||||
while (state == 1)
|
while (g_atomic_int_get (&state) == 1)
|
||||||
g_cond_wait (&roca_cond_2, &roca_mutex_2);
|
g_cond_wait (&roca_cond_2, &roca_mutex_2);
|
||||||
g_assert (state == 2);
|
g_assert_cmpint (g_atomic_int_get (&state), ==, 2);
|
||||||
g_assert (!g_task_get_return_on_cancel (task));
|
g_assert (!g_task_get_return_on_cancel (task));
|
||||||
|
|
||||||
g_cancellable_cancel (cancellable);
|
g_cancellable_cancel (cancellable);
|
||||||
@@ -1904,18 +1904,18 @@ test_return_on_cancel_atomic (void)
|
|||||||
g_main_loop_run (loop);
|
g_main_loop_run (loop);
|
||||||
g_assert (callback_ran == FALSE);
|
g_assert (callback_ran == FALSE);
|
||||||
|
|
||||||
while (state == 2)
|
while (g_atomic_int_get (&state) == 2)
|
||||||
g_cond_wait (&roca_cond_1, &roca_mutex_1);
|
g_cond_wait (&roca_cond_1, &roca_mutex_1);
|
||||||
g_assert (state == 5);
|
g_assert_cmpint (g_atomic_int_get (&state), ==, 5);
|
||||||
g_assert (!g_task_get_return_on_cancel (task));
|
g_assert (!g_task_get_return_on_cancel (task));
|
||||||
|
|
||||||
g_main_loop_run (loop);
|
g_main_loop_run (loop);
|
||||||
g_assert (callback_ran == TRUE);
|
g_assert (callback_ran == TRUE);
|
||||||
g_assert_true (notification_emitted);
|
g_assert_true (notification_emitted);
|
||||||
|
|
||||||
while (state == 5)
|
while (g_atomic_int_get (&state) == 5)
|
||||||
g_cond_wait (&roca_cond_2, &roca_mutex_2);
|
g_cond_wait (&roca_cond_2, &roca_mutex_2);
|
||||||
g_assert (state == 7);
|
g_assert_cmpint (g_atomic_int_get (&state), ==, 7);
|
||||||
|
|
||||||
g_object_unref (cancellable);
|
g_object_unref (cancellable);
|
||||||
g_mutex_unlock (&roca_mutex_1);
|
g_mutex_unlock (&roca_mutex_1);
|
||||||
|
@@ -105,6 +105,9 @@
|
|||||||
* This call acts as a full compiler and hardware
|
* This call acts as a full compiler and hardware
|
||||||
* memory barrier (before the get).
|
* memory barrier (before the get).
|
||||||
*
|
*
|
||||||
|
* While @atomic has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Returns: the value of the integer
|
* Returns: the value of the integer
|
||||||
*
|
*
|
||||||
* Since: 2.4
|
* Since: 2.4
|
||||||
@@ -125,6 +128,9 @@ gint
|
|||||||
* This call acts as a full compiler and hardware
|
* This call acts as a full compiler and hardware
|
||||||
* memory barrier (after the set).
|
* memory barrier (after the set).
|
||||||
*
|
*
|
||||||
|
* While @atomic has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Since: 2.4
|
* Since: 2.4
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
@@ -144,6 +150,9 @@ void
|
|||||||
*
|
*
|
||||||
* This call acts as a full compiler and hardware memory barrier.
|
* This call acts as a full compiler and hardware memory barrier.
|
||||||
*
|
*
|
||||||
|
* While @atomic has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Since: 2.4
|
* Since: 2.4
|
||||||
**/
|
**/
|
||||||
void
|
void
|
||||||
@@ -163,6 +172,9 @@ void
|
|||||||
*
|
*
|
||||||
* This call acts as a full compiler and hardware memory barrier.
|
* This call acts as a full compiler and hardware memory barrier.
|
||||||
*
|
*
|
||||||
|
* While @atomic has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Returns: %TRUE if the resultant value is zero
|
* Returns: %TRUE if the resultant value is zero
|
||||||
*
|
*
|
||||||
* Since: 2.4
|
* Since: 2.4
|
||||||
@@ -189,6 +201,9 @@ gboolean
|
|||||||
*
|
*
|
||||||
* This call acts as a full compiler and hardware memory barrier.
|
* This call acts as a full compiler and hardware memory barrier.
|
||||||
*
|
*
|
||||||
|
* While @atomic has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Returns: %TRUE if the exchange took place
|
* Returns: %TRUE if the exchange took place
|
||||||
*
|
*
|
||||||
* Since: 2.4
|
* Since: 2.4
|
||||||
@@ -216,6 +231,9 @@ gboolean
|
|||||||
* Before version 2.30, this function did not return a value
|
* Before version 2.30, this function did not return a value
|
||||||
* (but g_atomic_int_exchange_and_add() did, and had the same meaning).
|
* (but g_atomic_int_exchange_and_add() did, and had the same meaning).
|
||||||
*
|
*
|
||||||
|
* While @atomic has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Returns: the value of @atomic before the add, signed
|
* Returns: the value of @atomic before the add, signed
|
||||||
*
|
*
|
||||||
* Since: 2.4
|
* Since: 2.4
|
||||||
@@ -240,6 +258,9 @@ gint
|
|||||||
* Think of this operation as an atomic version of
|
* Think of this operation as an atomic version of
|
||||||
* `{ tmp = *atomic; *atomic &= val; return tmp; }`.
|
* `{ tmp = *atomic; *atomic &= val; return tmp; }`.
|
||||||
*
|
*
|
||||||
|
* While @atomic has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Returns: the value of @atomic before the operation, unsigned
|
* Returns: the value of @atomic before the operation, unsigned
|
||||||
*
|
*
|
||||||
* Since: 2.30
|
* Since: 2.30
|
||||||
@@ -264,6 +285,9 @@ guint
|
|||||||
*
|
*
|
||||||
* This call acts as a full compiler and hardware memory barrier.
|
* This call acts as a full compiler and hardware memory barrier.
|
||||||
*
|
*
|
||||||
|
* While @atomic has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Returns: the value of @atomic before the operation, unsigned
|
* Returns: the value of @atomic before the operation, unsigned
|
||||||
*
|
*
|
||||||
* Since: 2.30
|
* Since: 2.30
|
||||||
@@ -288,6 +312,9 @@ guint
|
|||||||
*
|
*
|
||||||
* This call acts as a full compiler and hardware memory barrier.
|
* This call acts as a full compiler and hardware memory barrier.
|
||||||
*
|
*
|
||||||
|
* While @atomic has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Returns: the value of @atomic before the operation, unsigned
|
* Returns: the value of @atomic before the operation, unsigned
|
||||||
*
|
*
|
||||||
* Since: 2.30
|
* Since: 2.30
|
||||||
@@ -309,6 +336,9 @@ guint
|
|||||||
* This call acts as a full compiler and hardware
|
* This call acts as a full compiler and hardware
|
||||||
* memory barrier (before the get).
|
* memory barrier (before the get).
|
||||||
*
|
*
|
||||||
|
* While @atomic has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Returns: the value of the pointer
|
* Returns: the value of the pointer
|
||||||
*
|
*
|
||||||
* Since: 2.4
|
* Since: 2.4
|
||||||
@@ -316,7 +346,7 @@ guint
|
|||||||
gpointer
|
gpointer
|
||||||
(g_atomic_pointer_get) (const volatile void *atomic)
|
(g_atomic_pointer_get) (const volatile void *atomic)
|
||||||
{
|
{
|
||||||
return g_atomic_pointer_get ((const volatile gpointer *) atomic);
|
return g_atomic_pointer_get ((gpointer *) atomic);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -329,13 +359,16 @@ gpointer
|
|||||||
* This call acts as a full compiler and hardware
|
* This call acts as a full compiler and hardware
|
||||||
* memory barrier (after the set).
|
* memory barrier (after the set).
|
||||||
*
|
*
|
||||||
|
* While @atomic has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Since: 2.4
|
* Since: 2.4
|
||||||
**/
|
**/
|
||||||
void
|
void
|
||||||
(g_atomic_pointer_set) (volatile void *atomic,
|
(g_atomic_pointer_set) (volatile void *atomic,
|
||||||
gpointer newval)
|
gpointer newval)
|
||||||
{
|
{
|
||||||
g_atomic_pointer_set ((volatile gpointer *) atomic, newval);
|
g_atomic_pointer_set ((gpointer *) atomic, newval);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -354,6 +387,9 @@ void
|
|||||||
*
|
*
|
||||||
* This call acts as a full compiler and hardware memory barrier.
|
* This call acts as a full compiler and hardware memory barrier.
|
||||||
*
|
*
|
||||||
|
* While @atomic has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Returns: %TRUE if the exchange took place
|
* Returns: %TRUE if the exchange took place
|
||||||
*
|
*
|
||||||
* Since: 2.4
|
* Since: 2.4
|
||||||
@@ -363,7 +399,7 @@ gboolean
|
|||||||
gpointer oldval,
|
gpointer oldval,
|
||||||
gpointer newval)
|
gpointer newval)
|
||||||
{
|
{
|
||||||
return g_atomic_pointer_compare_and_exchange ((volatile gpointer *) atomic,
|
return g_atomic_pointer_compare_and_exchange ((gpointer *) atomic,
|
||||||
oldval, newval);
|
oldval, newval);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -379,6 +415,9 @@ gboolean
|
|||||||
*
|
*
|
||||||
* This call acts as a full compiler and hardware memory barrier.
|
* This call acts as a full compiler and hardware memory barrier.
|
||||||
*
|
*
|
||||||
|
* While @atomic has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Returns: the value of @atomic before the add, signed
|
* Returns: the value of @atomic before the add, signed
|
||||||
*
|
*
|
||||||
* Since: 2.30
|
* Since: 2.30
|
||||||
@@ -387,7 +426,7 @@ gssize
|
|||||||
(g_atomic_pointer_add) (volatile void *atomic,
|
(g_atomic_pointer_add) (volatile void *atomic,
|
||||||
gssize val)
|
gssize val)
|
||||||
{
|
{
|
||||||
return g_atomic_pointer_add ((volatile gpointer *) atomic, val);
|
return g_atomic_pointer_add ((gpointer *) atomic, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -403,6 +442,9 @@ gssize
|
|||||||
*
|
*
|
||||||
* This call acts as a full compiler and hardware memory barrier.
|
* This call acts as a full compiler and hardware memory barrier.
|
||||||
*
|
*
|
||||||
|
* While @atomic has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Returns: the value of @atomic before the operation, unsigned
|
* Returns: the value of @atomic before the operation, unsigned
|
||||||
*
|
*
|
||||||
* Since: 2.30
|
* Since: 2.30
|
||||||
@@ -411,7 +453,7 @@ gsize
|
|||||||
(g_atomic_pointer_and) (volatile void *atomic,
|
(g_atomic_pointer_and) (volatile void *atomic,
|
||||||
gsize val)
|
gsize val)
|
||||||
{
|
{
|
||||||
return g_atomic_pointer_and ((volatile gpointer *) atomic, val);
|
return g_atomic_pointer_and ((gpointer *) atomic, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -427,6 +469,9 @@ gsize
|
|||||||
*
|
*
|
||||||
* This call acts as a full compiler and hardware memory barrier.
|
* This call acts as a full compiler and hardware memory barrier.
|
||||||
*
|
*
|
||||||
|
* While @atomic has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Returns: the value of @atomic before the operation, unsigned
|
* Returns: the value of @atomic before the operation, unsigned
|
||||||
*
|
*
|
||||||
* Since: 2.30
|
* Since: 2.30
|
||||||
@@ -435,7 +480,7 @@ gsize
|
|||||||
(g_atomic_pointer_or) (volatile void *atomic,
|
(g_atomic_pointer_or) (volatile void *atomic,
|
||||||
gsize val)
|
gsize val)
|
||||||
{
|
{
|
||||||
return g_atomic_pointer_or ((volatile gpointer *) atomic, val);
|
return g_atomic_pointer_or ((gpointer *) atomic, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -451,6 +496,9 @@ gsize
|
|||||||
*
|
*
|
||||||
* This call acts as a full compiler and hardware memory barrier.
|
* This call acts as a full compiler and hardware memory barrier.
|
||||||
*
|
*
|
||||||
|
* While @atomic has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Returns: the value of @atomic before the operation, unsigned
|
* Returns: the value of @atomic before the operation, unsigned
|
||||||
*
|
*
|
||||||
* Since: 2.30
|
* Since: 2.30
|
||||||
@@ -459,7 +507,7 @@ gsize
|
|||||||
(g_atomic_pointer_xor) (volatile void *atomic,
|
(g_atomic_pointer_xor) (volatile void *atomic,
|
||||||
gsize val)
|
gsize val)
|
||||||
{
|
{
|
||||||
return g_atomic_pointer_xor ((volatile gpointer *) atomic, val);
|
return g_atomic_pointer_xor ((gpointer *) atomic, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined (G_PLATFORM_WIN32)
|
#elif defined (G_PLATFORM_WIN32)
|
||||||
@@ -591,7 +639,7 @@ guint
|
|||||||
gpointer
|
gpointer
|
||||||
(g_atomic_pointer_get) (const volatile void *atomic)
|
(g_atomic_pointer_get) (const volatile void *atomic)
|
||||||
{
|
{
|
||||||
const volatile gpointer *ptr = atomic;
|
const gpointer *ptr = atomic;
|
||||||
|
|
||||||
MemoryBarrier ();
|
MemoryBarrier ();
|
||||||
return *ptr;
|
return *ptr;
|
||||||
@@ -601,7 +649,7 @@ void
|
|||||||
(g_atomic_pointer_set) (volatile void *atomic,
|
(g_atomic_pointer_set) (volatile void *atomic,
|
||||||
gpointer newval)
|
gpointer newval)
|
||||||
{
|
{
|
||||||
volatile gpointer *ptr = atomic;
|
gpointer *ptr = atomic;
|
||||||
|
|
||||||
*ptr = newval;
|
*ptr = newval;
|
||||||
MemoryBarrier ();
|
MemoryBarrier ();
|
||||||
@@ -797,7 +845,7 @@ guint
|
|||||||
gpointer
|
gpointer
|
||||||
(g_atomic_pointer_get) (const volatile void *atomic)
|
(g_atomic_pointer_get) (const volatile void *atomic)
|
||||||
{
|
{
|
||||||
const volatile gpointer *ptr = atomic;
|
const gpointer *ptr = atomic;
|
||||||
gpointer value;
|
gpointer value;
|
||||||
|
|
||||||
pthread_mutex_lock (&g_atomic_lock);
|
pthread_mutex_lock (&g_atomic_lock);
|
||||||
@@ -811,7 +859,7 @@ void
|
|||||||
(g_atomic_pointer_set) (volatile void *atomic,
|
(g_atomic_pointer_set) (volatile void *atomic,
|
||||||
gpointer newval)
|
gpointer newval)
|
||||||
{
|
{
|
||||||
volatile gpointer *ptr = atomic;
|
gpointer *ptr = atomic;
|
||||||
|
|
||||||
pthread_mutex_lock (&g_atomic_lock);
|
pthread_mutex_lock (&g_atomic_lock);
|
||||||
*ptr = newval;
|
*ptr = newval;
|
||||||
@@ -823,7 +871,7 @@ gboolean
|
|||||||
gpointer oldval,
|
gpointer oldval,
|
||||||
gpointer newval)
|
gpointer newval)
|
||||||
{
|
{
|
||||||
volatile gpointer *ptr = atomic;
|
gpointer *ptr = atomic;
|
||||||
gboolean success;
|
gboolean success;
|
||||||
|
|
||||||
pthread_mutex_lock (&g_atomic_lock);
|
pthread_mutex_lock (&g_atomic_lock);
|
||||||
@@ -840,7 +888,7 @@ gssize
|
|||||||
(g_atomic_pointer_add) (volatile void *atomic,
|
(g_atomic_pointer_add) (volatile void *atomic,
|
||||||
gssize val)
|
gssize val)
|
||||||
{
|
{
|
||||||
volatile gssize *ptr = atomic;
|
gssize *ptr = atomic;
|
||||||
gssize oldval;
|
gssize oldval;
|
||||||
|
|
||||||
pthread_mutex_lock (&g_atomic_lock);
|
pthread_mutex_lock (&g_atomic_lock);
|
||||||
@@ -855,7 +903,7 @@ gsize
|
|||||||
(g_atomic_pointer_and) (volatile void *atomic,
|
(g_atomic_pointer_and) (volatile void *atomic,
|
||||||
gsize val)
|
gsize val)
|
||||||
{
|
{
|
||||||
volatile gsize *ptr = atomic;
|
gsize *ptr = atomic;
|
||||||
gsize oldval;
|
gsize oldval;
|
||||||
|
|
||||||
pthread_mutex_lock (&g_atomic_lock);
|
pthread_mutex_lock (&g_atomic_lock);
|
||||||
@@ -870,7 +918,7 @@ gsize
|
|||||||
(g_atomic_pointer_or) (volatile void *atomic,
|
(g_atomic_pointer_or) (volatile void *atomic,
|
||||||
gsize val)
|
gsize val)
|
||||||
{
|
{
|
||||||
volatile gsize *ptr = atomic;
|
gsize *ptr = atomic;
|
||||||
gsize oldval;
|
gsize oldval;
|
||||||
|
|
||||||
pthread_mutex_lock (&g_atomic_lock);
|
pthread_mutex_lock (&g_atomic_lock);
|
||||||
@@ -885,7 +933,7 @@ gsize
|
|||||||
(g_atomic_pointer_xor) (volatile void *atomic,
|
(g_atomic_pointer_xor) (volatile void *atomic,
|
||||||
gsize val)
|
gsize val)
|
||||||
{
|
{
|
||||||
volatile gsize *ptr = atomic;
|
gsize *ptr = atomic;
|
||||||
gsize oldval;
|
gsize oldval;
|
||||||
|
|
||||||
pthread_mutex_lock (&g_atomic_lock);
|
pthread_mutex_lock (&g_atomic_lock);
|
||||||
@@ -915,5 +963,5 @@ gint
|
|||||||
g_atomic_int_exchange_and_add (volatile gint *atomic,
|
g_atomic_int_exchange_and_add (volatile gint *atomic,
|
||||||
gint val)
|
gint val)
|
||||||
{
|
{
|
||||||
return (g_atomic_int_add) (atomic, val);
|
return (g_atomic_int_add) ((gint *) atomic, val);
|
||||||
}
|
}
|
||||||
|
@@ -211,7 +211,7 @@ G_END_DECLS
|
|||||||
}))
|
}))
|
||||||
#define g_atomic_pointer_and(atomic, val) \
|
#define g_atomic_pointer_and(atomic, val) \
|
||||||
(G_GNUC_EXTENSION ({ \
|
(G_GNUC_EXTENSION ({ \
|
||||||
volatile gsize *gapa_atomic = (volatile gsize *) (atomic); \
|
gsize *gapa_atomic = (gsize *) (atomic); \
|
||||||
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
|
||||||
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gsize)); \
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gsize)); \
|
||||||
(void) (0 ? (gpointer) *(atomic) : NULL); \
|
(void) (0 ? (gpointer) *(atomic) : NULL); \
|
||||||
@@ -220,7 +220,7 @@ G_END_DECLS
|
|||||||
}))
|
}))
|
||||||
#define g_atomic_pointer_or(atomic, val) \
|
#define g_atomic_pointer_or(atomic, val) \
|
||||||
(G_GNUC_EXTENSION ({ \
|
(G_GNUC_EXTENSION ({ \
|
||||||
volatile gsize *gapo_atomic = (volatile gsize *) (atomic); \
|
gsize *gapo_atomic = (gsize *) (atomic); \
|
||||||
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
|
||||||
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gsize)); \
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gsize)); \
|
||||||
(void) (0 ? (gpointer) *(atomic) : NULL); \
|
(void) (0 ? (gpointer) *(atomic) : NULL); \
|
||||||
@@ -229,7 +229,7 @@ G_END_DECLS
|
|||||||
}))
|
}))
|
||||||
#define g_atomic_pointer_xor(atomic, val) \
|
#define g_atomic_pointer_xor(atomic, val) \
|
||||||
(G_GNUC_EXTENSION ({ \
|
(G_GNUC_EXTENSION ({ \
|
||||||
volatile gsize *gapx_atomic = (volatile gsize *) (atomic); \
|
gsize *gapx_atomic = (gsize *) (atomic); \
|
||||||
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
|
||||||
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gsize)); \
|
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gsize)); \
|
||||||
(void) (0 ? (gpointer) *(atomic) : NULL); \
|
(void) (0 ? (gpointer) *(atomic) : NULL); \
|
||||||
|
@@ -126,7 +126,7 @@ struct _GDateTime
|
|||||||
/* 1 is 0001-01-01 in Proleptic Gregorian */
|
/* 1 is 0001-01-01 in Proleptic Gregorian */
|
||||||
gint32 days;
|
gint32 days;
|
||||||
|
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Time conversion {{{1 */
|
/* Time conversion {{{1 */
|
||||||
|
@@ -512,7 +512,7 @@ struct _GKeyFile
|
|||||||
|
|
||||||
gchar **locales;
|
gchar **locales;
|
||||||
|
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _GKeyFileKeyValuePair GKeyFileKeyValuePair;
|
typedef struct _GKeyFileKeyValuePair GKeyFileKeyValuePair;
|
||||||
|
@@ -272,7 +272,7 @@ struct _GMainContext
|
|||||||
guint owner_count;
|
guint owner_count;
|
||||||
GSList *waiters;
|
GSList *waiters;
|
||||||
|
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
|
|
||||||
GHashTable *sources; /* guint -> GSource */
|
GHashTable *sources; /* guint -> GSource */
|
||||||
|
|
||||||
@@ -303,7 +303,7 @@ struct _GMainContext
|
|||||||
|
|
||||||
struct _GSourceCallback
|
struct _GSourceCallback
|
||||||
{
|
{
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
GSourceFunc func;
|
GSourceFunc func;
|
||||||
gpointer data;
|
gpointer data;
|
||||||
GDestroyNotify notify;
|
GDestroyNotify notify;
|
||||||
@@ -313,7 +313,7 @@ struct _GMainLoop
|
|||||||
{
|
{
|
||||||
GMainContext *context;
|
GMainContext *context;
|
||||||
gboolean is_running; /* (atomic) */
|
gboolean is_running; /* (atomic) */
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GTimeoutSource
|
struct _GTimeoutSource
|
||||||
@@ -4749,7 +4749,7 @@ g_main_context_get_poll_func (GMainContext *context)
|
|||||||
*
|
*
|
||||||
* |[<!-- language="C" -->
|
* |[<!-- language="C" -->
|
||||||
* #define NUM_TASKS 10
|
* #define NUM_TASKS 10
|
||||||
* static volatile gint tasks_remaining = NUM_TASKS;
|
* static gint tasks_remaining = NUM_TASKS; // (atomic)
|
||||||
* ...
|
* ...
|
||||||
*
|
*
|
||||||
* while (g_atomic_int_get (&tasks_remaining) != 0)
|
* while (g_atomic_int_get (&tasks_remaining) != 0)
|
||||||
|
@@ -119,7 +119,7 @@ struct _GMarkupParseContext
|
|||||||
{
|
{
|
||||||
const GMarkupParser *parser;
|
const GMarkupParser *parser;
|
||||||
|
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
|
|
||||||
GMarkupParseFlags flags;
|
GMarkupParseFlags flags;
|
||||||
|
|
||||||
|
@@ -478,7 +478,7 @@ g_debug (const gchar *format,
|
|||||||
#if defined(G_HAVE_ISO_VARARGS) && !G_ANALYZER_ANALYZING
|
#if defined(G_HAVE_ISO_VARARGS) && !G_ANALYZER_ANALYZING
|
||||||
#define g_warning_once(...) \
|
#define g_warning_once(...) \
|
||||||
G_STMT_START { \
|
G_STMT_START { \
|
||||||
static volatile int G_PASTE (_GWarningOnceBoolean, __LINE__) = 0; \
|
static int G_PASTE (_GWarningOnceBoolean, __LINE__) = 0; /* (atomic) */ \
|
||||||
if (g_atomic_int_compare_and_exchange (&G_PASTE (_GWarningOnceBoolean, __LINE__), \
|
if (g_atomic_int_compare_and_exchange (&G_PASTE (_GWarningOnceBoolean, __LINE__), \
|
||||||
0, 1)) \
|
0, 1)) \
|
||||||
g_warning (__VA_ARGS__); \
|
g_warning (__VA_ARGS__); \
|
||||||
@@ -487,7 +487,7 @@ g_debug (const gchar *format,
|
|||||||
#elif defined(G_HAVE_GNUC_VARARGS) && !G_ANALYZER_ANALYZING
|
#elif defined(G_HAVE_GNUC_VARARGS) && !G_ANALYZER_ANALYZING
|
||||||
#define g_warning_once(format...) \
|
#define g_warning_once(format...) \
|
||||||
G_STMT_START { \
|
G_STMT_START { \
|
||||||
static volatile int G_PASTE (_GWarningOnceBoolean, __LINE__) = 0; \
|
static int G_PASTE (_GWarningOnceBoolean, __LINE__) = 0; /* (atomic) */ \
|
||||||
if (g_atomic_int_compare_and_exchange (&G_PASTE (_GWarningOnceBoolean, __LINE__), \
|
if (g_atomic_int_compare_and_exchange (&G_PASTE (_GWarningOnceBoolean, __LINE__), \
|
||||||
0, 1)) \
|
0, 1)) \
|
||||||
g_warning (format); \
|
g_warning (format); \
|
||||||
|
@@ -203,7 +203,7 @@ G_STATIC_ASSERT (G_REGEX_RAW == PCRE_UTF8);
|
|||||||
|
|
||||||
struct _GMatchInfo
|
struct _GMatchInfo
|
||||||
{
|
{
|
||||||
volatile gint ref_count; /* the ref count */
|
gint ref_count; /* the ref count (atomic) */
|
||||||
GRegex *regex; /* the regex */
|
GRegex *regex; /* the regex */
|
||||||
GRegexMatchFlags match_opts; /* options used at match time on the regex */
|
GRegexMatchFlags match_opts; /* options used at match time on the regex */
|
||||||
gint matches; /* number of matching sub patterns */
|
gint matches; /* number of matching sub patterns */
|
||||||
@@ -218,7 +218,7 @@ struct _GMatchInfo
|
|||||||
|
|
||||||
struct _GRegex
|
struct _GRegex
|
||||||
{
|
{
|
||||||
volatile gint ref_count; /* the ref count for the immutable part */
|
gint ref_count; /* the ref count for the immutable part (atomic) */
|
||||||
gchar *pattern; /* the pattern */
|
gchar *pattern; /* the pattern */
|
||||||
pcre *pcre_re; /* compiled form of the pattern */
|
pcre *pcre_re; /* compiled form of the pattern */
|
||||||
GRegexCompileFlags compile_opts; /* options used at compile time on the pattern */
|
GRegexCompileFlags compile_opts; /* options used at compile time on the pattern */
|
||||||
@@ -1300,7 +1300,7 @@ g_regex_new (const gchar *pattern,
|
|||||||
pcre *re;
|
pcre *re;
|
||||||
const gchar *errmsg;
|
const gchar *errmsg;
|
||||||
gboolean optimize = FALSE;
|
gboolean optimize = FALSE;
|
||||||
static volatile gsize initialised = 0;
|
static gsize initialised = 0;
|
||||||
|
|
||||||
g_return_val_if_fail (pattern != NULL, NULL);
|
g_return_val_if_fail (pattern != NULL, NULL);
|
||||||
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||||
|
@@ -301,7 +301,7 @@ struct _GPrivateDestructor
|
|||||||
GPrivateDestructor *next;
|
GPrivateDestructor *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
static GPrivateDestructor * volatile g_private_destructors;
|
static GPrivateDestructor *g_private_destructors; /* (atomic) prepend-only */
|
||||||
static CRITICAL_SECTION g_private_lock;
|
static CRITICAL_SECTION g_private_lock;
|
||||||
|
|
||||||
static DWORD
|
static DWORD
|
||||||
@@ -329,7 +329,7 @@ g_private_get_impl (GPrivate *key)
|
|||||||
g_thread_abort (errno, "malloc");
|
g_thread_abort (errno, "malloc");
|
||||||
destructor->index = impl;
|
destructor->index = impl;
|
||||||
destructor->notify = key->notify;
|
destructor->notify = key->notify;
|
||||||
destructor->next = g_private_destructors;
|
destructor->next = g_atomic_pointer_get (&g_private_destructors);
|
||||||
|
|
||||||
/* We need to do an atomic store due to the unlocked
|
/* We need to do an atomic store due to the unlocked
|
||||||
* access to the destructor list from the thread exit
|
* access to the destructor list from the thread exit
|
||||||
@@ -337,13 +337,14 @@ g_private_get_impl (GPrivate *key)
|
|||||||
*
|
*
|
||||||
* It can double as a sanity check...
|
* It can double as a sanity check...
|
||||||
*/
|
*/
|
||||||
if (InterlockedCompareExchangePointer (&g_private_destructors, destructor,
|
if (!g_atomic_pointer_compare_and_exchange (&g_private_destructors,
|
||||||
destructor->next) != destructor->next)
|
destructor->next,
|
||||||
|
destructor))
|
||||||
g_thread_abort (0, "g_private_get_impl(1)");
|
g_thread_abort (0, "g_private_get_impl(1)");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ditto, due to the unlocked access on the fast path */
|
/* Ditto, due to the unlocked access on the fast path */
|
||||||
if (InterlockedCompareExchangePointer (&key->p, impl, NULL) != NULL)
|
if (!g_atomic_pointer_compare_and_exchange (&key->p, NULL, impl))
|
||||||
g_thread_abort (0, "g_private_get_impl(2)");
|
g_thread_abort (0, "g_private_get_impl(2)");
|
||||||
}
|
}
|
||||||
LeaveCriticalSection (&g_private_lock);
|
LeaveCriticalSection (&g_private_lock);
|
||||||
@@ -635,7 +636,7 @@ g_thread_win32_thread_detach (void)
|
|||||||
*/
|
*/
|
||||||
dtors_called = FALSE;
|
dtors_called = FALSE;
|
||||||
|
|
||||||
for (dtor = g_private_destructors; dtor; dtor = dtor->next)
|
for (dtor = g_atomic_pointer_get (&g_private_destructors); dtor; dtor = dtor->next)
|
||||||
{
|
{
|
||||||
gpointer value;
|
gpointer value;
|
||||||
|
|
||||||
|
@@ -513,7 +513,7 @@ static GMutex g_once_mutex;
|
|||||||
static GCond g_once_cond;
|
static GCond g_once_cond;
|
||||||
static GSList *g_once_init_list = NULL;
|
static GSList *g_once_init_list = NULL;
|
||||||
|
|
||||||
static volatile guint g_thread_n_created_counter = 0;
|
static guint g_thread_n_created_counter = 0; /* (atomic) */
|
||||||
|
|
||||||
static void g_thread_cleanup (gpointer data);
|
static void g_thread_cleanup (gpointer data);
|
||||||
static GPrivate g_thread_specific_private = G_PRIVATE_INIT (g_thread_cleanup);
|
static GPrivate g_thread_specific_private = G_PRIVATE_INIT (g_thread_cleanup);
|
||||||
@@ -686,6 +686,9 @@ g_once_impl (GOnce *once,
|
|||||||
* // use initialization_value here
|
* // use initialization_value here
|
||||||
* ]|
|
* ]|
|
||||||
*
|
*
|
||||||
|
* While @location has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Returns: %TRUE if the initialization section should be entered,
|
* Returns: %TRUE if the initialization section should be entered,
|
||||||
* %FALSE and blocks otherwise
|
* %FALSE and blocks otherwise
|
||||||
*
|
*
|
||||||
@@ -694,7 +697,7 @@ g_once_impl (GOnce *once,
|
|||||||
gboolean
|
gboolean
|
||||||
(g_once_init_enter) (volatile void *location)
|
(g_once_init_enter) (volatile void *location)
|
||||||
{
|
{
|
||||||
volatile gsize *value_location = location;
|
gsize *value_location = (gsize *) location;
|
||||||
gboolean need_init = FALSE;
|
gboolean need_init = FALSE;
|
||||||
g_mutex_lock (&g_once_mutex);
|
g_mutex_lock (&g_once_mutex);
|
||||||
if (g_atomic_pointer_get (value_location) == 0)
|
if (g_atomic_pointer_get (value_location) == 0)
|
||||||
@@ -725,13 +728,16 @@ gboolean
|
|||||||
* releases concurrent threads blocking in g_once_init_enter() on this
|
* releases concurrent threads blocking in g_once_init_enter() on this
|
||||||
* initialization variable.
|
* initialization variable.
|
||||||
*
|
*
|
||||||
|
* While @location has a `volatile` qualifier, this is a historical artifact and
|
||||||
|
* the pointer passed to it should not be `volatile`.
|
||||||
|
*
|
||||||
* Since: 2.14
|
* Since: 2.14
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
(g_once_init_leave) (volatile void *location,
|
(g_once_init_leave) (volatile void *location,
|
||||||
gsize result)
|
gsize result)
|
||||||
{
|
{
|
||||||
volatile gsize *value_location = location;
|
gsize *value_location = (gsize *) location;
|
||||||
|
|
||||||
g_return_if_fail (g_atomic_pointer_get (value_location) == 0);
|
g_return_if_fail (g_atomic_pointer_get (value_location) == 0);
|
||||||
g_return_if_fail (result != 0);
|
g_return_if_fail (result != 0);
|
||||||
|
@@ -550,8 +550,8 @@ struct _GTimeVal
|
|||||||
glong tv_usec;
|
glong tv_usec;
|
||||||
} GLIB_DEPRECATED_TYPE_IN_2_62_FOR(GDateTime);
|
} GLIB_DEPRECATED_TYPE_IN_2_62_FOR(GDateTime);
|
||||||
|
|
||||||
typedef gint grefcount;
|
typedef gint grefcount;
|
||||||
typedef volatile gint gatomicrefcount;
|
typedef gint gatomicrefcount; /* should be accessed only using atomics */
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
@@ -25,7 +25,7 @@ static GMutex *mutex;
|
|||||||
static GCond *cond;
|
static GCond *cond;
|
||||||
static guint i;
|
static guint i;
|
||||||
|
|
||||||
static volatile gint freed = 0;
|
static gint freed = 0; /* (atomic) */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
notify (gpointer p)
|
notify (gpointer p)
|
||||||
@@ -63,7 +63,7 @@ testcase (void)
|
|||||||
GThread *t1;
|
GThread *t1;
|
||||||
|
|
||||||
g_static_private_init (&sp);
|
g_static_private_init (&sp);
|
||||||
freed = 0;
|
g_atomic_int_set (&freed, 0);
|
||||||
|
|
||||||
t1 = g_thread_create (thread_func, NULL, TRUE, NULL);
|
t1 = g_thread_create (thread_func, NULL, TRUE, NULL);
|
||||||
g_assert (t1 != NULL);
|
g_assert (t1 != NULL);
|
||||||
|
@@ -94,6 +94,9 @@ test_types (void)
|
|||||||
res = g_atomic_pointer_compare_and_exchange (&vp_str, NULL, str);
|
res = g_atomic_pointer_compare_and_exchange (&vp_str, NULL, str);
|
||||||
g_assert_true (res);
|
g_assert_true (res);
|
||||||
|
|
||||||
|
/* Note that atomic variables should almost certainly not be marked as
|
||||||
|
* `volatile` — see http://isvolatileusefulwiththreads.in/c/. This test exists
|
||||||
|
* to make sure that we don’t warn when built against older third party code. */
|
||||||
g_atomic_pointer_set (&vp_str_vol, NULL);
|
g_atomic_pointer_set (&vp_str_vol, NULL);
|
||||||
res = g_atomic_pointer_compare_and_exchange (&vp_str_vol, NULL, str);
|
res = g_atomic_pointer_compare_and_exchange (&vp_str_vol, NULL, str);
|
||||||
g_assert_true (res);
|
g_assert_true (res);
|
||||||
@@ -210,6 +213,9 @@ G_GNUC_END_IGNORE_DEPRECATIONS
|
|||||||
res = g_atomic_pointer_compare_and_exchange (&vp_str, NULL, (char *) str);
|
res = g_atomic_pointer_compare_and_exchange (&vp_str, NULL, (char *) str);
|
||||||
g_assert_true (res);
|
g_assert_true (res);
|
||||||
|
|
||||||
|
/* Note that atomic variables should almost certainly not be marked as
|
||||||
|
* `volatile` — see http://isvolatileusefulwiththreads.in/c/. This test exists
|
||||||
|
* to make sure that we don’t warn when built against older third party code. */
|
||||||
g_atomic_pointer_set (&vp_str_vol, NULL);
|
g_atomic_pointer_set (&vp_str_vol, NULL);
|
||||||
res = g_atomic_pointer_compare_and_exchange (&vp_str_vol, NULL, (char *) str);
|
res = g_atomic_pointer_compare_and_exchange (&vp_str_vol, NULL, (char *) str);
|
||||||
g_assert_true (res);
|
g_assert_true (res);
|
||||||
@@ -248,8 +254,8 @@ G_GNUC_END_IGNORE_DEPRECATIONS
|
|||||||
#define THREADS 10
|
#define THREADS 10
|
||||||
#define ROUNDS 10000
|
#define ROUNDS 10000
|
||||||
|
|
||||||
volatile gint bucket[THREADS];
|
gint bucket[THREADS]; /* never contested by threads, not accessed atomically */
|
||||||
volatile gint atomic;
|
gint atomic; /* (atomic) */
|
||||||
|
|
||||||
static gpointer
|
static gpointer
|
||||||
thread_func (gpointer data)
|
thread_func (gpointer data)
|
||||||
|
@@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
static GCond cond;
|
static GCond cond;
|
||||||
static GMutex mutex;
|
static GMutex mutex;
|
||||||
static volatile gint next;
|
static gint next; /* locked by @mutex */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
push_value (gint value)
|
push_value (gint value)
|
||||||
|
@@ -92,7 +92,7 @@ struct context
|
|||||||
static struct context contexts[NUM_THREADS];
|
static struct context contexts[NUM_THREADS];
|
||||||
static GThread *threads[NUM_THREADS];
|
static GThread *threads[NUM_THREADS];
|
||||||
static GWakeup *last_token_wakeup;
|
static GWakeup *last_token_wakeup;
|
||||||
static volatile gint tokens_alive;
|
static gint tokens_alive; /* (atomic) */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
context_init (struct context *ctx)
|
context_init (struct context *ctx)
|
||||||
|
@@ -1362,7 +1362,7 @@ struct _GHashTable
|
|||||||
|
|
||||||
GHashFunc hash_func;
|
GHashFunc hash_func;
|
||||||
GEqualFunc key_equal_func;
|
GEqualFunc key_equal_func;
|
||||||
volatile gint ref_count;
|
gint ref_count; /* (atomic) */
|
||||||
|
|
||||||
#ifndef G_DISABLE_ASSERT
|
#ifndef G_DISABLE_ASSERT
|
||||||
int version;
|
int version;
|
||||||
|
@@ -918,7 +918,7 @@ test_mainloop_overflow (void)
|
|||||||
g_main_context_unref (ctx);
|
g_main_context_unref (ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static volatile gint ready_time_dispatched;
|
static gint ready_time_dispatched; /* (atomic) */
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
ready_time_dispatch (GSource *source,
|
ready_time_dispatch (GSource *source,
|
||||||
@@ -964,7 +964,7 @@ test_ready_time (void)
|
|||||||
/* A source with no ready time set should not fire */
|
/* A source with no ready time set should not fire */
|
||||||
g_assert_cmpint (g_source_get_ready_time (source), ==, -1);
|
g_assert_cmpint (g_source_get_ready_time (source), ==, -1);
|
||||||
while (g_main_context_iteration (NULL, FALSE));
|
while (g_main_context_iteration (NULL, FALSE));
|
||||||
g_assert_false (ready_time_dispatched);
|
g_assert_false (g_atomic_int_get (&ready_time_dispatched));
|
||||||
|
|
||||||
/* The ready time should not have been changed */
|
/* The ready time should not have been changed */
|
||||||
g_assert_cmpint (g_source_get_ready_time (source), ==, -1);
|
g_assert_cmpint (g_source_get_ready_time (source), ==, -1);
|
||||||
@@ -978,37 +978,37 @@ test_ready_time (void)
|
|||||||
*/
|
*/
|
||||||
g_source_set_ready_time (source, g_get_monotonic_time () + G_TIME_SPAN_DAY);
|
g_source_set_ready_time (source, g_get_monotonic_time () + G_TIME_SPAN_DAY);
|
||||||
while (g_main_context_iteration (NULL, FALSE));
|
while (g_main_context_iteration (NULL, FALSE));
|
||||||
g_assert_false (ready_time_dispatched);
|
g_assert_false (g_atomic_int_get (&ready_time_dispatched));
|
||||||
/* Make sure it didn't get reset */
|
/* Make sure it didn't get reset */
|
||||||
g_assert_cmpint (g_source_get_ready_time (source), !=, -1);
|
g_assert_cmpint (g_source_get_ready_time (source), !=, -1);
|
||||||
|
|
||||||
/* Ready time of -1 -> don't fire */
|
/* Ready time of -1 -> don't fire */
|
||||||
g_source_set_ready_time (source, -1);
|
g_source_set_ready_time (source, -1);
|
||||||
while (g_main_context_iteration (NULL, FALSE));
|
while (g_main_context_iteration (NULL, FALSE));
|
||||||
g_assert_false (ready_time_dispatched);
|
g_assert_false (g_atomic_int_get (&ready_time_dispatched));
|
||||||
/* Not reset, but should still be -1 from above */
|
/* Not reset, but should still be -1 from above */
|
||||||
g_assert_cmpint (g_source_get_ready_time (source), ==, -1);
|
g_assert_cmpint (g_source_get_ready_time (source), ==, -1);
|
||||||
|
|
||||||
/* A ready time of the current time should fire immediately */
|
/* A ready time of the current time should fire immediately */
|
||||||
g_source_set_ready_time (source, g_get_monotonic_time ());
|
g_source_set_ready_time (source, g_get_monotonic_time ());
|
||||||
while (g_main_context_iteration (NULL, FALSE));
|
while (g_main_context_iteration (NULL, FALSE));
|
||||||
g_assert_true (ready_time_dispatched);
|
g_assert_true (g_atomic_int_get (&ready_time_dispatched));
|
||||||
ready_time_dispatched = FALSE;
|
g_atomic_int_set (&ready_time_dispatched, FALSE);
|
||||||
/* Should have gotten reset by the handler function */
|
/* Should have gotten reset by the handler function */
|
||||||
g_assert_cmpint (g_source_get_ready_time (source), ==, -1);
|
g_assert_cmpint (g_source_get_ready_time (source), ==, -1);
|
||||||
|
|
||||||
/* As well as one in the recent past... */
|
/* As well as one in the recent past... */
|
||||||
g_source_set_ready_time (source, g_get_monotonic_time () - G_TIME_SPAN_SECOND);
|
g_source_set_ready_time (source, g_get_monotonic_time () - G_TIME_SPAN_SECOND);
|
||||||
while (g_main_context_iteration (NULL, FALSE));
|
while (g_main_context_iteration (NULL, FALSE));
|
||||||
g_assert_true (ready_time_dispatched);
|
g_assert_true (g_atomic_int_get (&ready_time_dispatched));
|
||||||
ready_time_dispatched = FALSE;
|
g_atomic_int_set (&ready_time_dispatched, FALSE);
|
||||||
g_assert_cmpint (g_source_get_ready_time (source), ==, -1);
|
g_assert_cmpint (g_source_get_ready_time (source), ==, -1);
|
||||||
|
|
||||||
/* Zero is the 'official' way to get a source to fire immediately */
|
/* Zero is the 'official' way to get a source to fire immediately */
|
||||||
g_source_set_ready_time (source, 0);
|
g_source_set_ready_time (source, 0);
|
||||||
while (g_main_context_iteration (NULL, FALSE));
|
while (g_main_context_iteration (NULL, FALSE));
|
||||||
g_assert_true (ready_time_dispatched);
|
g_assert_true (g_atomic_int_get (&ready_time_dispatched));
|
||||||
ready_time_dispatched = FALSE;
|
g_atomic_int_set (&ready_time_dispatched, FALSE);
|
||||||
g_assert_cmpint (g_source_get_ready_time (source), ==, -1);
|
g_assert_cmpint (g_source_get_ready_time (source), ==, -1);
|
||||||
|
|
||||||
/* Now do some tests of cross-thread wakeups.
|
/* Now do some tests of cross-thread wakeups.
|
||||||
|
@@ -107,7 +107,7 @@ thread_allocate (gpointer data)
|
|||||||
gint b;
|
gint b;
|
||||||
gint size;
|
gint size;
|
||||||
gpointer p;
|
gpointer p;
|
||||||
volatile gpointer *loc;
|
gpointer *loc; /* (atomic) */
|
||||||
|
|
||||||
for (i = 0; i < 10000; i++)
|
for (i = 0; i < 10000; i++)
|
||||||
{
|
{
|
||||||
|
@@ -29,7 +29,7 @@ G_BEGIN_DECLS
|
|||||||
|
|
||||||
typedef struct _GAtomicArray GAtomicArray;
|
typedef struct _GAtomicArray GAtomicArray;
|
||||||
struct _GAtomicArray {
|
struct _GAtomicArray {
|
||||||
volatile gpointer data; /* elements - atomic */
|
gpointer data; /* elements - atomic */
|
||||||
};
|
};
|
||||||
|
|
||||||
void _g_atomic_array_init (GAtomicArray *array);
|
void _g_atomic_array_init (GAtomicArray *array);
|
||||||
@@ -42,7 +42,7 @@ void _g_atomic_array_update (GAtomicArray *array,
|
|||||||
#define G_ATOMIC_ARRAY_GET_LOCKED(_array, _type) ((_type *)((_array)->data))
|
#define G_ATOMIC_ARRAY_GET_LOCKED(_array, _type) ((_type *)((_array)->data))
|
||||||
|
|
||||||
#define G_ATOMIC_ARRAY_DO_TRANSACTION(_array, _type, _C_) G_STMT_START { \
|
#define G_ATOMIC_ARRAY_DO_TRANSACTION(_array, _type, _C_) G_STMT_START { \
|
||||||
volatile gpointer *_datap = &(_array)->data; \
|
gpointer *_datap = &(_array)->data; \
|
||||||
_type *transaction_data, *__check; \
|
_type *transaction_data, *__check; \
|
||||||
\
|
\
|
||||||
__check = g_atomic_pointer_get (_datap); \
|
__check = g_atomic_pointer_get (_datap); \
|
||||||
|
@@ -120,9 +120,9 @@
|
|||||||
GType
|
GType
|
||||||
g_binding_flags_get_type (void)
|
g_binding_flags_get_type (void)
|
||||||
{
|
{
|
||||||
static volatile gsize g_define_type_id__volatile = 0;
|
static gsize static_g_define_type_id = 0;
|
||||||
|
|
||||||
if (g_once_init_enter (&g_define_type_id__volatile))
|
if (g_once_init_enter (&static_g_define_type_id))
|
||||||
{
|
{
|
||||||
static const GFlagsValue values[] = {
|
static const GFlagsValue values[] = {
|
||||||
{ G_BINDING_DEFAULT, "G_BINDING_DEFAULT", "default" },
|
{ G_BINDING_DEFAULT, "G_BINDING_DEFAULT", "default" },
|
||||||
@@ -133,10 +133,10 @@ g_binding_flags_get_type (void)
|
|||||||
};
|
};
|
||||||
GType g_define_type_id =
|
GType g_define_type_id =
|
||||||
g_flags_register_static (g_intern_static_string ("GBindingFlags"), values);
|
g_flags_register_static (g_intern_static_string ("GBindingFlags"), values);
|
||||||
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
|
g_once_init_leave (&static_g_define_type_id, g_define_type_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_define_type_id__volatile;
|
return static_g_define_type_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define G_BINDING_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), G_TYPE_BINDING, GBindingClass))
|
#define G_BINDING_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), G_TYPE_BINDING, GBindingClass))
|
||||||
|
@@ -180,19 +180,19 @@ G_DEFINE_BOXED_TYPE (GOptionGroup, g_option_group, g_option_group_ref, g_option_
|
|||||||
GType
|
GType
|
||||||
g_strv_get_type (void)
|
g_strv_get_type (void)
|
||||||
{
|
{
|
||||||
static volatile gsize g_define_type_id__volatile = 0;
|
static gsize static_g_define_type_id = 0;
|
||||||
|
|
||||||
if (g_once_init_enter (&g_define_type_id__volatile))
|
if (g_once_init_enter (&static_g_define_type_id))
|
||||||
{
|
{
|
||||||
GType g_define_type_id =
|
GType g_define_type_id =
|
||||||
g_boxed_type_register_static (g_intern_static_string ("GStrv"),
|
g_boxed_type_register_static (g_intern_static_string ("GStrv"),
|
||||||
(GBoxedCopyFunc) g_strdupv,
|
(GBoxedCopyFunc) g_strdupv,
|
||||||
(GBoxedFreeFunc) g_strfreev);
|
(GBoxedFreeFunc) g_strfreev);
|
||||||
|
|
||||||
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
|
g_once_init_leave (&static_g_define_type_id, g_define_type_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_define_type_id__volatile;
|
return static_g_define_type_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
GType
|
GType
|
||||||
|
@@ -98,7 +98,7 @@
|
|||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
GClosure closure;
|
GClosure closure;
|
||||||
volatile gint vint;
|
gint vint;
|
||||||
} ClosureInt;
|
} ClosureInt;
|
||||||
|
|
||||||
#define CHANGE_FIELD(_closure, _field, _OP, _value, _must_set, _SET_OLD, _SET_NEW) \
|
#define CHANGE_FIELD(_closure, _field, _OP, _value, _must_set, _SET_OLD, _SET_NEW) \
|
||||||
|
@@ -175,20 +175,20 @@ struct _GClosureNotifyData
|
|||||||
struct _GClosure
|
struct _GClosure
|
||||||
{
|
{
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
volatile guint ref_count : 15;
|
guint ref_count : 15; /* (atomic) */
|
||||||
/* meta_marshal is not used anymore but must be zero for historical reasons
|
/* meta_marshal is not used anymore but must be zero for historical reasons
|
||||||
as it was exposed in the G_CLOSURE_N_NOTIFIERS macro */
|
as it was exposed in the G_CLOSURE_N_NOTIFIERS macro */
|
||||||
volatile guint meta_marshal_nouse : 1;
|
guint meta_marshal_nouse : 1; /* (atomic) */
|
||||||
volatile guint n_guards : 1;
|
guint n_guards : 1; /* (atomic) */
|
||||||
volatile guint n_fnotifiers : 2; /* finalization notifiers */
|
guint n_fnotifiers : 2; /* finalization notifiers (atomic) */
|
||||||
volatile guint n_inotifiers : 8; /* invalidation notifiers */
|
guint n_inotifiers : 8; /* invalidation notifiers (atomic) */
|
||||||
volatile guint in_inotify : 1;
|
guint in_inotify : 1; /* (atomic) */
|
||||||
volatile guint floating : 1;
|
guint floating : 1; /* (atomic) */
|
||||||
/*< protected >*/
|
/*< protected >*/
|
||||||
volatile guint derivative_flag : 1;
|
guint derivative_flag : 1; /* (atomic) */
|
||||||
/*< public >*/
|
/*< public >*/
|
||||||
volatile guint in_marshal : 1;
|
guint in_marshal : 1; /* (atomic) */
|
||||||
volatile guint is_invalid : 1;
|
guint is_invalid : 1; /* (atomic) */
|
||||||
|
|
||||||
/*< private >*/ void (*marshal) (GClosure *closure,
|
/*< private >*/ void (*marshal) (GClosure *closure,
|
||||||
GValue /*out*/ *return_value,
|
GValue /*out*/ *return_value,
|
||||||
|
@@ -13,9 +13,9 @@
|
|||||||
GType
|
GType
|
||||||
@enum_name@_get_type (void)
|
@enum_name@_get_type (void)
|
||||||
{
|
{
|
||||||
static volatile gsize g_define_type_id__volatile = 0;
|
static gsize static_g_define_type_id = 0;
|
||||||
|
|
||||||
if (g_once_init_enter (&g_define_type_id__volatile))
|
if (g_once_init_enter (&static_g_define_type_id))
|
||||||
{
|
{
|
||||||
static const G@Type@Value values[] = {
|
static const G@Type@Value values[] = {
|
||||||
/*** END value-header ***/
|
/*** END value-header ***/
|
||||||
@@ -29,10 +29,10 @@ GType
|
|||||||
};
|
};
|
||||||
GType g_define_type_id =
|
GType g_define_type_id =
|
||||||
g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
|
g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
|
||||||
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
|
g_once_init_leave (&static_g_define_type_id, g_define_type_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_define_type_id__volatile;
|
return static_g_define_type_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*** END value-tail ***/
|
/*** END value-tail ***/
|
||||||
|
@@ -174,9 +174,9 @@ typedef struct
|
|||||||
GTypeInstance g_type_instance;
|
GTypeInstance g_type_instance;
|
||||||
|
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
volatile guint ref_count;
|
guint ref_count; /* (atomic) */
|
||||||
#ifdef HAVE_OPTIONAL_FLAGS
|
#ifdef HAVE_OPTIONAL_FLAGS
|
||||||
volatile guint optional_flags;
|
guint optional_flags; /* (atomic) */
|
||||||
#endif
|
#endif
|
||||||
GData *qdata;
|
GData *qdata;
|
||||||
} GObjectReal;
|
} GObjectReal;
|
||||||
|
@@ -247,7 +247,7 @@ struct _GObject
|
|||||||
GTypeInstance g_type_instance;
|
GTypeInstance g_type_instance;
|
||||||
|
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
volatile guint ref_count;
|
guint ref_count; /* (atomic) */
|
||||||
GData *qdata;
|
GData *qdata;
|
||||||
};
|
};
|
||||||
/**
|
/**
|
||||||
|
@@ -32,7 +32,7 @@ G_DEFINE_BOXED_TYPE (GIOChannel, g_io_channel, g_io_channel_ref, g_io_channel_un
|
|||||||
GType
|
GType
|
||||||
g_io_condition_get_type (void)
|
g_io_condition_get_type (void)
|
||||||
{
|
{
|
||||||
static volatile GType etype = 0;
|
static GType etype = 0;
|
||||||
|
|
||||||
if (g_once_init_enter (&etype))
|
if (g_once_init_enter (&etype))
|
||||||
{
|
{
|
||||||
|
@@ -221,9 +221,9 @@ typedef enum
|
|||||||
/* --- structures --- */
|
/* --- structures --- */
|
||||||
struct _TypeNode
|
struct _TypeNode
|
||||||
{
|
{
|
||||||
guint volatile ref_count;
|
guint ref_count; /* (atomic) */
|
||||||
#ifdef G_ENABLE_DEBUG
|
#ifdef G_ENABLE_DEBUG
|
||||||
guint volatile instance_count;
|
guint instance_count; /* (atomic) */
|
||||||
#endif
|
#endif
|
||||||
GTypePlugin *plugin;
|
GTypePlugin *plugin;
|
||||||
guint n_children; /* writable with lock */
|
guint n_children; /* writable with lock */
|
||||||
@@ -233,7 +233,7 @@ struct _TypeNode
|
|||||||
guint is_instantiatable : 1;
|
guint is_instantiatable : 1;
|
||||||
guint mutatable_check_cache : 1; /* combines some common path checks */
|
guint mutatable_check_cache : 1; /* combines some common path checks */
|
||||||
GType *children; /* writable with lock */
|
GType *children; /* writable with lock */
|
||||||
TypeData * volatile data;
|
TypeData *data;
|
||||||
GQuark qname;
|
GQuark qname;
|
||||||
GData *global_gdata;
|
GData *global_gdata;
|
||||||
union {
|
union {
|
||||||
@@ -322,7 +322,7 @@ struct _ClassData
|
|||||||
CommonData common;
|
CommonData common;
|
||||||
guint16 class_size;
|
guint16 class_size;
|
||||||
guint16 class_private_size;
|
guint16 class_private_size;
|
||||||
int volatile init_state; /* atomic - g_type_class_ref reads it unlocked */
|
int init_state; /* (atomic) - g_type_class_ref reads it unlocked */
|
||||||
GBaseInitFunc class_init_base;
|
GBaseInitFunc class_init_base;
|
||||||
GBaseFinalizeFunc class_finalize_base;
|
GBaseFinalizeFunc class_finalize_base;
|
||||||
GClassInitFunc class_init;
|
GClassInitFunc class_init;
|
||||||
@@ -336,7 +336,7 @@ struct _InstanceData
|
|||||||
CommonData common;
|
CommonData common;
|
||||||
guint16 class_size;
|
guint16 class_size;
|
||||||
guint16 class_private_size;
|
guint16 class_private_size;
|
||||||
int volatile init_state; /* atomic - g_type_class_ref reads it unlocked */
|
int init_state; /* (atomic) - g_type_class_ref reads it unlocked */
|
||||||
GBaseInitFunc class_init_base;
|
GBaseInitFunc class_init_base;
|
||||||
GBaseFinalizeFunc class_finalize_base;
|
GBaseFinalizeFunc class_finalize_base;
|
||||||
GClassInitFunc class_init;
|
GClassInitFunc class_init;
|
||||||
@@ -569,8 +569,8 @@ type_node_new_W (TypeNode *pnode,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline IFaceEntry*
|
static inline IFaceEntry*
|
||||||
lookup_iface_entry_I (volatile IFaceEntries *entries,
|
lookup_iface_entry_I (IFaceEntries *entries,
|
||||||
TypeNode *iface_node)
|
TypeNode *iface_node)
|
||||||
{
|
{
|
||||||
guint8 *offsets;
|
guint8 *offsets;
|
||||||
guint offset_index;
|
guint offset_index;
|
||||||
@@ -1415,7 +1415,7 @@ type_node_add_iface_entry_W (TypeNode *node,
|
|||||||
|
|
||||||
if (parent_entry)
|
if (parent_entry)
|
||||||
{
|
{
|
||||||
if (node->data && node->data->class.init_state >= BASE_IFACE_INIT)
|
if (node->data && g_atomic_int_get (&node->data->class.init_state) >= BASE_IFACE_INIT)
|
||||||
{
|
{
|
||||||
entries->entry[i].init_state = INITIALIZED;
|
entries->entry[i].init_state = INITIALIZED;
|
||||||
entries->entry[i].vtable = parent_entry->vtable;
|
entries->entry[i].vtable = parent_entry->vtable;
|
||||||
@@ -1481,7 +1481,7 @@ type_add_interface_Wm (TypeNode *node,
|
|||||||
*/
|
*/
|
||||||
if (node->data)
|
if (node->data)
|
||||||
{
|
{
|
||||||
InitState class_state = node->data->class.init_state;
|
InitState class_state = g_atomic_int_get (&node->data->class.init_state);
|
||||||
|
|
||||||
if (class_state >= BASE_IFACE_INIT)
|
if (class_state >= BASE_IFACE_INIT)
|
||||||
type_iface_vtable_base_init_Wm (iface, node);
|
type_iface_vtable_base_init_Wm (iface, node);
|
||||||
@@ -2175,7 +2175,7 @@ type_class_init_Wm (TypeNode *node,
|
|||||||
g_assert (node->is_classed && node->data &&
|
g_assert (node->is_classed && node->data &&
|
||||||
node->data->class.class_size &&
|
node->data->class.class_size &&
|
||||||
!node->data->class.class &&
|
!node->data->class.class &&
|
||||||
node->data->class.init_state == UNINITIALIZED);
|
g_atomic_int_get (&node->data->class.init_state) == UNINITIALIZED);
|
||||||
if (node->data->class.class_private_size)
|
if (node->data->class.class_private_size)
|
||||||
class = g_malloc0 (ALIGN_STRUCT (node->data->class.class_size) + node->data->class.class_private_size);
|
class = g_malloc0 (ALIGN_STRUCT (node->data->class.class_size) + node->data->class.class_private_size);
|
||||||
else
|
else
|
||||||
@@ -2290,7 +2290,7 @@ type_class_init_Wm (TypeNode *node,
|
|||||||
* inherited interfaces are already init_state == INITIALIZED, because
|
* inherited interfaces are already init_state == INITIALIZED, because
|
||||||
* they either got setup in the above base_init loop, or during
|
* they either got setup in the above base_init loop, or during
|
||||||
* class_init from within type_add_interface_Wm() for this or
|
* class_init from within type_add_interface_Wm() for this or
|
||||||
* an anchestor type.
|
* an ancestor type.
|
||||||
*/
|
*/
|
||||||
i = 0;
|
i = 0;
|
||||||
while ((entries = CLASSED_NODE_IFACES_ENTRIES_LOCKED (node)) != NULL)
|
while ((entries = CLASSED_NODE_IFACES_ENTRIES_LOCKED (node)) != NULL)
|
||||||
@@ -3462,7 +3462,7 @@ g_type_depth (GType type)
|
|||||||
* be used to determine the types and order in which the leaf type is
|
* be used to determine the types and order in which the leaf type is
|
||||||
* descended from the root type.
|
* descended from the root type.
|
||||||
*
|
*
|
||||||
* Returns: immediate child of @root_type and anchestor of @leaf_type
|
* Returns: immediate child of @root_type and ancestor of @leaf_type
|
||||||
*/
|
*/
|
||||||
GType
|
GType
|
||||||
g_type_next_base (GType type,
|
g_type_next_base (GType type,
|
||||||
@@ -3549,8 +3549,8 @@ type_node_conforms_to_U (TypeNode *node,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* g_type_is_a:
|
* g_type_is_a:
|
||||||
* @type: type to check anchestry for
|
* @type: type to check ancestry for
|
||||||
* @is_a_type: possible anchestor of @type or interface that @type
|
* @is_a_type: possible ancestor of @type or interface that @type
|
||||||
* could conform to
|
* could conform to
|
||||||
*
|
*
|
||||||
* If @is_a_type is a derivable type, check whether @type is a
|
* If @is_a_type is a derivable type, check whether @type is a
|
||||||
|
@@ -1727,8 +1727,8 @@ guint g_type_get_type_registration_serial (void);
|
|||||||
* GType
|
* GType
|
||||||
* gtk_gadget_get_type (void)
|
* gtk_gadget_get_type (void)
|
||||||
* {
|
* {
|
||||||
* static volatile gsize g_define_type_id__volatile = 0;
|
* static gsize static_g_define_type_id = 0;
|
||||||
* if (g_once_init_enter (&g_define_type_id__volatile))
|
* if (g_once_init_enter (&static_g_define_type_id))
|
||||||
* {
|
* {
|
||||||
* GType g_define_type_id =
|
* GType g_define_type_id =
|
||||||
* g_type_register_static_simple (GTK_TYPE_WIDGET,
|
* g_type_register_static_simple (GTK_TYPE_WIDGET,
|
||||||
@@ -1748,9 +1748,9 @@ guint g_type_get_type_registration_serial (void);
|
|||||||
* };
|
* };
|
||||||
* g_type_add_interface_static (g_define_type_id, TYPE_GIZMO, &g_implement_interface_info);
|
* g_type_add_interface_static (g_define_type_id, TYPE_GIZMO, &g_implement_interface_info);
|
||||||
* }
|
* }
|
||||||
* g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
|
* g_once_init_leave (&static_g_define_type_id, g_define_type_id);
|
||||||
* }
|
* }
|
||||||
* return g_define_type_id__volatile;
|
* return static_g_define_type_id;
|
||||||
* }
|
* }
|
||||||
* ]|
|
* ]|
|
||||||
* The only pieces which have to be manually provided are the definitions of
|
* The only pieces which have to be manually provided are the definitions of
|
||||||
@@ -1995,17 +1995,17 @@ type_name##_get_instance_private (TypeName *self) \
|
|||||||
GType \
|
GType \
|
||||||
type_name##_get_type (void) \
|
type_name##_get_type (void) \
|
||||||
{ \
|
{ \
|
||||||
static volatile gsize g_define_type_id__volatile = 0;
|
static gsize static_g_define_type_id = 0;
|
||||||
/* Prelude goes here */
|
/* Prelude goes here */
|
||||||
|
|
||||||
/* Added for _G_DEFINE_TYPE_EXTENDED_WITH_PRELUDE */
|
/* Added for _G_DEFINE_TYPE_EXTENDED_WITH_PRELUDE */
|
||||||
#define _G_DEFINE_TYPE_EXTENDED_BEGIN_REGISTER(TypeName, type_name, TYPE_PARENT, flags) \
|
#define _G_DEFINE_TYPE_EXTENDED_BEGIN_REGISTER(TypeName, type_name, TYPE_PARENT, flags) \
|
||||||
if (g_once_init_enter (&g_define_type_id__volatile)) \
|
if (g_once_init_enter (&static_g_define_type_id)) \
|
||||||
{ \
|
{ \
|
||||||
GType g_define_type_id = type_name##_get_type_once (); \
|
GType g_define_type_id = type_name##_get_type_once (); \
|
||||||
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \
|
g_once_init_leave (&static_g_define_type_id, g_define_type_id); \
|
||||||
} \
|
} \
|
||||||
return g_define_type_id__volatile; \
|
return static_g_define_type_id; \
|
||||||
} /* closes type_name##_get_type() */ \
|
} /* closes type_name##_get_type() */ \
|
||||||
\
|
\
|
||||||
G_GNUC_NO_INLINE \
|
G_GNUC_NO_INLINE \
|
||||||
@@ -2041,8 +2041,8 @@ static void type_name##_default_init (TypeName##Interface *klass); \
|
|||||||
GType \
|
GType \
|
||||||
type_name##_get_type (void) \
|
type_name##_get_type (void) \
|
||||||
{ \
|
{ \
|
||||||
static volatile gsize g_define_type_id__volatile = 0; \
|
static gsize static_g_define_type_id = 0; \
|
||||||
if (g_once_init_enter (&g_define_type_id__volatile)) \
|
if (g_once_init_enter (&static_g_define_type_id)) \
|
||||||
{ \
|
{ \
|
||||||
GType g_define_type_id = \
|
GType g_define_type_id = \
|
||||||
g_type_register_static_simple (G_TYPE_INTERFACE, \
|
g_type_register_static_simple (G_TYPE_INTERFACE, \
|
||||||
@@ -2058,9 +2058,9 @@ type_name##_get_type (void) \
|
|||||||
#define _G_DEFINE_INTERFACE_EXTENDED_END() \
|
#define _G_DEFINE_INTERFACE_EXTENDED_END() \
|
||||||
/* following custom code */ \
|
/* following custom code */ \
|
||||||
} \
|
} \
|
||||||
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \
|
g_once_init_leave (&static_g_define_type_id, g_define_type_id); \
|
||||||
} \
|
} \
|
||||||
return g_define_type_id__volatile; \
|
return static_g_define_type_id; \
|
||||||
} /* closes type_name##_get_type() */
|
} /* closes type_name##_get_type() */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2115,13 +2115,13 @@ static GType type_name##_get_type_once (void); \
|
|||||||
GType \
|
GType \
|
||||||
type_name##_get_type (void) \
|
type_name##_get_type (void) \
|
||||||
{ \
|
{ \
|
||||||
static volatile gsize g_define_type_id__volatile = 0; \
|
static gsize static_g_define_type_id = 0; \
|
||||||
if (g_once_init_enter (&g_define_type_id__volatile)) \
|
if (g_once_init_enter (&static_g_define_type_id)) \
|
||||||
{ \
|
{ \
|
||||||
GType g_define_type_id = type_name##_get_type_once (); \
|
GType g_define_type_id = type_name##_get_type_once (); \
|
||||||
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \
|
g_once_init_leave (&static_g_define_type_id, g_define_type_id); \
|
||||||
} \
|
} \
|
||||||
return g_define_type_id__volatile; \
|
return static_g_define_type_id; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
G_GNUC_NO_INLINE \
|
G_GNUC_NO_INLINE \
|
||||||
@@ -2152,13 +2152,13 @@ static GType type_name##_get_type_once (void); \
|
|||||||
GType \
|
GType \
|
||||||
type_name##_get_type (void) \
|
type_name##_get_type (void) \
|
||||||
{ \
|
{ \
|
||||||
static volatile gsize g_define_type_id__volatile = 0; \
|
static gsize static_g_define_type_id = 0; \
|
||||||
if (g_once_init_enter (&g_define_type_id__volatile)) \
|
if (g_once_init_enter (&static_g_define_type_id)) \
|
||||||
{ \
|
{ \
|
||||||
GType g_define_type_id = type_name##_get_type_once (); \
|
GType g_define_type_id = type_name##_get_type_once (); \
|
||||||
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \
|
g_once_init_leave (&static_g_define_type_id, g_define_type_id); \
|
||||||
} \
|
} \
|
||||||
return g_define_type_id__volatile; \
|
return static_g_define_type_id; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
G_GNUC_NO_INLINE \
|
G_GNUC_NO_INLINE \
|
||||||
@@ -2205,13 +2205,13 @@ static GType type_name##_get_type_once (void); \
|
|||||||
GType \
|
GType \
|
||||||
type_name##_get_type (void) \
|
type_name##_get_type (void) \
|
||||||
{ \
|
{ \
|
||||||
static volatile gsize g_define_type_id__volatile = 0; \
|
static gsize static_g_define_type_id = 0; \
|
||||||
if (g_once_init_enter (&g_define_type_id__volatile)) \
|
if (g_once_init_enter (&static_g_define_type_id)) \
|
||||||
{ \
|
{ \
|
||||||
GType g_define_type_id = type_name##_get_type_once (); \
|
GType g_define_type_id = type_name##_get_type_once (); \
|
||||||
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \
|
g_once_init_leave (&static_g_define_type_id, g_define_type_id); \
|
||||||
} \
|
} \
|
||||||
return g_define_type_id__volatile; \
|
return static_g_define_type_id; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
G_GNUC_NO_INLINE \
|
G_GNUC_NO_INLINE \
|
||||||
|
@@ -17,7 +17,7 @@ gboolean fail;
|
|||||||
#define ROUNDS 10000
|
#define ROUNDS 10000
|
||||||
|
|
||||||
GObject *object;
|
GObject *object;
|
||||||
volatile gint bucket[THREADS];
|
gint bucket[THREADS]; /* accessed from multiple threads, but should never be contested due to the sequence of thread operations */
|
||||||
|
|
||||||
static gpointer
|
static gpointer
|
||||||
thread_func (gpointer data)
|
thread_func (gpointer data)
|
||||||
|
@@ -66,9 +66,9 @@ custom_marshal_VOID__INVOCATIONHINT (GClosure *closure,
|
|||||||
static GType
|
static GType
|
||||||
test_enum_get_type (void)
|
test_enum_get_type (void)
|
||||||
{
|
{
|
||||||
static volatile gsize g_define_type_id__volatile = 0;
|
static gsize static_g_define_type_id = 0;
|
||||||
|
|
||||||
if (g_once_init_enter (&g_define_type_id__volatile))
|
if (g_once_init_enter (&static_g_define_type_id))
|
||||||
{
|
{
|
||||||
static const GEnumValue values[] = {
|
static const GEnumValue values[] = {
|
||||||
{ TEST_ENUM_NEGATIVE, "TEST_ENUM_NEGATIVE", "negative" },
|
{ TEST_ENUM_NEGATIVE, "TEST_ENUM_NEGATIVE", "negative" },
|
||||||
@@ -79,18 +79,18 @@ test_enum_get_type (void)
|
|||||||
};
|
};
|
||||||
GType g_define_type_id =
|
GType g_define_type_id =
|
||||||
g_enum_register_static (g_intern_static_string ("TestEnum"), values);
|
g_enum_register_static (g_intern_static_string ("TestEnum"), values);
|
||||||
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
|
g_once_init_leave (&static_g_define_type_id, g_define_type_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_define_type_id__volatile;
|
return static_g_define_type_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GType
|
static GType
|
||||||
test_unsigned_enum_get_type (void)
|
test_unsigned_enum_get_type (void)
|
||||||
{
|
{
|
||||||
static volatile gsize g_define_type_id__volatile = 0;
|
static gsize static_g_define_type_id = 0;
|
||||||
|
|
||||||
if (g_once_init_enter (&g_define_type_id__volatile))
|
if (g_once_init_enter (&static_g_define_type_id))
|
||||||
{
|
{
|
||||||
static const GEnumValue values[] = {
|
static const GEnumValue values[] = {
|
||||||
{ TEST_UNSIGNED_ENUM_FOO, "TEST_UNSIGNED_ENUM_FOO", "foo" },
|
{ TEST_UNSIGNED_ENUM_FOO, "TEST_UNSIGNED_ENUM_FOO", "foo" },
|
||||||
@@ -99,10 +99,10 @@ test_unsigned_enum_get_type (void)
|
|||||||
};
|
};
|
||||||
GType g_define_type_id =
|
GType g_define_type_id =
|
||||||
g_enum_register_static (g_intern_static_string ("TestUnsignedEnum"), values);
|
g_enum_register_static (g_intern_static_string ("TestUnsignedEnum"), values);
|
||||||
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
|
g_once_init_leave (&static_g_define_type_id, g_define_type_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_define_type_id__volatile;
|
return static_g_define_type_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@@ -27,8 +27,8 @@
|
|||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <glib-object.h>
|
#include <glib-object.h>
|
||||||
|
|
||||||
static volatile int mtsafe_call_counter = 0; /* multi thread safe call counter */
|
static int mtsafe_call_counter = 0; /* multi thread safe call counter, must be accessed atomically */
|
||||||
static int unsafe_call_counter = 0; /* single-threaded call counter */
|
static int unsafe_call_counter = 0; /* single-threaded call counter */
|
||||||
static GCond sync_cond;
|
static GCond sync_cond;
|
||||||
static GMutex sync_mutex;
|
static GMutex sync_mutex;
|
||||||
|
|
||||||
|
@@ -1773,7 +1773,7 @@ endforeach
|
|||||||
# that then to silently fall back on emulated atomic ops just because
|
# that then to silently fall back on emulated atomic ops just because
|
||||||
# the user had the wrong build environment.
|
# the user had the wrong build environment.
|
||||||
atomictest = '''int main() {
|
atomictest = '''int main() {
|
||||||
volatile int atomic = 2;
|
int atomic = 2;
|
||||||
__sync_bool_compare_and_swap (&atomic, 2, 3);
|
__sync_bool_compare_and_swap (&atomic, 2, 3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1883,6 +1883,7 @@ endif
|
|||||||
|
|
||||||
# FIXME: we should make it print the result and always return 0, so that
|
# FIXME: we should make it print the result and always return 0, so that
|
||||||
# the output in meson shows up as green
|
# the output in meson shows up as green
|
||||||
|
# volatile is needed here to avoid optimisations in the test
|
||||||
stack_grows_check_prog = '''
|
stack_grows_check_prog = '''
|
||||||
volatile int *a = 0, *b = 0;
|
volatile int *a = 0, *b = 0;
|
||||||
void f (int i) {
|
void f (int i) {
|
||||||
|
@@ -52,7 +52,7 @@ static GType liststore_interfaces[6];
|
|||||||
static gpointer
|
static gpointer
|
||||||
register_types (void)
|
register_types (void)
|
||||||
{
|
{
|
||||||
static volatile gsize inited = 0;
|
static gsize inited = 0;
|
||||||
if (g_once_init_enter (&inited))
|
if (g_once_init_enter (&inited))
|
||||||
{
|
{
|
||||||
liststore_interfaces[0] = simple_register_class ("GtkBuildable", G_TYPE_INTERFACE, 0);
|
liststore_interfaces[0] = simple_register_class ("GtkBuildable", G_TYPE_INTERFACE, 0);
|
||||||
|
@@ -575,8 +575,8 @@ test_type_check_run (PerformanceTest *test,
|
|||||||
gpointer _data)
|
gpointer _data)
|
||||||
{
|
{
|
||||||
struct TypeCheckTest *data = _data;
|
struct TypeCheckTest *data = _data;
|
||||||
volatile GObject *object = data->object;
|
GObject *object = data->object;
|
||||||
volatile GType type, types[5];
|
GType type, types[5];
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
types[0] = test_iface1_get_type ();
|
types[0] = test_iface1_get_type ();
|
||||||
|
@@ -25,13 +25,13 @@
|
|||||||
|
|
||||||
static GMutex tmutex;
|
static GMutex tmutex;
|
||||||
static GCond tcond;
|
static GCond tcond;
|
||||||
static volatile int thread_call_count = 0;
|
static int thread_call_count = 0; /* (atomic) */
|
||||||
static char dummy_value = 'x';
|
static char dummy_value = 'x';
|
||||||
|
|
||||||
static void
|
static void
|
||||||
assert_singleton_execution1 (void)
|
assert_singleton_execution1 (void)
|
||||||
{
|
{
|
||||||
static volatile int seen_execution = 0;
|
static int seen_execution = 0; /* (atomic) */
|
||||||
int old_seen_execution = g_atomic_int_add (&seen_execution, 1);
|
int old_seen_execution = g_atomic_int_add (&seen_execution, 1);
|
||||||
if (old_seen_execution != 0)
|
if (old_seen_execution != 0)
|
||||||
g_error ("%s: function executed more than once", G_STRFUNC);
|
g_error ("%s: function executed more than once", G_STRFUNC);
|
||||||
@@ -40,7 +40,7 @@ assert_singleton_execution1 (void)
|
|||||||
static void
|
static void
|
||||||
assert_singleton_execution2 (void)
|
assert_singleton_execution2 (void)
|
||||||
{
|
{
|
||||||
static volatile int seen_execution = 0;
|
static int seen_execution = 0; /* (atomic) */
|
||||||
int old_seen_execution = g_atomic_int_add (&seen_execution, 1);
|
int old_seen_execution = g_atomic_int_add (&seen_execution, 1);
|
||||||
if (old_seen_execution != 0)
|
if (old_seen_execution != 0)
|
||||||
g_error ("%s: function executed more than once", G_STRFUNC);
|
g_error ("%s: function executed more than once", G_STRFUNC);
|
||||||
@@ -49,7 +49,7 @@ assert_singleton_execution2 (void)
|
|||||||
static void
|
static void
|
||||||
assert_singleton_execution3 (void)
|
assert_singleton_execution3 (void)
|
||||||
{
|
{
|
||||||
static volatile int seen_execution = 0;
|
static int seen_execution = 0; /* (atomic) */
|
||||||
int old_seen_execution = g_atomic_int_add (&seen_execution, 1);
|
int old_seen_execution = g_atomic_int_add (&seen_execution, 1);
|
||||||
if (old_seen_execution != 0)
|
if (old_seen_execution != 0)
|
||||||
g_error ("%s: function executed more than once", G_STRFUNC);
|
g_error ("%s: function executed more than once", G_STRFUNC);
|
||||||
@@ -58,7 +58,7 @@ assert_singleton_execution3 (void)
|
|||||||
static void
|
static void
|
||||||
initializer1 (void)
|
initializer1 (void)
|
||||||
{
|
{
|
||||||
static volatile gsize initialized = 0;
|
static gsize initialized = 0;
|
||||||
if (g_once_init_enter (&initialized))
|
if (g_once_init_enter (&initialized))
|
||||||
{
|
{
|
||||||
gsize initval = 42;
|
gsize initval = 42;
|
||||||
@@ -70,7 +70,7 @@ initializer1 (void)
|
|||||||
static gpointer
|
static gpointer
|
||||||
initializer2 (void)
|
initializer2 (void)
|
||||||
{
|
{
|
||||||
static volatile gsize initialized = 0;
|
static gsize initialized = 0;
|
||||||
if (g_once_init_enter (&initialized))
|
if (g_once_init_enter (&initialized))
|
||||||
{
|
{
|
||||||
void *pointer_value = &dummy_value;
|
void *pointer_value = &dummy_value;
|
||||||
@@ -83,7 +83,7 @@ initializer2 (void)
|
|||||||
static void
|
static void
|
||||||
initializer3 (void)
|
initializer3 (void)
|
||||||
{
|
{
|
||||||
static volatile gsize initialized = 0;
|
static gsize initialized = 0;
|
||||||
if (g_once_init_enter (&initialized))
|
if (g_once_init_enter (&initialized))
|
||||||
{
|
{
|
||||||
gsize initval = 42;
|
gsize initval = 42;
|
||||||
@@ -163,7 +163,7 @@ main (int argc,
|
|||||||
static void \
|
static void \
|
||||||
test_initializer_##N (void) \
|
test_initializer_##N (void) \
|
||||||
{ \
|
{ \
|
||||||
static volatile gsize initialized = 0; \
|
static gsize initialized = 0; \
|
||||||
if (g_once_init_enter (&initialized)) \
|
if (g_once_init_enter (&initialized)) \
|
||||||
{ \
|
{ \
|
||||||
g_free (g_strdup_printf ("cpuhog%5d", 1)); \
|
g_free (g_strdup_printf ("cpuhog%5d", 1)); \
|
||||||
|
@@ -26,7 +26,7 @@ struct _GTestClass
|
|||||||
};
|
};
|
||||||
|
|
||||||
static GType my_test_get_type (void);
|
static GType my_test_get_type (void);
|
||||||
static volatile gboolean stopping;
|
static gint stopping; /* (atomic) */
|
||||||
|
|
||||||
static void my_test_class_init (GTestClass * klass);
|
static void my_test_class_init (GTestClass * klass);
|
||||||
static void my_test_init (GTest * test);
|
static void my_test_init (GTest * test);
|
||||||
@@ -101,7 +101,7 @@ run_thread (GTest * test)
|
|||||||
{
|
{
|
||||||
gint i = 1;
|
gint i = 1;
|
||||||
|
|
||||||
while (!stopping) {
|
while (!g_atomic_int_get (&stopping)) {
|
||||||
my_test_do_refcount (test);
|
my_test_do_refcount (test);
|
||||||
if ((i++ % 10000) == 0) {
|
if ((i++ % 10000) == 0) {
|
||||||
g_print (".");
|
g_print (".");
|
||||||
@@ -128,7 +128,7 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
|
test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
|
||||||
|
|
||||||
stopping = FALSE;
|
g_atomic_int_set (&stopping, 0);
|
||||||
|
|
||||||
for (i = 0; i < n_threads; i++) {
|
for (i = 0; i < n_threads; i++) {
|
||||||
GThread *thread;
|
GThread *thread;
|
||||||
@@ -141,7 +141,7 @@ main (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
g_usleep (5000000);
|
g_usleep (5000000);
|
||||||
|
|
||||||
stopping = TRUE;
|
g_atomic_int_set (&stopping, 1);
|
||||||
|
|
||||||
g_print ("\nstopping\n");
|
g_print ("\nstopping\n");
|
||||||
|
|
||||||
|
@@ -34,7 +34,7 @@ struct _GTestClass
|
|||||||
static GType my_test_get_type (void);
|
static GType my_test_get_type (void);
|
||||||
G_DEFINE_TYPE (GTest, my_test, G_TYPE_OBJECT)
|
G_DEFINE_TYPE (GTest, my_test, G_TYPE_OBJECT)
|
||||||
|
|
||||||
static volatile gboolean stopping;
|
static gint stopping; /* (atomic) */
|
||||||
|
|
||||||
static void my_test_get_property (GObject *object,
|
static void my_test_get_property (GObject *object,
|
||||||
guint prop_id,
|
guint prop_id,
|
||||||
@@ -140,7 +140,7 @@ run_thread (GTest * test)
|
|||||||
{
|
{
|
||||||
gint i = 1;
|
gint i = 1;
|
||||||
|
|
||||||
while (!stopping) {
|
while (!g_atomic_int_get (&stopping)) {
|
||||||
my_test_do_property (test);
|
my_test_do_property (test);
|
||||||
if ((i++ % 10000) == 0)
|
if ((i++ % 10000) == 0)
|
||||||
{
|
{
|
||||||
@@ -170,7 +170,7 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
|
test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
|
||||||
|
|
||||||
stopping = FALSE;
|
g_atomic_int_set (&stopping, 0);
|
||||||
|
|
||||||
for (i = 0; i < n_threads; i++) {
|
for (i = 0; i < n_threads; i++) {
|
||||||
GThread *thread;
|
GThread *thread;
|
||||||
@@ -180,7 +180,7 @@ main (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
g_usleep (30000000);
|
g_usleep (30000000);
|
||||||
|
|
||||||
stopping = TRUE;
|
g_atomic_int_set (&stopping, 1);
|
||||||
g_print ("\nstopping\n");
|
g_print ("\nstopping\n");
|
||||||
|
|
||||||
/* join all threads */
|
/* join all threads */
|
||||||
|
Reference in New Issue
Block a user