This is the mail archive of the java-discuss@sourceware.cygnus.com 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]

Re: possible bug with synchronized methods



I'm happy to report that upon further investigation there's no
problem with gcj as I reported, thank god.

The problem was an installation problem.  I had an installation that
doesn't use threads, and one that uses pthreads.  At some point,
I had included the lib directory of the nothread version in my
/etc/ld.so.conf.  It was picking up the nothread version.

I thought somebody said that gcj will abort if I'm trying to use multiple
threads with the nothread version, but apparently it doesn't.  Instead,
it got stuck in the Thread.sleep and invoked "sleep(3)" which put the
whole process to sleep, hence the failure.  Setting LD_LIBRARY_PATH to
have it pick up the threaded version fixed that.

	- Godmar

> 
> 
> I am trying to figure out how gcj exits the monitors associated with
> synchronized methods when an exception occurs.
> 
> The following test case fails for a gcj/libgcj configured with 
> --enable-threads=posix.  I've filed a bug report, feel free to include
> the program in the test suite if you think it would be useful.
> 
> >From looking at the code, I don't quite understand why this program
> fails.  In decl.c, the method body is wrapped in a mon_enter with
> a mon_exit as a "cleanup" clause.  In stmt.c, a comment above
> expand_decl_cleanup says that the cleanup cause is invoked in the
> case of exceptions.  So it should work, should it not?
> 
> Does anybody know what's going on?
> 
> 	- Godmar
> 
> 
> /**
>  * Test that locks taken in synchronized methods are properly unlocked
>  * when an exception occurs.  Note that different mechanisms are used in
>  * compiler & interpreter.
>  *
>  * @author Godmar Back <gback@cs.utah.edu>
>  */
> public class TestUnlock {
>     synchronized void throwException() throws Exception {
>         throw new Exception();
>     }
> 
>     synchronized void success() {
>         System.out.println("Success.");
>     }
> 
>     public static void main(String av[]) throws Exception {
>         final TestUnlock me = new TestUnlock();
> 
>         new Thread() {
>             public void run() {
>                try {
>                    Thread.sleep(2000);
>                } catch (Exception _) { }
>                System.out.println("Time out.  Failure.");
>                System.exit(-1);
>             }
>         }.start();
> 
>         Thread t = new Thread() {
>             public void run() {
>                try {
>                    me.throwException();
>                } catch (Exception _) {
>                }
>             }
>         };
>         t.start();
>         t.join();
> 
>         Thread t2 = new Thread() {
>             public void run() {
>                me.success();
>             }
>         };
>         t2.start();
>         t2.join();
>         System.exit(0);
>     }
> }
> 
> /* Expected Output:
> Success.
> */
> 


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