main: Create a helper function for "owner wakeup" optimization

The original patch really should have introduced a helper - among
other things it deserves a code comment.  We're likely to make
further changes too, so it's obviously better to only do it in one
place.

See: https://bugzilla.gnome.org/show_bug.cgi?id=761102
This commit is contained in:
Colin Walters 2017-03-31 16:19:58 -04:00
parent 4efb8b4f7b
commit 2087024049

View File

@ -1118,6 +1118,19 @@ source_remove_from_context (GSource *source,
} }
} }
/* See https://bugzilla.gnome.org/show_bug.cgi?id=761102 for
* the introduction of this.
*
* The main optimization is to avoid waking up the main
* context if a change is made by the current owner.
*/
static void
conditional_wakeup (GMainContext *context)
{
if (context->owner && context->owner != G_THREAD_SELF)
g_wakeup_signal (context->wakeup);
}
static guint static guint
g_source_attach_unlocked (GSource *source, g_source_attach_unlocked (GSource *source,
GMainContext *context, GMainContext *context,
@ -1164,8 +1177,8 @@ g_source_attach_unlocked (GSource *source,
/* If another thread has acquired the context, wake it up since it /* If another thread has acquired the context, wake it up since it
* might be in poll() right now. * might be in poll() right now.
*/ */
if (do_wakeup && context->owner && context->owner != G_THREAD_SELF) if (do_wakeup)
g_wakeup_signal (context->wakeup); conditional_wakeup (context);
return source->source_id; return source->source_id;
} }
@ -1842,8 +1855,7 @@ g_source_set_ready_time (GSource *source,
{ {
/* Quite likely that we need to change the timeout on the poll */ /* Quite likely that we need to change the timeout on the poll */
if (!SOURCE_BLOCKED (source)) if (!SOURCE_BLOCKED (source))
if (context->owner && context->owner != G_THREAD_SELF) conditional_wakeup (context);
g_wakeup_signal (context->wakeup);
UNLOCK_CONTEXT (context); UNLOCK_CONTEXT (context);
} }
} }
@ -4361,8 +4373,7 @@ g_main_context_add_poll_unlocked (GMainContext *context,
context->poll_changed = TRUE; context->poll_changed = TRUE;
/* Now wake up the main loop if it is waiting in the poll() */ /* Now wake up the main loop if it is waiting in the poll() */
if (context->owner && context->owner != G_THREAD_SELF) conditional_wakeup (context);
g_wakeup_signal (context->wakeup);
} }
/** /**
@ -4422,8 +4433,7 @@ g_main_context_remove_poll_unlocked (GMainContext *context,
context->poll_changed = TRUE; context->poll_changed = TRUE;
/* Now wake up the main loop if it is waiting in the poll() */ /* Now wake up the main loop if it is waiting in the poll() */
if (context->owner && context->owner != G_THREAD_SELF) conditional_wakeup (context);
g_wakeup_signal (context->wakeup);
} }
/** /**