[glib: 3/6] gmain: Make GUnixSignalWatchSource pending field atomic
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib: 3/6] gmain: Make GUnixSignalWatchSource pending field atomic
- Date: Tue, 13 Nov 2018 16:04:43 +0000 (UTC)
commit 9e652f94d285b1722ea82a0465c6724eee346738
Author: Tomasz Miąsko <tomasz miasko gmail com>
Date: Thu Nov 1 00:00:00 2018 +0000
gmain: Make GUnixSignalWatchSource pending field atomic
Ensure synchronization between prepare / check /dispatch of
GUnixSignalWatchSource and UNIX signal dispatcher by making operations
on `pending` field atomic.
Issue #1312.
glib/gmain.c | 16 ++++++----------
1 file changed, 6 insertions(+), 10 deletions(-)
---
diff --git a/glib/gmain.c b/glib/gmain.c
index ad57b4927..07ec867bc 100644
--- a/glib/gmain.c
+++ b/glib/gmain.c
@@ -5138,14 +5138,10 @@ dispatch_unix_signals_unlocked (void)
{
GUnixSignalWatchSource *source = node->data;
- if (!source->pending)
+ if (pending[source->signum] &&
+ g_atomic_int_compare_and_exchange (&source->pending, FALSE, TRUE))
{
- if (pending[source->signum])
- {
- source->pending = TRUE;
-
- wake_source ((GSource *) source);
- }
+ wake_source ((GSource *) source);
}
}
@@ -5188,7 +5184,7 @@ g_unix_signal_watch_prepare (GSource *source,
unix_signal_source = (GUnixSignalWatchSource *) source;
- return unix_signal_source->pending;
+ return g_atomic_int_get (&unix_signal_source->pending);
}
static gboolean
@@ -5198,7 +5194,7 @@ g_unix_signal_watch_check (GSource *source)
unix_signal_source = (GUnixSignalWatchSource *) source;
- return unix_signal_source->pending;
+ return g_atomic_int_get (&unix_signal_source->pending);
}
static gboolean
@@ -5220,7 +5216,7 @@ g_unix_signal_watch_dispatch (GSource *source,
again = (callback) (user_data);
- unix_signal_source->pending = FALSE;
+ g_atomic_int_set (&unix_signal_source->pending, FALSE);
return again;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]