From f26256fe182bc1249d3058d9f18402d0ac26974c Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Tue, 2 Feb 1999 01:04:41 +0000 Subject: [PATCH] Release the main_loop lock around calls to prepare() and check() so that Mon Feb 1 19:04:28 1999 Owen Taylor * gmain.c (g_main_iterate): Release the main_loop lock around calls to prepare() and check() so that we are not holding the main loop lock over user code. --- ChangeLog | 9 ++++++++- ChangeLog.pre-2-0 | 9 ++++++++- ChangeLog.pre-2-10 | 9 ++++++++- ChangeLog.pre-2-12 | 9 ++++++++- ChangeLog.pre-2-2 | 9 ++++++++- ChangeLog.pre-2-4 | 9 ++++++++- ChangeLog.pre-2-6 | 9 ++++++++- ChangeLog.pre-2-8 | 9 ++++++++- glib/gmain.c | 52 +++++++++++++++++++++++++++++++++++----------------- gmain.c | 52 +++++++++++++++++++++++++++++++++++----------------- 10 files changed, 134 insertions(+), 42 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0b6fe92..5bb284c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,13 @@ +Mon Feb 1 19:04:28 1999 Owen Taylor + + * gmain.c (g_main_iterate): Release the main_loop + lock around calls to prepare() and check() so + that we are not holding the main loop lock + over user code. + 1999-01-30 Sebastian Wilhelmi - * configure.in: Moved the check for MT save function variants + * configure.in: Moved the check for MT safe function variants after the determination of the MT cflags and use them there. 1999-01-29 Sebastian Wilhelmi diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 0b6fe92..5bb284c 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,6 +1,13 @@ +Mon Feb 1 19:04:28 1999 Owen Taylor + + * gmain.c (g_main_iterate): Release the main_loop + lock around calls to prepare() and check() so + that we are not holding the main loop lock + over user code. + 1999-01-30 Sebastian Wilhelmi - * configure.in: Moved the check for MT save function variants + * configure.in: Moved the check for MT safe function variants after the determination of the MT cflags and use them there. 1999-01-29 Sebastian Wilhelmi diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 0b6fe92..5bb284c 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,6 +1,13 @@ +Mon Feb 1 19:04:28 1999 Owen Taylor + + * gmain.c (g_main_iterate): Release the main_loop + lock around calls to prepare() and check() so + that we are not holding the main loop lock + over user code. + 1999-01-30 Sebastian Wilhelmi - * configure.in: Moved the check for MT save function variants + * configure.in: Moved the check for MT safe function variants after the determination of the MT cflags and use them there. 1999-01-29 Sebastian Wilhelmi diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 0b6fe92..5bb284c 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,6 +1,13 @@ +Mon Feb 1 19:04:28 1999 Owen Taylor + + * gmain.c (g_main_iterate): Release the main_loop + lock around calls to prepare() and check() so + that we are not holding the main loop lock + over user code. + 1999-01-30 Sebastian Wilhelmi - * configure.in: Moved the check for MT save function variants + * configure.in: Moved the check for MT safe function variants after the determination of the MT cflags and use them there. 1999-01-29 Sebastian Wilhelmi diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 0b6fe92..5bb284c 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,6 +1,13 @@ +Mon Feb 1 19:04:28 1999 Owen Taylor + + * gmain.c (g_main_iterate): Release the main_loop + lock around calls to prepare() and check() so + that we are not holding the main loop lock + over user code. + 1999-01-30 Sebastian Wilhelmi - * configure.in: Moved the check for MT save function variants + * configure.in: Moved the check for MT safe function variants after the determination of the MT cflags and use them there. 1999-01-29 Sebastian Wilhelmi diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 0b6fe92..5bb284c 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,6 +1,13 @@ +Mon Feb 1 19:04:28 1999 Owen Taylor + + * gmain.c (g_main_iterate): Release the main_loop + lock around calls to prepare() and check() so + that we are not holding the main loop lock + over user code. + 1999-01-30 Sebastian Wilhelmi - * configure.in: Moved the check for MT save function variants + * configure.in: Moved the check for MT safe function variants after the determination of the MT cflags and use them there. 1999-01-29 Sebastian Wilhelmi diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 0b6fe92..5bb284c 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,6 +1,13 @@ +Mon Feb 1 19:04:28 1999 Owen Taylor + + * gmain.c (g_main_iterate): Release the main_loop + lock around calls to prepare() and check() so + that we are not holding the main loop lock + over user code. + 1999-01-30 Sebastian Wilhelmi - * configure.in: Moved the check for MT save function variants + * configure.in: Moved the check for MT safe function variants after the determination of the MT cflags and use them there. 1999-01-29 Sebastian Wilhelmi diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 0b6fe92..5bb284c 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,6 +1,13 @@ +Mon Feb 1 19:04:28 1999 Owen Taylor + + * gmain.c (g_main_iterate): Release the main_loop + lock around calls to prepare() and check() so + that we are not holding the main loop lock + over user code. + 1999-01-30 Sebastian Wilhelmi - * configure.in: Moved the check for MT save function variants + * configure.in: Moved the check for MT safe function variants after the determination of the MT cflags and use them there. 1999-01-29 Sebastian Wilhelmi diff --git a/glib/gmain.c b/glib/gmain.c index 28ff057..312402f 100644 --- a/glib/gmain.c +++ b/glib/gmain.c @@ -732,16 +732,27 @@ g_main_iterate (gboolean block, continue; } - in_check_or_prepare++; - if (hook->flags & G_SOURCE_READY || - ((GSourceFuncs *) hook->func)->prepare (source->source_data, - ¤t_time, - &source_timeout)) + if (!(hook->flags & G_SOURCE_READY)) { + gboolean (*prepare) (gpointer source_data, + GTimeVal *current_time, + gint *timeout); + + prepare = ((GSourceFuncs *) hook->func)->prepare; + in_check_or_prepare++; + G_UNLOCK (main_loop); + + if ((*prepare) (source->source_data, ¤t_time, &source_timeout)) + hook->flags |= G_SOURCE_READY; + + G_LOCK (main_loop); in_check_or_prepare--; + } + + if (hook->flags & G_SOURCE_READY) + { if (!dispatch) { - hook->flags |= G_SOURCE_READY; g_hook_unref (&source_list, hook); G_UNLOCK (main_loop); @@ -749,14 +760,11 @@ g_main_iterate (gboolean block, } else { - hook->flags |= G_SOURCE_READY; n_ready++; current_priority = source->priority; timeout = 0; } } - else - in_check_or_prepare--; if (source_timeout >= 0) { @@ -793,12 +801,24 @@ g_main_iterate (gboolean block, continue; } - in_check_or_prepare++; - if (hook->flags & G_SOURCE_READY || - ((GSourceFuncs *) hook->func)->check (source->source_data, - ¤t_time)) + if (!(hook->flags & G_SOURCE_READY)) { + gboolean (*check) (gpointer source_data, + GTimeVal *current_time); + + check = ((GSourceFuncs *) hook->func)->check; + in_check_or_prepare++; + G_UNLOCK (main_loop); + + if ((*check) (source->source_data, ¤t_time)) + hook->flags |= G_SOURCE_READY; + + G_LOCK (main_loop); in_check_or_prepare--; + } + + if (hook->flags & G_SOURCE_READY) + { if (dispatch) { hook->flags &= ~G_SOURCE_READY; @@ -815,8 +835,6 @@ g_main_iterate (gboolean block, return TRUE; } } - else - in_check_or_prepare--; hook = g_hook_next_valid (&source_list, hook, TRUE); } @@ -852,7 +870,7 @@ g_main_iteration (gboolean block) if (in_check_or_prepare) { g_warning ("g_main_iteration(): called recursively from within a source's check() or " - "prepare() member, iteration not possible"); + "prepare() member or from a second thread, iteration not possible"); return FALSE; } else @@ -878,7 +896,7 @@ g_main_run (GMainLoop *loop) if (in_check_or_prepare) { g_warning ("g_main_run(): called recursively from within a source's check() or " - "prepare() member, iteration not possible"); + "prepare() member or from a second thread, iteration not possible"); return; } diff --git a/gmain.c b/gmain.c index 28ff057..312402f 100644 --- a/gmain.c +++ b/gmain.c @@ -732,16 +732,27 @@ g_main_iterate (gboolean block, continue; } - in_check_or_prepare++; - if (hook->flags & G_SOURCE_READY || - ((GSourceFuncs *) hook->func)->prepare (source->source_data, - ¤t_time, - &source_timeout)) + if (!(hook->flags & G_SOURCE_READY)) { + gboolean (*prepare) (gpointer source_data, + GTimeVal *current_time, + gint *timeout); + + prepare = ((GSourceFuncs *) hook->func)->prepare; + in_check_or_prepare++; + G_UNLOCK (main_loop); + + if ((*prepare) (source->source_data, ¤t_time, &source_timeout)) + hook->flags |= G_SOURCE_READY; + + G_LOCK (main_loop); in_check_or_prepare--; + } + + if (hook->flags & G_SOURCE_READY) + { if (!dispatch) { - hook->flags |= G_SOURCE_READY; g_hook_unref (&source_list, hook); G_UNLOCK (main_loop); @@ -749,14 +760,11 @@ g_main_iterate (gboolean block, } else { - hook->flags |= G_SOURCE_READY; n_ready++; current_priority = source->priority; timeout = 0; } } - else - in_check_or_prepare--; if (source_timeout >= 0) { @@ -793,12 +801,24 @@ g_main_iterate (gboolean block, continue; } - in_check_or_prepare++; - if (hook->flags & G_SOURCE_READY || - ((GSourceFuncs *) hook->func)->check (source->source_data, - ¤t_time)) + if (!(hook->flags & G_SOURCE_READY)) { + gboolean (*check) (gpointer source_data, + GTimeVal *current_time); + + check = ((GSourceFuncs *) hook->func)->check; + in_check_or_prepare++; + G_UNLOCK (main_loop); + + if ((*check) (source->source_data, ¤t_time)) + hook->flags |= G_SOURCE_READY; + + G_LOCK (main_loop); in_check_or_prepare--; + } + + if (hook->flags & G_SOURCE_READY) + { if (dispatch) { hook->flags &= ~G_SOURCE_READY; @@ -815,8 +835,6 @@ g_main_iterate (gboolean block, return TRUE; } } - else - in_check_or_prepare--; hook = g_hook_next_valid (&source_list, hook, TRUE); } @@ -852,7 +870,7 @@ g_main_iteration (gboolean block) if (in_check_or_prepare) { g_warning ("g_main_iteration(): called recursively from within a source's check() or " - "prepare() member, iteration not possible"); + "prepare() member or from a second thread, iteration not possible"); return FALSE; } else @@ -878,7 +896,7 @@ g_main_run (GMainLoop *loop) if (in_check_or_prepare) { g_warning ("g_main_run(): called recursively from within a source's check() or " - "prepare() member, iteration not possible"); + "prepare() member or from a second thread, iteration not possible"); return; } -- 2.7.4