This is the mail archive of the java@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Problems with libjava's AWT


I'm trying to compile a Java program (jago, http://www.rene-grothmann.de/jago/)
with a recent CVS version of gcj.  It compiles fine once I remove all
attempts to generate sound from the code.  However, it seems to run into
a number of problems with the AWT implementation in libjava.

Once started, the program just hangs.  I traced this to a call to wait in
MediaTracker::waitForAll.  What seems to happen is this:
  - The program calls MediaTracker::addImage, which
    - calls GtkToolkit::checkImage, which
      - calls observer.ImageUpdate with "flags" set to 0.
        - In MediaTracker::MediaEntry::imageUpdate, a value of 0 for "flags"
          is translated (by default) into a "status" of LOADING.  This
          appears to be premature.
  - The program then calls MediaTracker::waitForAll, which
    - calls MediaTracker::checkAll, which
      - sees that we set a status of LOADING for the image, so it doesn't
        call prepareImage (apparently believing it has been called already)
    - back in MediaTracker::waitForAll, we end up in an infinte wait().

At the very least, the patch I'm appending below seems necessary to
leave "status" at 0 if imageUpdate is given a zero "flags".  The program
then gets a bit further, but it still hangs up in the same wait().  This
seems to be a genuine deadlock: we have a thread running wait() inside
a synchronized{} block, while another thread is running imageUpdate, trying
to notify the other thread that it can stop waiting, but unable to enter
the critical section (because the thread wait()ing has it blocked).

The locking in here seems broken, and I don't see a good way to fix it.
I'm not much of a Java expert; could anyone tell me if there are
message-passing APIs available which I could use?

Has this code been tested - are there other programs that work with gcj
and which use this part of libjava?


Bernd

	* java/awt/MediaTracker.java (imageUpdate): Only set status to
	LOADING if flags has SOMEBITS set.

Index: java/awt/MediaTracker.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/MediaTracker.java,v
retrieving revision 1.5
diff -d -p -u -r1.5 MediaTracker.java
--- java/awt/MediaTracker.java	12 Nov 2003 00:37:34 -0000	1.5
+++ java/awt/MediaTracker.java	6 Jun 2004 13:02:44 -0000
@@ -81,13 +81,15 @@ public class MediaTracker implements jav
         status = ERRORED | COMPLETE;
       else if ((flags & ALLBITS) != 0)
         status = COMPLETE;
-      else
+      else if ((flags & SOMEBITS) != 0)
         status = LOADING;
-      
+      else
+	status = 0;
+
       synchronized (MediaTracker.this)
       {
 	MediaTracker.this.notifyAll();
       }
       // If status is not COMPLETE then we need more updates.
       return (status & COMPLETE) == 0;
     }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]