Changeset 729

Show
Ignore:
Timestamp:
08/17/07 08:28:18 (2 years ago)
Author:
chf
Message:

Various fixes to getting the current task. This should address the nested transaction problem.

Location:
trunk/ProjectFortress
Files:
11 modified

Legend:

Unmodified
Added
Removed
  • trunk/ProjectFortress/junit

    r605 r729  
    2121 
    2222if (uname | egrep -q CYGWIN) ; then  
    23   CP="build;third_party/junit/junit.jar;third_party/xtc/xtc.jar;third_party/FJ/concurrent.jar;third_party/plt/plt.jar" 
     23  CP="build;third_party/junit/junit.jar;third_party/xtc/xtc.jar;third_party/jsr166y/jsr166y.jar;third_party/plt/plt.jar" 
    2424else 
    25   CP="build:third_party/junit/junit.jar:third_party/xtc/xtc.jar:third_party/FJ/concurrent.jar:third_party/plt/plt.jar" 
     25  CP="build:third_party/junit/junit.jar:third_party/xtc/xtc.jar:third_party/jsr166y/jsr166y.jar:third_party/plt/plt.jar" 
    2626fi 
    2727 
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/drivers/Driver.java

    r722 r729  
    4242import com.sun.fortress.interpreter.evaluator.InterpreterBug; 
    4343import com.sun.fortress.interpreter.evaluator.ProgramError; 
     44import com.sun.fortress.interpreter.evaluator.types.FType; 
     45import com.sun.fortress.interpreter.evaluator.tasks.BaseTask; 
    4446import com.sun.fortress.interpreter.evaluator.tasks.EvaluatorTask; 
    45 import com.sun.fortress.interpreter.evaluator.types.FType; 
     47import com.sun.fortress.interpreter.evaluator.tasks.FortressTaskRunner; 
    4648import com.sun.fortress.interpreter.evaluator.tasks.FortressTaskRunnerGroup; 
    4749import com.sun.fortress.interpreter.evaluator.values.Closure; 
     
    686688           group = new FortressTaskRunnerGroup(numThreads); 
    687689 
    688         EvaluatorTask evTask = new EvaluatorTask(p, runTests, args, null); 
     690        EvaluatorTask evTask = new EvaluatorTask(p, runTests, args); 
    689691        try { 
    690692            group.invoke(evTask); 
     
    694696        } 
    695697        if (evTask.causedException()) { 
    696             throw evTask.getTaskException(); 
     698            throw evTask.taskException(); 
    697699        } 
    698700    } 
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/Evaluator.java

    r720 r729  
    167167public class Evaluator extends EvaluatorBase<FValue> { 
    168168    boolean debug = false; 
    169     int transactionNestingCount = 0; 
    170  
    171169    final public static FVoid evVoid = FVoid.V; 
    172170 
     
    210208        super(e2.e); 
    211209        debug = e2.debug; 
    212         transactionNestingCount = e2.transactionNestingCount; 
    213210    } 
    214211 
     
    304301        final Expr expr = x.getExpr(); 
    305302        final Evaluator current = new Evaluator(this); 
    306         transactionNestingCount += 1; 
    307303 
    308304        FValue res = FortressTaskRunner.doIt ( 
     
    314310            } 
    315311        ); 
    316         transactionNestingCount -= 1; 
    317312        return res; 
    318313    } 
     
    424419        if (sz==1) { 
    425420            resList.add(exprs.get(0).accept(this)); 
    426  } else if (transactionNestingCount > 0) { 
    427    for (Expr exp : exprs) { 
    428        resList.add(exp.accept(this)); 
    429    } 
     421            /* If we are already in a transaction, don't evaluate in parallel */ 
     422        } else if (BaseTask.getThreadState().transactionNesting() > 0) { 
     423            for (Expr exp : exprs) { 
     424                resList.add(exp.accept(this)); 
     425            } 
    430426        } else if (sz > 1) { 
    431427            TupleTask[] tasks = new TupleTask[exprs.size()]; 
    432428            int count = 0; 
    433             BaseTask currentTask = BaseTask.getCurrentTask(); 
    434429            for (Expr e : exprs) { 
    435                 tasks[count++] = new TupleTask(e, this, currentTask); 
    436             } 
     430                tasks[count++] = new TupleTask(e, this); 
     431            } 
     432            FortressTaskRunner runner = (FortressTaskRunner) Thread.currentThread(); 
     433            BaseTask currentTask = runner.getCurrentTask(); 
    437434            TupleTask.coInvoke(tasks); 
     435            runner.setCurrentTask(currentTask); 
     436             
    438437            for (int i = 0; i < count; i++) { 
    439                 if (tasks[i].causedException) { 
    440                     Throwable t = tasks[i].getTaskException(); 
     438                if (tasks[i].causedException()) { 
     439                    Throwable t = tasks[i].taskException(); 
    441440                    if (t instanceof Error) { 
    442441                        throw (Error)t; 
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/EvaluatorJUTest.java

    r721 r729  
    2626 
    2727import com.sun.fortress.interpreter.env.BetterEnv; 
     28import com.sun.fortress.interpreter.evaluator.tasks.BaseTask; 
    2829import com.sun.fortress.interpreter.evaluator.tasks.FortressTaskRunner; 
    2930import com.sun.fortress.interpreter.evaluator.tasks.FortressTaskRunnerGroup; 
     
    4748  } 
    4849 
    49   FortressTaskRunnerGroup group; 
     50    class TestTask extends BaseTask { 
     51        public void print() { 
     52            System.out.println("TestTask"); 
     53        } 
     54     
     55        public void compute() { 
     56            FortressTaskRunner runner = (FortressTaskRunner) Thread.currentThread(); 
     57            runner.setCurrentTask(this); 
     58             
     59            try { 
     60                BetterEnv e = BetterEnv.primitive(); 
     61                e.bless(); 
     62                BetterEnv s = new BetterEnv(e, "s"); 
     63                s.bless(); 
     64                BetterEnv s1 = new BetterEnv(s, "s1"); 
     65                s1.putVariable("x", FInt.make(0)); 
     66                s1.bless(); 
     67                BetterEnv s2 = new BetterEnv(s1, "s2"); 
     68                s2.putValue("y", FInt.make(10)); 
     69                s2.bless(); 
     70                BetterEnv s3 = new BetterEnv(s2, "s3"); 
     71                s3.bless(); 
     72                HasAt at = new HasAt.FromString("EvaluatorJUTest assignValue"); 
     73                s3.assignValue(at,"x", FInt.make(1)); 
     74                assertTrue(s2.getValue("x").getInt() == 1); 
     75                s3.dump(System.out); 
     76            } catch (IOException e) { 
     77                throw new RuntimeException(e); 
     78            } 
     79        } 
     80    } 
    5081 
    5182  public void testEnvironment2() throws IOException { 
    52       group = new FortressTaskRunnerGroup(1); 
    53  
    54       BetterEnv e = BetterEnv.primitive(); 
    55       e.bless(); 
    56       BetterEnv s = new BetterEnv(e, "s"); 
    57       s.bless(); 
    58       BetterEnv s1 = new BetterEnv(s, "s1"); 
    59       s1.putVariable("x", FInt.make(0)); 
    60       s1.bless(); 
    61       BetterEnv s2 = new BetterEnv(s1, "s2"); 
    62       s2.putValue("y", FInt.make(10)); 
    63       s2.bless(); 
    64       BetterEnv s3 = new BetterEnv(s2, "s3"); 
    65       s3.bless(); 
    66       HasAt at = new HasAt.FromString("EvaluatorJUTest assignValue"); 
    67       s3.assignValue(at,"x", FInt.make(1)); 
    68       assertTrue(s2.getValue("x").getInt() == 1); 
    69       s3.dump(System.out); 
     83      FortressTaskRunnerGroup group = new FortressTaskRunnerGroup(1); 
     84      TestTask testTask = new TestTask(); 
     85      group.invoke(testTask); 
    7086  } 
    7187 
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/tasks/BaseTask.java

    r717 r729  
    2626import com.sun.fortress.interpreter.evaluator.transactions.exceptions.SnapshotException; 
    2727import java.util.concurrent.Callable; 
     28import com.sun.fortress.interpreter.evaluator.tasks.ThreadState; 
    2829 
    2930public abstract class BaseTask extends RecursiveAction { 
    30     public boolean causedException; 
    31     public Throwable err; 
    32     public BaseTask currentTask; 
    33     int transactionCount; 
     31    Throwable err; 
     32    boolean causedException; 
     33    ThreadState threadState; 
     34    BaseTask parent; 
    3435 
    35     public void initTask() { 
    36         setCurrentTask(this); 
    37         transactionCount = 0; 
    38     } 
     36    public BaseTask() { 
     37        causedException = false; 
     38        threadState = new ThreadState(); 
     39        parent = getCurrentTask(); 
     40    }    
    3941 
    40     public void finalizeTask() { 
    41         setCurrentTask(parent); 
    42         if (parent != null) { 
    43             if (causedException) { 
    44                 parent.causedException = true; 
    45                 parent.err = err; 
    46      } 
    47         } 
    48     } 
    49  
    50     public BaseTask(BaseTask parent) { 
    51         causedException = false; 
    52         setParentTask(parent); 
     42    public void recordException(Throwable t) {  
     43        causedException = true; 
     44        err = t; 
    5345    } 
    5446 
    5547    public boolean causedException() {return causedException;} 
    56     public Throwable getTaskException() {return err;} 
     48    public Throwable taskException() {return err;} 
    5749 
    5850    public static BaseTask getCurrentTask() { 
    59         FortressTaskRunner taskrunner = (FortressTaskRunner) Thread.currentThread(); 
    60         return (BaseTask) taskrunner.getCurrentTask(); 
     51        /* This may get called before we've started our FortressTaskGroup so in  
     52           that case we have no current task and need to return null */ 
     53        Thread t = Thread.currentThread(); 
     54        BaseTask result = null; 
     55        if (t instanceof FortressTaskRunner) { 
     56            FortressTaskRunner taskrunner = (FortressTaskRunner) t; 
     57            result = (BaseTask) taskrunner.getCurrentTask(); 
     58        } 
     59        return result; 
    6160    } 
    6261 
     
    6665    } 
    6766 
    68     BaseTask parent; 
    69     public BaseTask getParentTask() { return parent;} 
    70     public void setParentTask(BaseTask task) { parent = task;} 
    71  
    72  
    7367    public abstract void print(); 
    7468 
     
    7771        while (currentTask != null) { 
    7872            currentTask.print(); 
    79             currentTask = currentTask.getParentTask(); 
     73            currentTask = currentTask.parent; 
    8074        } 
    8175    } 
    8276 
    83     Object tag; 
    84     // Finds the current task and tags it 
    85     public static void tagCurrentTask(Object obj) { 
    86         BaseTask currentTask = getCurrentTask(); 
    87         currentTask.setTag(obj); 
     77    public ThreadState threadState() { return threadState();} 
     78 
     79    public static ThreadState getThreadState() {  
     80        BaseTask task = getCurrentTask(); 
     81        if (task == null)  
     82            throw new RuntimeException("Not in a task!"); 
     83        return task.threadState; 
    8884    } 
    89  
    90     // Get the tag from the current task 
    91     public static Object  getCurrentTag() { 
    92         BaseTask currentTask = getCurrentTask(); 
    93         return currentTask.getTag(); 
    94     } 
    95  
    96     public void setTag(Object obj) { tag = obj;} 
    97     public Object getTag() { return tag;} 
    9885} 
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/tasks/EvaluatorTask.java

    r703 r729  
    3434     
    3535    public EvaluatorTask(CompilationUnit prog, boolean tests,  
    36                          List<String> args_, BaseTask parent) { 
    37         super(parent); 
     36                         List<String> args_) { 
    3837        p = prog; 
    3938        runTests = tests; 
     
    4645     
    4746    public void compute() { 
    48         initTask(); 
     47        FortressTaskRunner runner = (FortressTaskRunner) Thread.currentThread(); 
     48        runner.setCurrentTask(this); 
    4949        try { 
    5050            Driver.runProgramTask(p, runTests, args); 
     
    5353            causedException = true; 
    5454            err = e; 
    55             //System.err.println("\nGot exception:\n" + e); 
    56             e.printStackTrace(); 
     55            e.printStackTrace(); 
     56            throw new RuntimeException(e); 
    5757        } 
    58         finalizeTask(); 
    5958    } 
    60  
    6159} 
    6260 
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/tasks/FortressTaskRunner.java

    r711 r729  
    5252    public static long totalTotalMemRefs = 0; 
    5353 
    54     static ThreadLocal<ThreadState> _threadState = new ThreadLocal<ThreadState>() { 
    55         protected synchronized ThreadState initialValue() { 
    56         return new ThreadState(); 
    57  
    58         } 
    59     }; 
    60     static ThreadLocal<Thread> _thread = new ThreadLocal<Thread>() { 
    61         protected synchronized Thread initialValue() { 
    62         return null; 
    63         } 
    64     }; 
    65  
    6654    private static int MAX_NESTING_DEPTH = 100; 
    6755 
     
    7159 
    7260    public BaseTask getCurrentTask() {return currentTask;} 
    73     public void setCurrentTask(BaseTask task) {currentTask = task;} 
     61 
     62    public void setCurrentTask(BaseTask task) { 
     63        currentTask = task; 
     64    } 
    7465 
    7566    public FortressTaskRunner(FortressTaskRunnerGroup group) { 
     
    117108     */ 
    118109    static public boolean validate() { 
    119         ThreadState threadState = _threadState.get(); 
     110        ThreadState threadState = BaseTask.getThreadState(); 
    120111        return threadState.validate(); 
    121112    } 
     
    128119     */ 
    129120    static public Transaction getTransaction() { 
    130         return _threadState.get().transaction; 
     121        ThreadState threadState = BaseTask.getThreadState();     
     122        return threadState.transaction(); 
    131123    } 
    132124 
     
    137129     */ 
    138130    static public ContentionManager getContentionManager() { 
    139         return _threadState.get().manager; 
     131        ThreadState threadState = BaseTask.getThreadState();     
     132        return threadState.manager(); 
    140133    } 
    141134 
     
    146139     */ 
    147140    public static <T> T doIt(Callable<T> xaction) { 
    148         ThreadState threadState = _threadState.get(); 
    149         ContentionManager manager = threadState.manager; 
     141        ThreadState threadState = BaseTask.getThreadState(); 
     142        ContentionManager manager = threadState.manager(); 
    150143        T result = null; 
    151144        try { 
     
    167160                    throw new PanicException("Error " + e); 
    168161                } 
    169                 threadState.totalMemRefs += threadState.transaction.memRefs; 
     162                threadState.addToTotalMemRefs(threadState.memRefs()); 
    170163                if (threadState.commitTransaction()) { 
    171                     threadState.committedMemRefs += threadState.transaction.memRefs; 
     164                    threadState.addToCommittedMemRefs(threadState.memRefs()); 
    172165                    return result; 
    173166                } 
    174                 threadState.transaction.attempts++; 
     167                threadState.incAttempts(); 
    175168                // transaction aborted 
    176169            } 
     
    221214     */ 
    222215    public static void onValidate(Callable<Boolean> c) { 
    223         _threadState.get().onValidate.add(c); 
     216        ThreadState threadState = BaseTask.getThreadState(); 
     217        threadState.onValidate.add(c); 
    224218    } 
    225219    /** 
     
    228222     */ 
    229223    public static void onValidateOnce(Callable<Boolean> c) { 
    230         _threadState.get().onValidateOnce.add(c); 
     224        ThreadState threadState = BaseTask.getThreadState(); 
     225        threadState.onValidateOnce.add(c); 
    231226    } 
    232227    /** 
     
    235230     */ 
    236231    public static void onBegin(Runnable r) { 
    237         _threadState.get().onBegin.add(r); 
     232        ThreadState threadState = BaseTask.getThreadState(); 
     233        threadState.onBegin.add(r); 
    238234    } 
    239235    /** 
     
    242238     */ 
    243239    public static void onBeginOnce(Runnable r) { 
    244         _threadState.get().onBeginOnce.add(r); 
     240        ThreadState threadState = BaseTask.getThreadState(); 
     241        threadState.onBeginOnce.add(r); 
    245242    } 
    246243    /** 
     
    249246     */ 
    250247    public static void onCommit(Runnable r) { 
    251         _threadState.get().onCommit.add(r); 
     248        ThreadState threadState = BaseTask.getThreadState(); 
     249        threadState.onCommit.add(r); 
    252250    } 
    253251    /** 
     
    256254     */ 
    257255    public static void onCommitOnce(Runnable r) { 
    258         _threadState.get().onCommitOnce.add(r); 
     256        ThreadState threadState = BaseTask.getThreadState(); 
     257        threadState.onCommitOnce.add(r); 
    259258    } 
    260259    /** 
     
    263262     */ 
    264263    public static void onAbort(Runnable r) { 
    265         _threadState.get().onAbort.add(r); 
     264        ThreadState threadState = BaseTask.getThreadState(); 
     265        threadState.onAbort.add(r); 
    266266    } 
    267267    /** 
     
    270270     */ 
    271271    public static void onAbortOnce(Runnable r) { 
    272         _threadState.get().onAbortOnce.add(r); 
     272        ThreadState threadState = BaseTask.getThreadState(); 
     273        threadState.onAbortOnce.add(r); 
    273274    } 
    274275    /** 
     
    277278     */ 
    278279    public static int getID() { 
    279         return _threadState.get().hashCode(); 
     280        ThreadState threadState = BaseTask.getThreadState(); 
     281        return threadState.hashCode(); 
    280282    } 
    281283 
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/tasks/SpawnTask.java

    r703 r729  
    3535     
    3636    public void compute() { 
    37         initTask(); 
    38         try { 
    39             val = new Evaluator(eval, expr).eval(expr); 
    40         }  
    41         catch (Throwable e) { 
    42             causedException = true; 
    43             err = e; 
    44         } 
    45         finalizeTask(); 
     37        FortressTaskRunner runner = (FortressTaskRunner) Thread.currentThread(); 
     38        runner.setCurrentTask(this); 
     39        val = new Evaluator(eval, expr).eval(expr); 
    4640    } 
    4741     
    48     public SpawnTask(Expr b, Evaluator e, BaseTask task) { 
    49         super(task); 
     42    public SpawnTask(Expr b, Evaluator e) { 
    5043        expr = b; 
    5144        eval = e; 
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/tasks/ThreadState.java

    r609 r729  
    3131    ContentionManager manager; 
    3232   
    33     public long committed = 0;        // number of committed transactions 
    34     public long total = 0;            // total number of transactions 
    35     public long committedMemRefs = 0; // number of committed reads and writes 
    36     public long totalMemRefs = 0;     // total number of reads and writes 
     33    long committed = 0;        // number of committed transactions 
     34    long total = 0;            // total number of transactions 
     35    long committedMemRefs = 0; // number of committed reads and writes 
     36    long totalMemRefs = 0;     // total number of reads and writes 
    3737   
    3838    Set<Callable<Boolean>> onValidate = new HashSet<Callable<Boolean>>(); 
     
    5959        } 
    6060    } 
     61 
     62    /* Are we in a transaction? */ 
     63    public int transactionNesting() { return depth;} 
    6164   
    6265    /** 
     
    6972        totalMemRefs = 0;     // total number of reads and writes 
    7073    } 
     74 
     75    public void incCommitted(int num) { committed += num;} 
     76    public void incTotal(int num) {total+= num;} 
     77    public void incCommittedMemRefs(int num) { committedMemRefs += num;} 
     78    public void incTotalMemRefs(int num) {totalMemRefs += num;} 
    7179   
    7280    /** 
     
    8189            "]"; 
    8290    } 
    83    
     91 
     92    public Transaction transaction() { return transaction;} 
     93    public ContentionManager manager() { return manager;} 
     94    public void addToTotalMemRefs(long num) { totalMemRefs += num;} 
     95    public long memRefs() { return totalMemRefs;} 
     96    public void addToCommittedMemRefs(long num) { committedMemRefs += num;} 
     97    public long commitedMemRefs() { return committedMemRefs;} 
     98    public void incAttempts() { transaction.attempts++;} 
     99    public long attempts() { return transaction.attempts;} 
     100 
    84101    /** 
    85102     * Can this transaction still commit? 
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/tasks/TupleTask.java

    r703 r729  
    3131    FValue res; 
    3232     
    33     public TupleTask(Expr ex, Evaluator ev, BaseTask parent) { 
    34         super(parent); 
     33    public TupleTask(Expr ex, Evaluator ev) { 
    3534        expr = ex; 
    3635        eval = ev; 
     
    3837     
    3938    public void compute() { 
    40         initTask(); 
    41         try { 
    42             res = new Evaluator(eval, expr).eval(expr); 
    43         }  
    44         catch (Throwable e) { 
    45             causedException = true; 
    46             err = e; 
    47         } 
    48         finalizeTask(); 
     39        FortressTaskRunner runner = (FortressTaskRunner) Thread.currentThread(); 
     40        runner.setCurrentTask(this); 
     41        res = new Evaluator(eval, expr).eval(expr); 
    4942    } 
    5043     
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/values/FThread.java

    r593 r729  
    3333 
    3434    public FThread(Expr b, Evaluator e) { 
    35         st = new SpawnTask(b,e, BaseTask.getCurrentTask()); 
     35        st = new SpawnTask(b,e); 
    3636    } 
    3737