aboutsummaryrefslogtreecommitdiff
path: root/stage1/resolver.scala
diff options
context:
space:
mode:
authorChristopher Vogt <oss.nsp@cvogt.org>2016-11-09 23:48:25 -0500
committerChristopher Vogt <oss.nsp@cvogt.org>2016-11-09 23:48:25 -0500
commit5c5bac097e4d81b3a826c3dade041c4bdbb05b77 (patch)
tree37cf61da070b2c32f23dbf09f2bd92585fe5609a /stage1/resolver.scala
parent75310e0cb942883545f0a142b2e7b61dbb1134b4 (diff)
downloadcbt-5c5bac097e4d81b3a826c3dade041c4bdbb05b77.tar.gz
cbt-5c5bac097e4d81b3a826c3dade041c4bdbb05b77.tar.bz2
cbt-5c5bac097e4d81b3a826c3dade041c4bdbb05b77.zip
fix java.lang.LinkageError due to cache invalidation bug
cbtHasChanged does never change across one run. However classLoaderRecursion removes the corresponding classloader if needsUpdate is true. It is called multiple times meaning it removes and re-creates the classloader on every call leading to potentially multiple conflicting cbt classloaders. needsUpdate should never be returning true more than ones across a single run. Otherwise it can lead to this error: java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "Build.lib()Lcbt/Lib;" the class loader (instance of cbt/URLClassLoader) of the current class, Build, and the class loader (instance of cbt/URLClassLoader) for interface cbt/BaseBuild have different Class objects for the type cbt/Lib used in the signature
Diffstat (limited to 'stage1/resolver.scala')
-rw-r--r--stage1/resolver.scala13
1 files changed, 10 insertions, 3 deletions
diff --git a/stage1/resolver.scala b/stage1/resolver.scala
index 13e8e52..e45237d 100644
--- a/stage1/resolver.scala
+++ b/stage1/resolver.scala
@@ -11,6 +11,13 @@ trait DependencyImplementation extends Dependency{
implicit protected def logger: Logger
protected def lib = new Stage1Lib(logger)
+ /**
+ CAREFUL: this is never allowed to return true for the same dependency more than
+ once in a single cbt run. Otherwise we can end up with multiple classloaders
+ for the same classes since classLoaderRecursion recreates the classLoader when it
+ sees this flag and it can be called multiple times. Maybe we can find a safer
+ solution than this current state.
+ */
def needsUpdate: Boolean
//def cacheClassLoader: Boolean = false
private[cbt] def targetClasspath: ClassPath
@@ -137,7 +144,7 @@ case class Dependencies( dependencies: Seq[Dependency] )(implicit val logger: Lo
}
case class Stage1Dependency(cbtHasChanged: Boolean, mavenCache: File, nailgunTarget: File, stage1Target: File, compatibilityTarget: File)(implicit val logger: Logger) extends DependencyImplementation{
- override def needsUpdate = cbtHasChanged
+ override def needsUpdate = false
override def targetClasspath = exportedClasspath
override def exportedClasspath = ClassPath( Seq(nailgunTarget, stage1Target) )
val compatibilityDependency = CompatibilityDependency(cbtHasChanged, compatibilityTarget)
@@ -150,13 +157,13 @@ case class Stage1Dependency(cbtHasChanged: Boolean, mavenCache: File, nailgunTar
)
}
case class CompatibilityDependency(cbtHasChanged: Boolean, compatibilityTarget: File)(implicit val logger: Logger) extends DependencyImplementation{
- override def needsUpdate = cbtHasChanged
+ override def needsUpdate = false
override def targetClasspath = exportedClasspath
override def exportedClasspath = ClassPath( Seq(compatibilityTarget) )
override def dependencies = Seq()
}
case class CbtDependency(cbtHasChanged: Boolean, mavenCache: File, nailgunTarget: File, stage1Target: File, stage2Target: File, compatibilityTarget: File)(implicit val logger: Logger) extends DependencyImplementation{
- override def needsUpdate = cbtHasChanged
+ override def needsUpdate = false
override def targetClasspath = exportedClasspath
override def exportedClasspath = ClassPath( Seq( stage2Target ) )
val stage1Dependency = Stage1Dependency(cbtHasChanged, mavenCache, nailgunTarget, stage1Target, compatibilityTarget)