diff --git a/src/main/scala/scala/tools/partest/nest/NestUI.scala b/src/main/scala/scala/tools/partest/nest/NestUI.scala index 3fb7251..0c96ac4 100644 --- a/src/main/scala/scala/tools/partest/nest/NestUI.scala +++ b/src/main/scala/scala/tools/partest/nest/NestUI.scala @@ -36,6 +36,7 @@ class NestUI(val verbose: Boolean = false, val debug: Boolean = false, val terse } val color = new Colors(colorEnabled) + private val realSysErr = System.err import color._ private[this] val (_outline, _success, _failure, _warning, _default) = @@ -137,15 +138,15 @@ class NestUI(val verbose: Boolean = false, val debug: Boolean = false, val terse } def verbose(msg: String): Unit = - if (verbose) System.err.println(msg) + if (verbose) realSysErr.println(msg) def debug(msg: String): Unit = - if (debug) System.err.println(msg) + if (debug) realSysErr.println(msg) def showAllJVMInfo(): Unit = { vlog(vmArgString) vlog(allPropertiesString) } - def vlog(msg: => String) = if (verbose) System.err.println(msg) + def vlog(msg: => String) = if (verbose) realSysErr.println(msg) } diff --git a/src/main/scala/scala/tools/partest/nest/StreamCapture.scala b/src/main/scala/scala/tools/partest/nest/StreamCapture.scala index a1cea0c..be059e6 100644 --- a/src/main/scala/scala/tools/partest/nest/StreamCapture.scala +++ b/src/main/scala/scala/tools/partest/nest/StreamCapture.scala @@ -43,6 +43,9 @@ object StreamCapture { val modified = new java.util.Properties() modified.putAll(saved) extra.foreach { case (k, v) => modified.setProperty(k, v) } + // Trying to avoid other threads seeing the new properties object prior to the new entries + // https://github.com/scala/scala/pull/6391#issuecomment-371346171 + UnsafeAccess.U.storeFence() System.setProperties(modified) try { action diff --git a/src/main/scala/scala/tools/partest/nest/UnsafeAccess.java b/src/main/scala/scala/tools/partest/nest/UnsafeAccess.java new file mode 100644 index 0000000..b686603 --- /dev/null +++ b/src/main/scala/scala/tools/partest/nest/UnsafeAccess.java @@ -0,0 +1,30 @@ +package scala.tools.partest.nest; + +import java.lang.reflect.Field; + +@SuppressWarnings("unsafe") +public class UnsafeAccess { + public final static sun.misc.Unsafe U; + + static { + U = lookupUnsafe(); + } + + private static sun.misc.Unsafe lookupUnsafe() { + try { + sun.misc.Unsafe found = null; + for (Field field : sun.misc.Unsafe.class.getDeclaredFields()) { + if (field.getType() == sun.misc.Unsafe.class) { + field.setAccessible(true); + found = (sun.misc.Unsafe) field.get(null); + break; + } + } + if (found == null) throw new IllegalStateException("Can't find instance of sun.misc.Unsafe"); + else return found; + } catch (Throwable t) { + throw new ExceptionInInitializerError(t); + } + } +} +