Fix the accidental revert of the fixes from #112222 that happened when the

Fri Mar 19 15:21:09 2004  Owen Taylor  <otaylor@redhat.com>

        * glib/gmain.c: Fix the accidental revert of the
        fixes from #112222 that happened when the GChildWatch
        code was added.
This commit is contained in:
Owen Taylor 2004-03-19 20:25:03 +00:00 committed by Owen Taylor
parent 974dbaef86
commit 9753964fe6
7 changed files with 112 additions and 19 deletions

View File

@ -1,3 +1,9 @@
Fri Mar 19 15:21:09 2004 Owen Taylor <otaylor@redhat.com>
* glib/gmain.c: Fix the accidental revert of the
fixes from #112222 that happened when the GChildWatch
code was added.
Fri Mar 19 11:07:06 2004 Owen Taylor <otaylor@redhat.com> Fri Mar 19 11:07:06 2004 Owen Taylor <otaylor@redhat.com>
* tests/atomic-test.c (main): Make computation * tests/atomic-test.c (main): Make computation

View File

@ -1,3 +1,9 @@
Fri Mar 19 15:21:09 2004 Owen Taylor <otaylor@redhat.com>
* glib/gmain.c: Fix the accidental revert of the
fixes from #112222 that happened when the GChildWatch
code was added.
Fri Mar 19 11:07:06 2004 Owen Taylor <otaylor@redhat.com> Fri Mar 19 11:07:06 2004 Owen Taylor <otaylor@redhat.com>
* tests/atomic-test.c (main): Make computation * tests/atomic-test.c (main): Make computation

View File

@ -1,3 +1,9 @@
Fri Mar 19 15:21:09 2004 Owen Taylor <otaylor@redhat.com>
* glib/gmain.c: Fix the accidental revert of the
fixes from #112222 that happened when the GChildWatch
code was added.
Fri Mar 19 11:07:06 2004 Owen Taylor <otaylor@redhat.com> Fri Mar 19 11:07:06 2004 Owen Taylor <otaylor@redhat.com>
* tests/atomic-test.c (main): Make computation * tests/atomic-test.c (main): Make computation

View File

@ -1,3 +1,9 @@
Fri Mar 19 15:21:09 2004 Owen Taylor <otaylor@redhat.com>
* glib/gmain.c: Fix the accidental revert of the
fixes from #112222 that happened when the GChildWatch
code was added.
Fri Mar 19 11:07:06 2004 Owen Taylor <otaylor@redhat.com> Fri Mar 19 11:07:06 2004 Owen Taylor <otaylor@redhat.com>
* tests/atomic-test.c (main): Make computation * tests/atomic-test.c (main): Make computation

View File

@ -1,3 +1,9 @@
Fri Mar 19 15:21:09 2004 Owen Taylor <otaylor@redhat.com>
* glib/gmain.c: Fix the accidental revert of the
fixes from #112222 that happened when the GChildWatch
code was added.
Fri Mar 19 11:07:06 2004 Owen Taylor <otaylor@redhat.com> Fri Mar 19 11:07:06 2004 Owen Taylor <otaylor@redhat.com>
* tests/atomic-test.c (main): Make computation * tests/atomic-test.c (main): Make computation

View File

@ -1,3 +1,9 @@
Fri Mar 19 15:21:09 2004 Owen Taylor <otaylor@redhat.com>
* glib/gmain.c: Fix the accidental revert of the
fixes from #112222 that happened when the GChildWatch
code was added.
Fri Mar 19 11:07:06 2004 Owen Taylor <otaylor@redhat.com> Fri Mar 19 11:07:06 2004 Owen Taylor <otaylor@redhat.com>
* tests/atomic-test.c (main): Make computation * tests/atomic-test.c (main): Make computation

View File

@ -202,6 +202,8 @@ struct _GPollRec
#endif #endif
#define SOURCE_DESTROYED(source) (((source)->flags & G_HOOK_FLAG_ACTIVE) == 0) #define SOURCE_DESTROYED(source) (((source)->flags & G_HOOK_FLAG_ACTIVE) == 0)
#define SOURCE_BLOCKED(source) (((source)->flags & G_HOOK_FLAG_IN_CALL) != 0 && \
((source)->flags & G_SOURCE_CAN_RECURSE) == 0)
#define SOURCE_UNREF(source, context) \ #define SOURCE_UNREF(source, context) \
G_STMT_START { \ G_STMT_START { \
@ -974,14 +976,17 @@ g_source_destroy_internal (GSource *source,
old_cb_funcs->unref (old_cb_data); old_cb_funcs->unref (old_cb_data);
LOCK_CONTEXT (context); LOCK_CONTEXT (context);
} }
tmp_list = source->poll_fds; if (!SOURCE_BLOCKED (source))
while (tmp_list)
{ {
g_main_context_remove_poll_unlocked (context, tmp_list->data); tmp_list = source->poll_fds;
tmp_list = tmp_list->next; while (tmp_list)
{
g_main_context_remove_poll_unlocked (context, tmp_list->data);
tmp_list = tmp_list->next;
}
} }
g_source_unref_internal (source, context, TRUE); g_source_unref_internal (source, context, TRUE);
} }
@ -1087,7 +1092,8 @@ g_source_add_poll (GSource *source,
if (context) if (context)
{ {
g_main_context_add_poll_unlocked (context, source->priority, fd); if (!SOURCE_BLOCKED (source))
g_main_context_add_poll_unlocked (context, source->priority, fd);
UNLOCK_CONTEXT (context); UNLOCK_CONTEXT (context);
} }
} }
@ -1119,7 +1125,8 @@ g_source_remove_poll (GSource *source,
if (context) if (context)
{ {
g_main_context_remove_poll_unlocked (context, fd); if (!SOURCE_BLOCKED (source))
g_main_context_remove_poll_unlocked (context, fd);
UNLOCK_CONTEXT (context); UNLOCK_CONTEXT (context);
} }
} }
@ -1273,16 +1280,22 @@ g_source_set_priority (GSource *source,
if (context) if (context)
{ {
source->next = NULL; /* Remove the source from the context's source and then
source->prev = NULL; * add it back so it is sorted in the correct plcae
*/
tmp_list = source->poll_fds; g_source_list_remove (source, source->context);
while (tmp_list) g_source_list_add (source, source->context);
if (!SOURCE_BLOCKED (source))
{ {
g_main_context_remove_poll_unlocked (context, tmp_list->data); tmp_list = source->poll_fds;
g_main_context_add_poll_unlocked (context, priority, tmp_list->data); while (tmp_list)
{
tmp_list = tmp_list->next; g_main_context_remove_poll_unlocked (context, tmp_list->data);
g_main_context_add_poll_unlocked (context, priority, tmp_list->data);
tmp_list = tmp_list->next;
}
} }
UNLOCK_CONTEXT (source->context); UNLOCK_CONTEXT (source->context);
@ -1847,6 +1860,43 @@ g_main_depth (void)
return *depth; return *depth;
} }
/* Temporarily remove all this source's file descriptors from the
* poll(), so that if data comes available for one of the file descriptors
* we don't continually spin in the poll()
*/
/* HOLDS: source->context's lock */
void
block_source (GSource *source)
{
GSList *tmp_list;
g_return_if_fail (!SOURCE_BLOCKED (source));
tmp_list = source->poll_fds;
while (tmp_list)
{
g_main_context_remove_poll_unlocked (source->context, tmp_list->data);
tmp_list = tmp_list->next;
}
}
/* HOLDS: source->context's lock */
void
unblock_source (GSource *source)
{
GSList *tmp_list;
g_return_if_fail (!SOURCE_BLOCKED (source)); /* Source already unblocked */
g_return_if_fail (!SOURCE_DESTROYED (source));
tmp_list = source->poll_fds;
while (tmp_list)
{
g_main_context_add_poll_unlocked (source->context, source->priority, tmp_list->data);
tmp_list = tmp_list->next;
}
}
/* HOLDS: context's lock */ /* HOLDS: context's lock */
static void static void
g_main_dispatch (GMainContext *context) g_main_dispatch (GMainContext *context)
@ -1883,6 +1933,9 @@ g_main_dispatch (GMainContext *context)
if (cb_funcs) if (cb_funcs)
cb_funcs->ref (cb_data); cb_funcs->ref (cb_data);
if ((source->flags & G_SOURCE_CAN_RECURSE) == 0)
block_source (source);
was_in_call = source->flags & G_HOOK_FLAG_IN_CALL; was_in_call = source->flags & G_HOOK_FLAG_IN_CALL;
source->flags |= G_HOOK_FLAG_IN_CALL; source->flags |= G_HOOK_FLAG_IN_CALL;
@ -1905,6 +1958,10 @@ g_main_dispatch (GMainContext *context)
if (!was_in_call) if (!was_in_call)
source->flags &= ~G_HOOK_FLAG_IN_CALL; source->flags &= ~G_HOOK_FLAG_IN_CALL;
if ((source->flags & G_SOURCE_CAN_RECURSE) == 0 &&
!SOURCE_DESTROYED (source))
unblock_source (source);
/* Note: this depends on the fact that we can't switch /* Note: this depends on the fact that we can't switch
* sources from one main context to another * sources from one main context to another
*/ */
@ -2193,7 +2250,7 @@ g_main_context_prepare (GMainContext *context,
SOURCE_UNREF (source, context); SOURCE_UNREF (source, context);
break; break;
} }
if ((source->flags & G_HOOK_FLAG_IN_CALL) && !(source->flags & G_SOURCE_CAN_RECURSE)) if (SOURCE_BLOCKED (source))
goto next; goto next;
if (!(source->flags & G_SOURCE_READY)) if (!(source->flags & G_SOURCE_READY))
@ -2381,7 +2438,7 @@ g_main_context_check (GMainContext *context,
SOURCE_UNREF (source, context); SOURCE_UNREF (source, context);
break; break;
} }
if ((source->flags & G_HOOK_FLAG_IN_CALL) && !(source->flags & G_SOURCE_CAN_RECURSE)) if (SOURCE_BLOCKED (source))
goto next; goto next;
if (!(source->flags & G_SOURCE_READY)) if (!(source->flags & G_SOURCE_READY))