|
View:
New views
1 Messages
—
Rating Filter:
Alert me
|
|
|
SF.net SVN: jikesrvm:[15746] rvmroot/trunk/MMTk/harnessRevision: 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 |
| Free embeddable forum powered by Nabble | Forum Help |