mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-01-12 07:26:15 +01:00
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:
parent
c68903945d
commit
e305fe971e
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user