mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-10 03:16:17 +01:00
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:
parent
974dbaef86
commit
9753964fe6
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
95
glib/gmain.c
95
glib/gmain.c
@ -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))
|
||||||
|
Loading…
Reference in New Issue
Block a user