From: <cap...@us...> - 2009-01-09 22:22:25
|
Revision: 15273 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15273&view=rev Author: captain5050 Date: 2009-01-09 21:30:36 +0000 (Fri, 09 Jan 2009) Log Message: ----------- Merge fixes with r15258. Modified Paths: -------------- rvmroot/branches/RVM-PureNativeThread/workingMergeUp/rvm/src/org/jikesrvm/scheduler/RVMThread.java rvmroot/branches/RVM-PureNativeThread/workingMergeUp/rvm/src/org/jikesrvm/scheduler/SoftLatch.java Property Changed: ---------------- rvmroot/branches/RVM-PureNativeThread/workingMergeUp/rvm/src/org/jikesrvm/scheduler/SoftLatch.java Modified: rvmroot/branches/RVM-PureNativeThread/workingMergeUp/rvm/src/org/jikesrvm/scheduler/RVMThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/workingMergeUp/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2009-01-09 21:17:31 UTC (rev 15272) +++ rvmroot/branches/RVM-PureNativeThread/workingMergeUp/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2009-01-09 21:30:36 UTC (rev 15273) @@ -12,6 +12,9 @@ */ package org.jikesrvm.scheduler; +import java.security.AccessController; +import java.security.PrivilegedAction; + import org.jikesrvm.ArchitectureSpecific.CodeArray; import org.jikesrvm.ArchitectureSpecific.Registers; import org.jikesrvm.ArchitectureSpecificOpt.PostThreadSwitch; @@ -27,7 +30,6 @@ import org.jikesrvm.Services; import org.jikesrvm.UnimplementedError; import org.jikesrvm.adaptive.OnStackReplacementEvent; -import org.jikesrvm.adaptive.measurements.RuntimeMeasurements; import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.compilers.common.CompiledMethods; import org.jikesrvm.osr.ObjectHolder; @@ -1800,10 +1802,6 @@ VM.enableGC(); } - if (VM.BuildForAdaptiveSystem) { - RuntimeMeasurements.monitorThreadExit(); - } - // allow java.lang.Thread.exit() to remove this thread from ThreadGroup java.lang.JikesRVMSupport.threadDied(thread); @@ -1861,7 +1859,7 @@ if (VM.TraceExceptionDelivery) { VM.sysWriteln("Calling sysExit due to uncaught exception."); } - System.exit(VM.EXIT_STATUS_DYING_WITH_UNCAUGHT_EXCEPTION); + callSystemExit(VM.EXIT_STATUS_DYING_WITH_UNCAUGHT_EXCEPTION); } else if (thread instanceof MainThread) { MainThread mt = (MainThread) thread; if (!mt.launched) { @@ -1873,11 +1871,11 @@ * there is no reason why we should not support this.) This was * discussed on jikesrvm-researchers * on 23 Jan 2005 and 24 Jan 2005. */ - System.exit(VM.EXIT_STATUS_MAIN_THREAD_COULD_NOT_LAUNCH); + callSystemExit(VM.EXIT_STATUS_MAIN_THREAD_COULD_NOT_LAUNCH); } } /* Use System.exit so that any shutdown hooks are run. */ - System.exit(0); + callSystemExit(0); if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); } @@ -1899,6 +1897,37 @@ } if (traceAcct) VM.sysWriteln("returning cached lock..."); + // Switch to uninterruptible portion of termination + terminateUnpreemptible(); + } + + /** + * Call System.exit() with the correct security status. + * @param exitStatus + */ + @Interruptible + private void callSystemExit(final int exitStatus) { + AccessController.doPrivileged(new PrivilegedAction<Object>() { + //@Override // Java 1.5 - can't override interface method + public Object run() { + System.exit(exitStatus); + return null; + } + }); + } + + /** + * Unpreemptible portion of thread termination. Unpreemptible to avoid a + * dead thread from being scheduled. + */ + @Unpreemptible + private void terminateUnpreemptible() { + // release anybody waiting on this thread - + // in particular, see {@link #join()} + synchronized (this) { + notifyAllUninterruptible(this); + state = State.TERMINATED; + } // returned cached free lock if (cachedFreeLock != null) { if (Lock.trace) { Modified: rvmroot/branches/RVM-PureNativeThread/workingMergeUp/rvm/src/org/jikesrvm/scheduler/SoftLatch.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/workingMergeUp/rvm/src/org/jikesrvm/scheduler/SoftLatch.java 2009-01-09 21:17:31 UTC (rev 15272) +++ rvmroot/branches/RVM-PureNativeThread/workingMergeUp/rvm/src/org/jikesrvm/scheduler/SoftLatch.java 2009-01-09 21:30:36 UTC (rev 15273) @@ -30,10 +30,12 @@ public class SoftLatch { private boolean open; + /** Create a new latch, with the given open/closed state. */ public SoftLatch(boolean open) { this.open = open; } + /** * Open the latch and let all of the thread(s) waiting on it through. * But - if any of the threads is using waitAndClose(), then as soon @@ -43,6 +45,7 @@ open=true; notifyAll(); } + /** * Close the latch, causing future calls to wait() or waitAndClose() * to block. @@ -50,6 +53,7 @@ public synchronized void close() { open=false; } + /** * Wait for the latch to become open. If it is already open, don't * wait at all. @@ -63,6 +67,7 @@ } } } + /** * Wait for the latch to become open, and then close it and return. * If the latch is already open, don't wait at all, just close it @@ -80,8 +85,3 @@ } } -/* For the emacs weenies in the crowd. -Local Variables: - c-basic-offset: 2 -End: -*/ Property changes on: rvmroot/branches/RVM-PureNativeThread/workingMergeUp/rvm/src/org/jikesrvm/scheduler/SoftLatch.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |