Release the main_loop lock around calls to prepare() and check() so that
authorOwen Taylor <otaylor@redhat.com>
Tue, 2 Feb 1999 01:04:41 +0000 (01:04 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Tue, 2 Feb 1999 01:04:41 +0000 (01:04 +0000)
Mon Feb  1 19:04:28 1999  Owen Taylor  <otaylor@redhat.com>

* 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
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
glib/gmain.c
gmain.c

index 0b6fe92..5bb284c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,13 @@
+Mon Feb  1 19:04:28 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * 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  <wilhelmi@ira.uka.de>
 
-       * 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  <wilhelmi@ira.uka.de>
index 0b6fe92..5bb284c 100644 (file)
@@ -1,6 +1,13 @@
+Mon Feb  1 19:04:28 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * 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  <wilhelmi@ira.uka.de>
 
-       * 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  <wilhelmi@ira.uka.de>
index 0b6fe92..5bb284c 100644 (file)
@@ -1,6 +1,13 @@
+Mon Feb  1 19:04:28 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * 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  <wilhelmi@ira.uka.de>
 
-       * 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  <wilhelmi@ira.uka.de>
index 0b6fe92..5bb284c 100644 (file)
@@ -1,6 +1,13 @@
+Mon Feb  1 19:04:28 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * 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  <wilhelmi@ira.uka.de>
 
-       * 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  <wilhelmi@ira.uka.de>
index 0b6fe92..5bb284c 100644 (file)
@@ -1,6 +1,13 @@
+Mon Feb  1 19:04:28 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * 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  <wilhelmi@ira.uka.de>
 
-       * 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  <wilhelmi@ira.uka.de>
index 0b6fe92..5bb284c 100644 (file)
@@ -1,6 +1,13 @@
+Mon Feb  1 19:04:28 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * 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  <wilhelmi@ira.uka.de>
 
-       * 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  <wilhelmi@ira.uka.de>
index 0b6fe92..5bb284c 100644 (file)
@@ -1,6 +1,13 @@
+Mon Feb  1 19:04:28 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * 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  <wilhelmi@ira.uka.de>
 
-       * 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  <wilhelmi@ira.uka.de>
index 0b6fe92..5bb284c 100644 (file)
@@ -1,6 +1,13 @@
+Mon Feb  1 19:04:28 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * 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  <wilhelmi@ira.uka.de>
 
-       * 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  <wilhelmi@ira.uka.de>
index 28ff057..312402f 100644 (file)
@@ -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,
-                                                 &current_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, &current_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,
-                                               &current_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, &current_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 (file)
--- 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,
-                                                 &current_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, &current_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,
-                                               &current_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, &current_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;
     }