help-smalltalk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Help-smalltalk] GLib/GTK+ event loop fiasco


From: Holger Hans Peter Freyther
Subject: Re: [Help-smalltalk] GLib/GTK+ event loop fiasco
Date: Mon, 21 Jul 2014 08:09:46 +0200
User-agent: Mutt/1.5.23 (2014-03-12)

On Sun, Jul 20, 2014 at 04:00:07PM +0200, Holger Hans Peter Freyther wrote:

Hi,


> > I've looked at this code for a bit and I wonder why we don't inhibit the
> > process switching here? Or at least add a way to crash hard if a process
> > change is scheduled so I can see which mutex is hit.
> 
> I have hit the wesp nest here. So GtkImage of VisualGST is adding various
> "Processor activeProcess yield" into for loops as otherwise we get issues
> with the garbage collector:
> 
> ...scripts/Test.st:181: Too many garbage collections, finalizers missed!
> ...scripts/Test.st:181: This is a bug, please repor
> 
> Couldn't we copy the content of gcArray to a new array? Or run the
> finalizer at another point?

ignoring nested event loops I am running glib with the below local
modification. The intention is to find places where a callback has
yielded (either voluntarily or due waiting on a semaphore) the CPU
while being in a call-in process.

The code will then loop inside the pause() and I can attach with
gdb and execute code to inspect it.

diff --git a/packages/glib/Makefile.am b/packages/glib/Makefile.am
index 182c12a..eddfb72 100644
--- a/packages/glib/Makefile.am
+++ b/packages/glib/Makefile.am
@@ -1,7 +1,7 @@
 CLEANFILES = $(BUILT_SOURCES)
 
 gst_module_ldflags = -rpath $(moduleexecdir) -release $(VERSION) -module \
-       -no-undefined -export-symbols-regex gst_initModule
+       -no-undefined -export-symbols-regex 
"gst_initModule|gst_glib_set_inhibit_dispatch"
 
 ALL_LIBS = $(GLIB_LIBS) $(GTHREAD_LIBS)
 
diff --git a/packages/glib/gst-glib.c b/packages/glib/gst-glib.c
index fb86974..cad11db 100644
--- a/packages/glib/gst-glib.c
+++ b/packages/glib/gst-glib.c
@@ -140,6 +140,15 @@ static GSList *loop_list;
 static GPollFD *fds;
 static int allocated_nfds, nfds;
 static int maxprio;
+static int inhibit_dispatch;
+
+int
+gst_glib_set_inhibit_dispatch(int do_inhibit)
+{
+  int old_inhibit = inhibit_dispatch;
+  inhibit_dispatch = do_inhibit;
+  return old_inhibit;
+}
 
 static void
 main_loop_dispatch (void)
@@ -148,6 +157,12 @@ main_loop_dispatch (void)
   if (!g_main_context_acquire (context))
     abort ();
 
+  /* Do we inhibit running dispatch? */
+  if (inhibit_dispatch) {
+   printf("BAD.. dispatch during execution\n");
+    while(1) pause();
+  }
+
   g_main_context_dispatch (context);
   g_main_context_release (context);
 }
diff --git a/packages/glib/gst-gobject.c b/packages/glib/gst-gobject.c
index 949d547..dab7703 100644
--- a/packages/glib/gst-gobject.c
+++ b/packages/glib/gst-gobject.c
@@ -401,7 +401,7 @@ invoke_smalltalk_closure (GClosure     *closure,
   OOP *args = alloca (sizeof (OOP) * stc->n_params);
 
   OOP resultOOP;
-  int i;
+  int i, inhibit;
 
   /* Less parameters than the event has, discard the ones in excess.  */
   if (stc->n_params < n_param_values)
@@ -437,7 +437,10 @@ invoke_smalltalk_closure (GClosure     *closure,
         args[i++] = stc->widget;
     }
 
+  inhibit = gst_glib_set_inhibit_dispatch(1);
   resultOOP = gst_nvmsg_send (stc->receiver, stc->selector, args, i);
+  gst_glib_set_inhibit_dispatch(inhibit);
+  
 
   /* FIXME Need to init return_value's type? */
   if (return_value)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]