harmony-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "weldon washburn (JIRA)" <j...@apache.org>
Subject [jira] Commented: (HARMONY-3253) [drlvm][thread manager] Thread.join() does not ensure the TERMINATED state of a thread
Date Wed, 28 Feb 2007 18:34:57 GMT

    [ https://issues.apache.org/jira/browse/HARMONY-3253?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12476666
] 

weldon washburn commented on HARMONY-3253:
------------------------------------------

Peter,

I am looking at this patch.  I looked at Thread.runImpl(),  it actually writes "true" to this.isAlive
and this.started variables.  Worth noting these writes are protected by synchronized(lock){...}

I wonder if it is necessary to protect getState()'s reads of variables isAlive and started
with the same lock.   I have not looked at this code closely.  There may actually be no race
condition in the current code base.  In any case it would make the code easier to understand
and less fragile if the read/writes of Thread variables were protected by synchronized(lock)
with a few rare execptions.  I am thinking something like:


     public Thread.State  getState() {
+
+       boolean dead = false;
+       synchronized(lock)  {
+           if (started && !isAlive()) dead = true;
+       }
+           if (dead) return State.TERMINATED;
+       }

> [drlvm][thread manager] Thread.join() does not ensure the TERMINATED state of a thread
> --------------------------------------------------------------------------------------
>
>                 Key: HARMONY-3253
>                 URL: https://issues.apache.org/jira/browse/HARMONY-3253
>             Project: Harmony
>          Issue Type: Bug
>          Components: DRLVM
>            Reporter: Elena Semukhina
>         Assigned To: weldon washburn
>         Attachments: accurate-terminated-state.patch
>
>
>  The kernel test ThreadTest.testInterruptTerminated() fails intermittently with the message
"interrupt status has not changed to true" when interrupting a terminated thread. This could
happen when a thread exited join() but its state at that moment was not TERMINATED.
> The following test shows up that the state of a thread after termination is not always
TERMINATED.
> public class TestGetStateJoined {
>     public static void main(String args[]) {
>         int count = 100;
>         for (int i = 0; i < count; i++) {
>             Thread t = new Thread();
>             t.start();
>             try {
>                 t.join();
>             } catch (InterruptedException e) {
>             }
>             Thread.State ts = t.getState();
>             System.out.println("state : " + ts);
>         }
>     }
> }
> The test alternately prints "RUNNABLE" and "TERMINATED" on DRLVM:
> > $DRLVM -showversion TestGetStateJoined
> Apache Harmony Launcher : (c) Copyright 1991, 2006 The Apache Software Foundation or
its licensors, as applicable.
> java version "1.5.0" 
> pre-alpha : not complete or compatible
> svn = r512139, (Feb 27 2007), Linux/ia32/gcc 3.3.3, debug build
> http://incubator.apache.org/harmony
> state : TERMINATED
> state : RUNNABLE
> state : TERMINATED
> state : TERMINATED
> state : TERMINATED
> state : RUNNABLE
> state : TERMINATED
> ...
> while on RI it always prints "TERMINATED":
> > $RI -showversion TestGetStateJoined
> java version "1.5.0_08"
> Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_08-b03)
> Java HotSpot(TM) Server VM (build 1.5.0_08-b03, mixed mode)
>  
> state : TERMINATED
> state : TERMINATED
> state : TERMINATED
> ....

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message