diff options
| author | Koop Mast <kwm@FreeBSD.org> | 2018-01-26 21:26:57 +0000 |
|---|---|---|
| committer | Koop Mast <kwm@FreeBSD.org> | 2018-01-26 21:26:57 +0000 |
| commit | cb48ab9bf7e8cfa0c6979755e0df8e7adab4cb61 (patch) | |
| tree | 4c1062036c0d4e53d4d7816d73faebd87824d46b /devel/glib20/files/patch-gio_kqueue_kqueue-helper.c | |
| parent | Update 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.c | 81 |
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); |
