Skip to content

Commit

Permalink
Use WeakReference to allow garbage collection of Linkers
Browse files Browse the repository at this point in the history
- Use mutable.Map instead of immutable as cache
  • Loading branch information
lolgab committed Nov 24, 2020
1 parent cd86efd commit 89b116a
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 21 deletions.
29 changes: 18 additions & 11 deletions scalajslib/worker/0.6/src/ScalaJSWorkerImpl.scala
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,31 @@ import mill.scalajslib.api.{JsEnvConfig, ModuleKind}
import org.scalajs.core.tools.io.IRFileCache.IRContainer
import org.scalajs.core.tools.io._
import org.scalajs.core.tools.jsdep.ResolvedJSDependency
import org.scalajs.core.tools.linker.{Linker, ModuleInitializer, Semantics, StandardLinker, ModuleKind => ScalaJSModuleKind}
import org.scalajs.core.tools.linker.{
Linker,
ModuleInitializer,
Semantics,
StandardLinker,
ModuleKind => ScalaJSModuleKind
}
import org.scalajs.core.tools.logging.ScalaConsoleLogger
import org.scalajs.jsenv._
import org.scalajs.testadapter.TestAdapter

import scala.collection.mutable
import scala.ref.WeakReference

class ScalaJSWorkerImpl extends mill.scalajslib.api.ScalaJSWorkerApi {
private case class LinkerInput(fullOpt: Boolean, moduleKind: ModuleKind, useECMAScript2015: Boolean)
private object ScalaJSLinker {
private var cache = Map.empty[LinkerInput, Linker]
def reuseOrCreate(input: LinkerInput): Linker =
cache.getOrElse(
input,
{
val newLinker = createLinker(input)
cache += (input -> newLinker)
newLinker
}
)
private val cache = mutable.Map.empty[LinkerInput, WeakReference[Linker]]
def reuseOrCreate(input: LinkerInput): Linker = cache.get(input) match {
case Some(WeakReference(linker)) => linker
case _ =>
val newLinker = createLinker(input)
cache.update(input, WeakReference(newLinker))
newLinker
}
private def createLinker(input: LinkerInput): Linker = {
val semantics = input.fullOpt match {
case true => Semantics.Defaults.optimized
Expand Down
21 changes: 11 additions & 10 deletions scalajslib/worker/1/src/ScalaJSWorkerImpl.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,20 @@ import org.scalajs.jsenv.nodejs.NodeJSEnv.SourceMap
import org.scalajs.testing.adapter.TestAdapter
import org.scalajs.testing.adapter.{TestAdapterInitializer => TAI}

import scala.collection.mutable
import scala.ref.WeakReference

class ScalaJSWorkerImpl extends mill.scalajslib.api.ScalaJSWorkerApi {
private case class LinkerInput(fullOpt: Boolean, moduleKind: ModuleKind, useECMAScript2015: Boolean)
private object ScalaJSLinker {
private var cache = Map.empty[LinkerInput, Linker]
def reuseOrCreate(input: LinkerInput): Linker =
cache.getOrElse(
input,
{
val newLinker = createLinker(input)
cache += (input -> newLinker)
newLinker
}
)
private val cache = mutable.Map.empty[LinkerInput, WeakReference[Linker]]
def reuseOrCreate(input: LinkerInput): Linker = cache.get(input) match {
case Some(WeakReference(linker)) => linker
case _ =>
val newLinker = createLinker(input)
cache.update(input, WeakReference(newLinker))
newLinker
}
private def createLinker(input: LinkerInput): Linker = {
val semantics = input.fullOpt match {
case true => Semantics.Defaults.optimized
Expand Down

0 comments on commit 89b116a

Please sign in to comment.