Re: [gui-dev] Startup deadlock problems

Jens-Uwe Mager <[email protected]> Sat, 24 Jul 2004 02:30:49 +0200
Newsgroups gmane.network.gnutella.limewire.gui.devel
Message-ID <[email protected]>
Oops, I cleaned up the patch to work properly in the case the code
already runs on the event dispatcher thread.

-- 
Jens-Uwe Mager	<pgp-mailto:F476EBC2>

_______________________________________________
gui-dev mailing list
[email protected]
http://www.limewire.org/mailman/listinfo/gui-dev
st.patch (text/plain, 4.1 KB)
Index: com/limegroup/gnutella/gui/SplashWindow.java
===================================================================
RCS file: /cvs/gui/com/limegroup/gnutella/gui/SplashWindow.java,v
retrieving revision 1.26
diff -u -r1.26 SplashWindow.java
--- com/limegroup/gnutella/gui/SplashWindow.java	10 Jun 2004 19:11:11 -0000	1.26
+++ com/limegroup/gnutella/gui/SplashWindow.java	24 Jul 2004 00:16:18 -0000
@@ -1,6 +1,7 @@
 package com.limegroup.gnutella.gui;
 
 import com.limegroup.gnutella.settings.ThemeFileHandler;
+import com.limegroup.gnutella.ErrorService;
 
 import javax.swing.*;
 import java.awt.*;
@@ -59,8 +60,12 @@
      *
      * @param text the text to display
      */
-    static void setStatusText(String text) {
-        GLASS_PANE.setText(text);
+    static void setStatusText(final String text) {
+        GUIMediator.safeInvokeAndWait(new Runnable() {
+            public void run() {
+                GLASS_PANE.setText(text);
+            }
+        });
     }
 }
 
Index: com/limegroup/gnutella/gui/StatusLine.java
===================================================================
RCS file: /cvs/gui/com/limegroup/gnutella/gui/StatusLine.java,v
retrieving revision 1.90
diff -u -r1.90 StatusLine.java
--- com/limegroup/gnutella/gui/StatusLine.java	23 Jul 2004 22:29:59 -0000	1.90
+++ com/limegroup/gnutella/gui/StatusLine.java	24 Jul 2004 00:16:18 -0000
@@ -4,6 +4,7 @@
 import java.awt.*;
 import javax.swing.*;
 import com.limegroup.gnutella.util.CommonUtils;
+import com.limegroup.gnutella.ErrorService;
 import com.limegroup.gnutella.gui.mp3.*;
 import com.limegroup.gnutella.settings.*;
 
@@ -160,10 +161,14 @@
      * Updates the status text.
      */
     void setStatusText(final String text) {
-        STATUS_LABEL.setText(text);
-        STATUS_LABEL.invalidate();
-        STATUS_LABEL.revalidate();
-        STATUS_LABEL.repaint();
+        GUIMediator.safeInvokeAndWait(new Runnable() {
+            public void run() {
+                STATUS_LABEL.setText(text);
+                STATUS_LABEL.invalidate();
+                STATUS_LABEL.revalidate();
+                STATUS_LABEL.repaint();
+            }
+        });
     }
     
     /**
Index: com/limegroup/gnutella/gui/GUIMediator.java
===================================================================
RCS file: /cvs/gui/com/limegroup/gnutella/gui/GUIMediator.java,v
retrieving revision 1.137
diff -u -r1.137 GUIMediator.java
--- com/limegroup/gnutella/gui/GUIMediator.java	23 Jul 2004 22:29:59 -0000	1.137
+++ com/limegroup/gnutella/gui/GUIMediator.java	24 Jul 2004 00:16:20 -0000
@@ -2,6 +2,7 @@
 
 import com.limegroup.gnutella.RouterService;
 import com.limegroup.gnutella.bugs.BugManager;
+import com.limegroup.gnutella.ErrorService;
 import com.limegroup.gnutella.gui.library.LibraryMediator;
 import com.limegroup.gnutella.gui.notify.*;
 import com.limegroup.gnutella.gui.options.OptionsMediator;
@@ -311,9 +318,13 @@
 	 * @param visible specifies whether or not the application should be
 	 *                made visible or not
 	 */
-	public static final void setAppVisible(boolean visible) {
-		FRAME.setVisible(visible);
-		SearchMediator.requestSearchFocus();
+	public static final void setAppVisible(final boolean visible) {
+                safeInvokeAndWait(new Runnable() {
+                    public void run() {
+                        FRAME.setVisible(visible);
+                        SearchMediator.requestSearchFocus();
+                    }
+                });
 		
 		// If the app has already been made visible, don't display extra
 		// dialogs.  We could display the pro dialog here, but it causes
@@ -2044,6 +2058,20 @@
     public void doBrowseHost(String address, int port) {
         MAIN_FRAME.setSelectedIndex(SEARCH_INDEX);
         SearchMediator.doBrowseHost(address, port, null);
+    }
+
+    /**
+     * safely run code synchroneously in the event dispatching thread.
+     */
+    public static void safeInvokeAndWait(Runnable runnable) {
+        if (EventQueue.isDispatchThread())
+            runnable.run();
+        else
+            try {
+                SwingUtilities.invokeAndWait(runnable);
+            } catch (Exception ex) {
+                ErrorService.error(ex);
+            }
     }
 
 }