gio: Always purge kqueue subs from missing list

Previously, _kh_cancel_sub assumed that it only needed to call
_km_remove if sub did not exist in subs_hash_table. This is erroneous
because the complementary operation, _km_add_missing, can be called
from process_kqueue_notifications, in which context sub can *only* have
come from subs_hash_table.

Since _km_remove is implemented using g_slist_remove, which is
documented to be a noop if the list does not contain the element to be
removed, it is safe to call _km_remove unconditionally here.

https://bugzilla.gnome.org/show_bug.cgi?id=778515
This commit is contained in:
Steven McDonald 2017-02-12 11:02:55 +11:00 committed by Philip Withnall
parent c68903945d
commit e305fe971e

View File

@ -498,22 +498,17 @@ _kh_add_sub (kqueue_sub *sub)
gboolean gboolean
_kh_cancel_sub (kqueue_sub *sub) _kh_cancel_sub (kqueue_sub *sub)
{ {
gboolean missing = FALSE; gboolean removed = FALSE;
g_assert (kqueue_socket_pair[0] != -1); g_assert (kqueue_socket_pair[0] != -1);
g_assert (sub != NULL); g_assert (sub != NULL);
_km_remove (sub);
G_LOCK (hash_lock); G_LOCK (hash_lock);
missing = !g_hash_table_remove (subs_hash_table, GINT_TO_POINTER (sub->fd)); removed = g_hash_table_remove (subs_hash_table, GINT_TO_POINTER (sub->fd));
G_UNLOCK (hash_lock); G_UNLOCK (hash_lock);
if (missing) if (removed)
{
/* If there were no fd for this subscription, file is still
* missing. */
KH_W ("Removing subscription from missing");
_km_remove (sub);
}
else
{ {
/* fd will be closed in the kqueue thread */ /* fd will be closed in the kqueue thread */
_kqueue_thread_remove_fd (sub->fd); _kqueue_thread_remove_fd (sub->fd);