summaryrefslogtreecommitdiff
path: root/devel/glib20/files/patch-gio_kqueue_kqueue-helper.c
diff options
context:
space:
mode:
authorKoop Mast <kwm@FreeBSD.org>2018-01-26 21:26:57 +0000
committerKoop Mast <kwm@FreeBSD.org>2018-01-26 21:26:57 +0000
commitcb48ab9bf7e8cfa0c6979755e0df8e7adab4cb61 (patch)
tree4c1062036c0d4e53d4d7816d73faebd87824d46b /devel/glib20/files/patch-gio_kqueue_kqueue-helper.c
parentUpdate meson to 0.44.0. (diff)
Update glib to 2.50.3.
Also redo the kqueue patches. Now we patch files only once, and add some bits that got lost somewhere (which is probably my fault). Which where causing crashes when for example nautilus or thundar where monitoring directories and files where added/removed. PR: 199872
Diffstat (limited to 'devel/glib20/files/patch-gio_kqueue_kqueue-helper.c')
-rw-r--r--devel/glib20/files/patch-gio_kqueue_kqueue-helper.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/devel/glib20/files/patch-gio_kqueue_kqueue-helper.c b/devel/glib20/files/patch-gio_kqueue_kqueue-helper.c
new file mode 100644
index 000000000000..bc1493820930
--- /dev/null
+++ b/devel/glib20/files/patch-gio_kqueue_kqueue-helper.c
@@ -0,0 +1,81 @@
+This bug combines serveral patches:
+https://bugzilla.gnome.org/show_bug.cgi?id=778515
+and
+https://bugzilla.gnome.org/show_bug.cgi?id=739424
+https://bug739424.bugzilla-attachments.gnome.org/attachment.cgi?id=351191
+
+--- gio/kqueue/kqueue-helper.c.orig 2018-01-15 21:22:08.234860000 +0100
++++ gio/kqueue/kqueue-helper.c 2018-01-15 21:21:54.143656000 +0100
+@@ -43,7 +43,7 @@ static gboolean kh_debug_enabled = FALSE;
+ #define KH_W if (kh_debug_enabled) g_warning
+
+ static GHashTable *subs_hash_table = NULL;
+-G_LOCK_DEFINE_STATIC (hash_lock);
++G_LOCK_DEFINE (hash_lock);
+
+ static int kqueue_descriptor = -1;
+ static int kqueue_socket_pair[] = {-1, -1};
+@@ -291,10 +291,10 @@ process_kqueue_notifications (GIOChannel *gioc,
+
+ G_LOCK (hash_lock);
+ sub = (kqueue_sub *) g_hash_table_lookup (subs_hash_table, GINT_TO_POINTER (n.fd));
+- G_UNLOCK (hash_lock);
+
+ if (sub == NULL)
+ {
++ G_UNLOCK (hash_lock);
+ KH_W ("Got a notification for a deleted or non-existing subscription %d",
+ n.fd);
+ return TRUE;
+@@ -336,6 +336,7 @@ process_kqueue_notifications (GIOChannel *gioc,
+ g_file_monitor_source_handle_event (source, mask, NULL, NULL, NULL, g_get_monotonic_time ());
+ }
+
++ G_UNLOCK (hash_lock);
+ return TRUE;
+ }
+
+@@ -451,13 +452,14 @@ _kh_start_watching (kqueue_sub *sub)
+
+ G_LOCK (hash_lock);
+ g_hash_table_insert (subs_hash_table, GINT_TO_POINTER (sub->fd), sub);
+- G_UNLOCK (hash_lock);
+
+ _kqueue_thread_push_fd (sub->fd);
+
+ /* Bump the kqueue thread. It will pick up a new sub entry to monitor */
+ if (!_ku_write (kqueue_socket_pair[0], "A", 1))
+ KH_W ("Failed to bump the kqueue thread (add fd, error %d)", errno);
++ G_UNLOCK (hash_lock);
++
+ return TRUE;
+ }
+
+@@ -498,22 +500,15 @@ _kh_add_sub (kqueue_sub *sub)
+ gboolean
+ _kh_cancel_sub (kqueue_sub *sub)
+ {
+- gboolean missing = FALSE;
++ gboolean removed = FALSE;
+ g_assert (kqueue_socket_pair[0] != -1);
+ g_assert (sub != NULL);
+
+- G_LOCK (hash_lock);
+- missing = !g_hash_table_remove (subs_hash_table, GINT_TO_POINTER (sub->fd));
+- G_UNLOCK (hash_lock);
++ _km_remove (sub);
+
+- if (missing)
+- {
+- /* If there were no fd for this subscription, file is still
+- * missing. */
+- KH_W ("Removing subscription from missing");
+- _km_remove (sub);
+- }
+- else
++ removed = g_hash_table_remove (subs_hash_table, GINT_TO_POINTER (sub->fd));
++
++ if (removed)
+ {
+ /* fd will be closed in the kqueue thread */
+ _kqueue_thread_remove_fd (sub->fd);