aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/util
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2015-02-04 05:32:45 +0100
committerIvan Topolnjak <ivantopo@gmail.com>2015-02-04 05:32:45 +0100
commit82a110b23ca57286e4e3dd0315c20ed99b5e8f88 (patch)
tree830dc660c5597707407ac7c280f332f7dd4c9ede /kamon-core/src/main/scala/kamon/util
parent1b39bfb30e338c3d6c8284ae1276fb0c7eae7cc7 (diff)
downloadKamon-82a110b23ca57286e4e3dd0315c20ed99b5e8f88.tar.gz
Kamon-82a110b23ca57286e4e3dd0315c20ed99b5e8f88.tar.bz2
Kamon-82a110b23ca57286e4e3dd0315c20ed99b5e8f88.zip
! core: revised semantics of .register on Metrics module to match our docs.
Diffstat (limited to 'kamon-core/src/main/scala/kamon/util')
-rw-r--r--kamon-core/src/main/scala/kamon/util/TriemapAtomicGetOrElseUpdate.scala14
1 files changed, 13 insertions, 1 deletions
diff --git a/kamon-core/src/main/scala/kamon/util/TriemapAtomicGetOrElseUpdate.scala b/kamon-core/src/main/scala/kamon/util/TriemapAtomicGetOrElseUpdate.scala
index 5ad43c34..d1197a5a 100644
--- a/kamon-core/src/main/scala/kamon/util/TriemapAtomicGetOrElseUpdate.scala
+++ b/kamon-core/src/main/scala/kamon/util/TriemapAtomicGetOrElseUpdate.scala
@@ -24,10 +24,22 @@ object TriemapAtomicGetOrElseUpdate {
* why this is necessary can be found at [[https://issues.scala-lang.org/browse/SI-7943]].
*/
implicit class Syntax[K, V](val trieMap: TrieMap[K, V]) extends AnyVal {
+
def atomicGetOrElseUpdate(key: K, op: ⇒ V): V =
+ atomicGetOrElseUpdate(key, op, { v: V ⇒ Unit })
+
+ def atomicGetOrElseUpdate(key: K, op: ⇒ V, cleanup: V ⇒ Unit): V =
trieMap.get(key) match {
case Some(v) ⇒ v
- case None ⇒ val d = op; trieMap.putIfAbsent(key, d).getOrElse(d)
+ case None ⇒
+ val d = op
+ trieMap.putIfAbsent(key, d).map { oldValue ⇒
+ // If there was an old value then `d` was never added
+ // and thus need to be cleanup.
+ cleanup(d)
+ oldValue
+
+ } getOrElse (d)
}
}
}