diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/reflect/scala/reflect/runtime/SynchronizedSymbols.scala | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/reflect/scala/reflect/runtime/SynchronizedSymbols.scala b/src/reflect/scala/reflect/runtime/SynchronizedSymbols.scala index 298d0ffebd..1a232c8de1 100644 --- a/src/reflect/scala/reflect/runtime/SynchronizedSymbols.scala +++ b/src/reflect/scala/reflect/runtime/SynchronizedSymbols.scala @@ -32,8 +32,15 @@ private[reflect] trait SynchronizedSymbols extends internal.Symbols { self: Symb trait SynchronizedSymbol extends Symbol { def gilSynchronizedIfNotInited[T](body: => T): T = { - if (isFullyInitialized) body - else gilSynchronized { body } + // TODO JZ desired, but prone to race conditions. We need the runtime reflection based + // type completers to establish a memory barrier upon initialization. Maybe a volatile + // write? We need to consult with the experts here. Until them, lock pessimistically. + // + // `run/reflection-sync-subtypes.scala` fails about 1/50 times otherwise. + // + // if (isFullyInitialized) body + // else gilSynchronized { body } + gilSynchronized { body } } override def validTo = gilSynchronizedIfNotInited { super.validTo } |