diff --git a/gio/gfilemonitor.c b/gio/gfilemonitor.c index bcfa3636f..f78fad2e9 100644 --- a/gio/gfilemonitor.c +++ b/gio/gfilemonitor.c @@ -23,12 +23,13 @@ #include "config.h" #include +#include "gfile.h" #include "gfilemonitor.h" #include "gioenumtypes.h" -#include "gmarshal-internal.h" -#include "gfile.h" -#include "gvfs.h" +#include "glib.h" #include "glibintl.h" +#include "gmarshal-internal.h" +#include "gvfs.h" /** * GFileMonitor: @@ -50,9 +51,15 @@ #define DEFAULT_RATE_LIMIT_MSECS 800 +typedef enum { + CANCEL_STATE_NONE, + CANCEL_STATE_CANCELLING, + CANCEL_STATE_CANCELLED, +} GFileMonitorCancelState; + struct _GFileMonitorPrivate { - gboolean cancelled; + int cancelled; /* atomic */ }; G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GFileMonitor, g_file_monitor, G_TYPE_OBJECT) @@ -219,13 +226,9 @@ g_file_monitor_class_init (GFileMonitorClass *klass) gboolean g_file_monitor_is_cancelled (GFileMonitor *monitor) { - gboolean res; - g_return_val_if_fail (G_IS_FILE_MONITOR (monitor), FALSE); - res = monitor->priv->cancelled; - - return res; + return g_atomic_int_get (&monitor->priv->cancelled) == CANCEL_STATE_CANCELLED; } /** @@ -241,11 +244,13 @@ g_file_monitor_cancel (GFileMonitor *monitor) { g_return_val_if_fail (G_IS_FILE_MONITOR (monitor), FALSE); - if (!monitor->priv->cancelled) + if (g_atomic_int_compare_and_exchange (&monitor->priv->cancelled, + CANCEL_STATE_NONE, + CANCEL_STATE_CANCELLING)) { G_FILE_MONITOR_GET_CLASS (monitor)->cancel (monitor); - monitor->priv->cancelled = TRUE; + g_atomic_int_set (&monitor->priv->cancelled, CANCEL_STATE_CANCELLED); g_object_notify (G_OBJECT (monitor), "cancelled"); } @@ -293,7 +298,7 @@ g_file_monitor_emit_event (GFileMonitor *monitor, g_return_if_fail (G_IS_FILE (child)); g_return_if_fail (!other_file || G_IS_FILE (other_file)); - if (monitor->priv->cancelled) + if (g_atomic_int_get (&monitor->priv->cancelled) != CANCEL_STATE_NONE) return; g_signal_emit (monitor, g_file_monitor_changed_signal, 0, child, other_file, event_type); diff --git a/gio/tests/meson.build b/gio/tests/meson.build index 682453d1f..ba04916c3 100644 --- a/gio/tests/meson.build +++ b/gio/tests/meson.build @@ -134,7 +134,11 @@ gio_tests = { 'vfs' : {}, 'volumemonitor' : {}, 'glistmodel' : {}, - 'testfilemonitor' : {'suite' : ['slow', 'flaky']}, + 'testfilemonitor' : { + 'suite' : ['slow'], + # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/1392 + 'can_fail' : host_system in ['darwin'], + }, 'thumbnail-verification' : {}, 'tls-certificate' : {'extra_sources' : ['gtesttlsbackend.c']}, 'tls-interaction' : {'extra_sources' : ['gtesttlsbackend.c']},