aboutsummaryrefslogtreecommitdiff
path: root/stage1/KeyLockedLazyCache.scala
diff options
context:
space:
mode:
authorChristopher Vogt <oss.nsp@cvogt.org>2016-03-12 00:02:22 -0500
committerChristopher Vogt <oss.nsp@cvogt.org>2016-03-12 00:29:21 -0500
commitdba77034209f7f08e5b0f894d1973686f688c2d0 (patch)
tree68d412a23cc4242bcc7618d55243f14b5dc58c1a /stage1/KeyLockedLazyCache.scala
parent55fff670befc97a871cf0f85c65764e108f3d3c1 (diff)
downloadcbt-dba77034209f7f08e5b0f894d1973686f688c2d0.tar.gz
cbt-dba77034209f7f08e5b0f894d1973686f688c2d0.tar.bz2
cbt-dba77034209f7f08e5b0f894d1973686f688c2d0.zip
A draft implementation that runs builds concurrently (probably buggy right now). Is CBT "reactive" now ;)?
Diffstat (limited to 'stage1/KeyLockedLazyCache.scala')
-rw-r--r--stage1/KeyLockedLazyCache.scala33
1 files changed, 33 insertions, 0 deletions
diff --git a/stage1/KeyLockedLazyCache.scala b/stage1/KeyLockedLazyCache.scala
new file mode 100644
index 0000000..c8b37ea
--- /dev/null
+++ b/stage1/KeyLockedLazyCache.scala
@@ -0,0 +1,33 @@
+/*
+package cbt
+import java.util.concurrent.ConcurrentHashMap
+import scala.concurrent.Future
+
+/**
+A cache that lazily computes values if needed during lookup.
+Locking occurs on the key, so separate keys can be looked up
+simultaneously without a deadlock.
+*/
+final private[cbt] class KeyLockedLazyCache[Key <: AnyRef,Value]{
+ private val keys = new ConcurrentHashMap[Key,LockableKey]()
+ private val builds = new ConcurrentHashMap[LockableKey,Value]()
+
+ private class LockableKey
+ def get( key: Key, value: => Value ): Value = {
+ val keyObject = keys.synchronized{
+ if( ! (keys containsKey key) ){
+ keys.put( key, new LockableKey )
+ }
+ keys get key
+ }
+ // synchronizing on key only, so asking for a particular key does
+ // not block the whole cache, but just that cache entry
+ key.synchronized{
+ if( ! (builds containsKey keyObject) ){
+ builds.put( keyObject, value )
+ }
+ builds get keyObject
+ }
+ }
+}
+*/