From: <dgr...@us...> - 2007-09-13 01:15:54
|
Revision: 13567 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=13567&view=rev Author: dgrove-oss Date: 2007-09-12 18:15:52 -0700 (Wed, 12 Sep 2007) Log Message: ----------- WIP for RVM-214. Rewrite IdleThread's spin loop to use VM_Time.cycles instead of VM_Time.nanoTime. All we really want to accomplish here is to spinwait "a little bit" to see if work is about to show up before we do the pthread level yield/sleep operations. We don't need "a little bit" to be a precise amount of time, just something in order of a few hundred microseconds. Modified Paths: -------------- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/VM_IdleThread.java Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/VM_IdleThread.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/VM_IdleThread.java 2007-09-12 11:36:16 UTC (rev 13566) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/VM_IdleThread.java 2007-09-13 01:15:52 UTC (rev 13567) @@ -64,20 +64,20 @@ if (runInitProc) myProcessor.initializeProcessor(); - // Only perform load balancing if there is more than one processor. - final boolean loadBalancing = VM_GreenScheduler.numProcessors > 1; - long spinNano = loadBalancing ? ((long)1e6) : 0; main: while (true) { if (VM_Scheduler.terminated) terminate(); if (VM.VerifyAssertions) VM._assert(processorAffinity.idleQueue.isEmpty()); - long t = VM_Time.nanoTime() + spinNano; if (VM_Scheduler.debugRequested) { VM.sysWriteln("debug requested in idle thread"); VM_Scheduler.debugRequested = false; } + /* Short term spin loop; wait for a little bit to see if a thread quickly becomes runnable */ + long startCycles = VM_Time.cycles(); + long endCycles = startCycles + ((long) 1e6); // a few hundred microseconds more or less. + long nowCycles; do { VM_GreenProcessor.idleProcessor = myProcessor; if (availableWork(myProcessor)) { @@ -87,10 +87,11 @@ VM_GreenThread.yield(VM_GreenProcessor.getCurrentProcessor().idleQueue); continue main; } - } while (VM_Time.nanoTime() < t); + nowCycles = VM_Time.cycles(); + } while (startCycles < nowCycles && nowCycles < endCycles); /* check against both ends to guard against CPU migration */ /* Now go into the long-term sleep/check-for-work loop. */ - for (; ;) { + while (true) { sysCall.sysVirtualProcessorYield(); if (availableWork(myProcessor)) { continue main; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |