mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-26 12:12:10 +01:00
gsignal: Cleanup g_signal_emitv splitting it in locked and unlocked paths
It just makes code easier to maintain and more clearly scoped.
This commit is contained in:
parent
f011910395
commit
e5ee6e141d
@ -3172,6 +3172,12 @@ g_signal_has_handler_pending (gpointer instance,
|
|||||||
return has_pending;
|
return has_pending;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
signal_emitv_unlocked (const GValue *instance_and_params,
|
||||||
|
guint signal_id,
|
||||||
|
GQuark detail,
|
||||||
|
GValue *return_value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* g_signal_emitv:
|
* g_signal_emitv:
|
||||||
* @instance_and_params: (array): argument list for the signal emission.
|
* @instance_and_params: (array): argument list for the signal emission.
|
||||||
@ -3194,6 +3200,17 @@ g_signal_emitv (const GValue *instance_and_params,
|
|||||||
guint signal_id,
|
guint signal_id,
|
||||||
GQuark detail,
|
GQuark detail,
|
||||||
GValue *return_value)
|
GValue *return_value)
|
||||||
|
{
|
||||||
|
SIGNAL_LOCK ();
|
||||||
|
signal_emitv_unlocked (instance_and_params, signal_id, detail, return_value);
|
||||||
|
SIGNAL_UNLOCK ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
signal_emitv_unlocked (const GValue *instance_and_params,
|
||||||
|
guint signal_id,
|
||||||
|
GQuark detail,
|
||||||
|
GValue *return_value)
|
||||||
{
|
{
|
||||||
gpointer instance;
|
gpointer instance;
|
||||||
SignalNode *node;
|
SignalNode *node;
|
||||||
@ -3211,19 +3228,16 @@ g_signal_emitv (const GValue *instance_and_params,
|
|||||||
param_values = instance_and_params + 1;
|
param_values = instance_and_params + 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SIGNAL_LOCK ();
|
|
||||||
node = LOOKUP_SIGNAL_NODE (signal_id);
|
node = LOOKUP_SIGNAL_NODE (signal_id);
|
||||||
if (!node || !g_type_is_a (G_TYPE_FROM_INSTANCE (instance), node->itype))
|
if (!node || !g_type_is_a (G_TYPE_FROM_INSTANCE (instance), node->itype))
|
||||||
{
|
{
|
||||||
g_critical ("%s: signal id '%u' is invalid for instance '%p'", G_STRLOC, signal_id, instance);
|
g_critical ("%s: signal id '%u' is invalid for instance '%p'", G_STRLOC, signal_id, instance);
|
||||||
SIGNAL_UNLOCK ();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef G_ENABLE_DEBUG
|
#ifdef G_ENABLE_DEBUG
|
||||||
if (detail && !(node->flags & G_SIGNAL_DETAILED))
|
if (detail && !(node->flags & G_SIGNAL_DETAILED))
|
||||||
{
|
{
|
||||||
g_critical ("%s: signal id '%u' does not support detail (%u)", G_STRLOC, signal_id, detail);
|
g_critical ("%s: signal id '%u' does not support detail (%u)", G_STRLOC, signal_id, detail);
|
||||||
SIGNAL_UNLOCK ();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (i = 0; i < node->n_params; i++)
|
for (i = 0; i < node->n_params; i++)
|
||||||
@ -3235,7 +3249,6 @@ g_signal_emitv (const GValue *instance_and_params,
|
|||||||
i,
|
i,
|
||||||
node->name,
|
node->name,
|
||||||
G_VALUE_TYPE_NAME (param_values + i));
|
G_VALUE_TYPE_NAME (param_values + i));
|
||||||
SIGNAL_UNLOCK ();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (node->return_type != G_TYPE_NONE)
|
if (node->return_type != G_TYPE_NONE)
|
||||||
@ -3246,7 +3259,6 @@ g_signal_emitv (const GValue *instance_and_params,
|
|||||||
G_STRLOC,
|
G_STRLOC,
|
||||||
type_debug_name (node->return_type),
|
type_debug_name (node->return_type),
|
||||||
node->name);
|
node->name);
|
||||||
SIGNAL_UNLOCK ();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (!node->accumulator && !G_TYPE_CHECK_VALUE_TYPE (return_value, node->return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE))
|
else if (!node->accumulator && !G_TYPE_CHECK_VALUE_TYPE (return_value, node->return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE))
|
||||||
@ -3256,7 +3268,6 @@ g_signal_emitv (const GValue *instance_and_params,
|
|||||||
type_debug_name (node->return_type),
|
type_debug_name (node->return_type),
|
||||||
node->name,
|
node->name,
|
||||||
G_VALUE_TYPE_NAME (return_value));
|
G_VALUE_TYPE_NAME (return_value));
|
||||||
SIGNAL_UNLOCK ();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3283,7 +3294,6 @@ g_signal_emitv (const GValue *instance_and_params,
|
|||||||
if (hlist == NULL || hlist->handlers == NULL)
|
if (hlist == NULL || hlist->handlers == NULL)
|
||||||
{
|
{
|
||||||
/* nothing to do to emit this signal */
|
/* nothing to do to emit this signal */
|
||||||
SIGNAL_UNLOCK ();
|
|
||||||
/* g_printerr ("omitting emission of \"%s\"\n", node->name); */
|
/* g_printerr ("omitting emission of \"%s\"\n", node->name); */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3291,6 +3301,7 @@ g_signal_emitv (const GValue *instance_and_params,
|
|||||||
|
|
||||||
SIGNAL_UNLOCK ();
|
SIGNAL_UNLOCK ();
|
||||||
signal_emit_unlocked_R (node, detail, instance, return_value, instance_and_params);
|
signal_emit_unlocked_R (node, detail, instance, return_value, instance_and_params);
|
||||||
|
SIGNAL_LOCK ();
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline gboolean
|
static inline gboolean
|
||||||
|
Loading…
x
Reference in New Issue
Block a user