SF.net SVN: jikesrvm:[15746] rvmroot/trunk/MMTk/harness

View: New views
1 Messages — Rating Filter:   Alert me  

SF.net SVN: jikesrvm:[15746] rvmroot/trunk/MMTk/harness

by rgarner :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Revision: 15746
          http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15746&view=rev
Author:   rgarner
Date:     2009-07-27 02:59:20 +0000 (Mon, 27 Jul 2009)

Log Message:
-----------
More tweaking of mutator barrier code

Modified Paths:
--------------
    rvmroot/trunk/MMTk/harness/src/org/mmtk/harness/scheduler/ThreadModel.java
    rvmroot/trunk/MMTk/harness/src/org/mmtk/harness/scheduler/rawthreads/RawThreadModel.java
    rvmroot/trunk/MMTk/harness/test-scripts/lang/barriers.script

Modified: rvmroot/trunk/MMTk/harness/src/org/mmtk/harness/scheduler/ThreadModel.java
===================================================================
--- rvmroot/trunk/MMTk/harness/src/org/mmtk/harness/scheduler/ThreadModel.java 2009-07-24 06:35:27 UTC (rev 15745)
+++ rvmroot/trunk/MMTk/harness/src/org/mmtk/harness/scheduler/ThreadModel.java 2009-07-27 02:59:20 UTC (rev 15746)
@@ -18,6 +18,9 @@
 import org.mmtk.harness.lang.Trace.Item;
 import org.mmtk.utility.Log;
 
+/**
+ * Abstract implementation of a threading model.
+ */
 public abstract class ThreadModel {
 
   /**
@@ -26,7 +29,15 @@
   private boolean running = false;
 
   /** The global state of the scheduler */
-  public enum State { MUTATOR, BEGIN_GC, GC, END_GC, RENDEZVOUS }
+  public enum State {
+    /** Mutator threads are running */
+    MUTATOR,
+    /** GC requested, GC will start once all mutators have yielded */
+    BEGIN_GC,
+    /** GC in progress */
+    GC,
+    /** Waiting on all GC threads to hibernate */
+    END_GC }
 
   private static volatile State state = State.MUTATOR;
 
@@ -55,30 +66,30 @@
 
   protected abstract void waitForGCStart();
 
-  public abstract boolean noThreadsInGC();
+  protected abstract boolean noThreadsInGC();
 
-  public abstract boolean gcTriggered();
+  protected abstract boolean gcTriggered();
 
-  public abstract int rendezvous(int where);
+  protected abstract int rendezvous(int where);
 
-  public abstract int mutatorRendezvous(String where, int expected);
+  protected abstract int mutatorRendezvous(String where, int expected);
 
-  public abstract Collector currentCollector();
+  protected abstract Collector currentCollector();
 
-  public abstract void waitForGC();
+  protected abstract void waitForGC();
 
-  public int getTriggerReason() {
+  protected int getTriggerReason() {
     return triggerReason;
   }
 
-  public abstract void schedule();
+  protected abstract void schedule();
 
-  public abstract void scheduleGcThreads();
+  protected abstract void scheduleGcThreads();
 
   /**
    * An MMTk lock
    */
-  public abstract Lock newLock(String name);
+  protected abstract Lock newLock(String name);
 
   protected void setState(State state) {
     Trace.trace(Item.SCHEDULER,"State changing from %s to %s",ThreadModel.state,state);

Modified: rvmroot/trunk/MMTk/harness/src/org/mmtk/harness/scheduler/rawthreads/RawThreadModel.java
===================================================================
--- rvmroot/trunk/MMTk/harness/src/org/mmtk/harness/scheduler/rawthreads/RawThreadModel.java 2009-07-24 06:35:27 UTC (rev 15745)
+++ rvmroot/trunk/MMTk/harness/src/org/mmtk/harness/scheduler/rawthreads/RawThreadModel.java 2009-07-27 02:59:20 UTC (rev 15746)
@@ -52,6 +52,10 @@
   /** The global scheduler thread */
   private final Thread scheduler = Thread.currentThread();
 
+  private static void trace(String message) {
+    Trace.trace(Item.SCHEDULER, "%d: "+message, Thread.currentThread().getId());
+  }
+
   /**
    * The 'scheduler woken' flag.
    *
@@ -146,7 +150,7 @@
     return ((CollectorThread)current).c;
   }
 
-  private int currentRendezvous = 0;
+  private int currentRendezvous = -1;
 
   /**
    * The number of mutators waiting for a collection to proceed.
@@ -164,14 +168,18 @@
   @Override
   public int rendezvous(int where) {
     Trace.trace(Item.SCHEDULER, "%d: rendezvous(%d)", current.getId(), where);
-    if (!isState(RENDEZVOUS)) {
+    if (currentRendezvous == -1) {
       currentRendezvous = where;
-      setState(RENDEZVOUS);
     } else {
       assert currentRendezvous == where;
     }
     current.setOrdinal(rendezvousQueue.size()+1);
-    yield(rendezvousQueue);
+    if (rendezvousQueue.size() == collectors.size()-1) {
+      makeRunnable(rendezvousQueue);
+      currentRendezvous = -1;
+    } else {
+      yield(rendezvousQueue);
+    }
     Trace.trace(Item.SCHEDULER, "%d: rendezvous(%d) complete: ordinal = %d", current.getId(), where,current.getOrdinal());
     return current.getOrdinal();
   }
@@ -184,20 +192,21 @@
    */
   @Override
   public int mutatorRendezvous(String where, int expected) {
-    Trace.trace(Item.SCHEDULER, "%s: rendezvous(%d)", current.getId(), where);
-    List<RawThread> queue = rendezvousQueues.get("Barrier-"+where);
+    String barrierName = "Barrier-"+where;
+    Trace.trace(Item.SCHEDULER, "%s: rendezvous(%s)", current.getId(), barrierName);
+    List<RawThread> queue = rendezvousQueues.get(barrierName);
     if (queue == null) {
       queue = new ArrayList<RawThread>(expected);
-      rendezvousQueues.put("Barrier-"+where, queue);
+      rendezvousQueues.put(barrierName, queue);
     }
     current.setOrdinal(queue.size()+1);
     if (queue.size() == expected-1) {
       makeRunnable(queue,false);
-      rendezvousQueues.put("Barrier-"+where, null);
+      rendezvousQueues.put(barrierName, null);
     } else {
       yield(queue);
     }
-    Trace.trace(Item.SCHEDULER, "%d: rendezvous(%d) complete: ordinal = %d", current.getId(), where,current.getOrdinal());
+    Trace.trace(Item.SCHEDULER, "%d: rendezvous(%s) complete: ordinal = %d", current.getId(), barrierName,current.getOrdinal());
     return current.getOrdinal();
   }
 
@@ -268,9 +277,16 @@
     }
   }
 
+  /**
+   * A GC has been requested.  A Mutator thread calls this when it sees the request,
+   * and wishes to wait for the GC.  In the raw-threads case, we yield to the
+   * collectorWaitQueue.
+   *
+   * @see org.mmtk.harness.scheduler.ThreadModel#waitForGCStart()
+   */
   @Override
   public void waitForGCStart() {
-    Trace.trace(Item.SCHEDULER, "%d: Yielding to collector wait queue", Thread.currentThread().getId());
+    trace("Yielding to collector wait queue");
     yield(collectorWaitQueue);
   }
 
@@ -381,15 +397,6 @@
             assert ! unitTest && (mutators.size() == 0 || !runQueue.isEmpty()) :
               "Runqueue cannot be empty while GC is in progress";
             break;
-          case RENDEZVOUS:
-            if (runQueue.isEmpty()) {
-              assert rendezvousQueue.size() == collectors.size();
-              Trace.trace(Item.SCHEDULER, "%d: Rendezvous complete - changing to state GC", scheduler.getId());
-              setState(GC);
-              makeRunnable(rendezvousQueue);
-              currentRendezvous = 0;
-            }
-            break;
         }
       }
     }

Modified: rvmroot/trunk/MMTk/harness/test-scripts/lang/barriers.script
===================================================================
--- rvmroot/trunk/MMTk/harness/test-scripts/lang/barriers.script 2009-07-24 06:35:27 UTC (rev 15745)
+++ rvmroot/trunk/MMTk/harness/test-scripts/lang/barriers.script 2009-07-27 02:59:20 UTC (rev 15746)
@@ -34,6 +34,7 @@
   print("Phase 2 - GC complete");
   barrierWait("thread2-end",3);  
   print("Phase 2 - end");
+  print ("PASSED");
 }
 
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.

------------------------------------------------------------------------------
_______________________________________________
Jikesrvm-commits mailing list
Jikesrvm-commits@...
https://lists.sourceforge.net/lists/listinfo/jikesrvm-commits