aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/context/Storage.scala
diff options
context:
space:
mode:
Diffstat (limited to 'kamon-core/src/main/scala/kamon/context/Storage.scala')
-rw-r--r--kamon-core/src/main/scala/kamon/context/Storage.scala33
1 files changed, 23 insertions, 10 deletions
diff --git a/kamon-core/src/main/scala/kamon/context/Storage.scala b/kamon-core/src/main/scala/kamon/context/Storage.scala
index 7bbca111..2b409592 100644
--- a/kamon-core/src/main/scala/kamon/context/Storage.scala
+++ b/kamon-core/src/main/scala/kamon/context/Storage.scala
@@ -27,23 +27,36 @@ object Storage {
def close(): Unit
}
-
+ /**
+ * Wrapper that implements optimized {@link ThreadLocal} access pattern ideal for heavily used
+ * ThreadLocals.
+ *
+ * <p> It is faster to use a mutable holder object and always perform ThreadLocal.get() and never use
+ * ThreadLocal.set(), because the value is more likely to be found in the ThreadLocalMap direct hash
+ * slot and avoid the slow path ThreadLocalMap.getEntryAfterMiss().
+ *
+ * <p> Credit to @trask from the FastThreadLocal in glowroot.
+ *
+ * <p> One small change is that we don't use an kamon-defined holder object as that would prevent class unloading.
+ *
+ * */
class ThreadLocal extends Storage {
- private val tls = new java.lang.ThreadLocal[Context]() {
- override def initialValue(): Context = Context.Empty
+ private val tls = new java.lang.ThreadLocal[Array[AnyRef]]() {
+ override def initialValue(): Array[AnyRef] =
+ Array(Context.Empty)
}
override def current(): Context =
- tls.get()
+ tls.get()(0).asInstanceOf[Context]
- override def store(context: Context): Scope = {
- val newContext = context
- val previousContext = tls.get()
- tls.set(newContext)
+ override def store(newContext: Context): Scope = {
+ val ref = tls.get()
+ val previousContext = ref(0)
+ ref(0) = newContext
new Scope {
override def context: Context = newContext
- override def close(): Unit = tls.set(previousContext)
+ override def close(): Unit = ref(0) = previousContext
}
}
}
@@ -51,4 +64,4 @@ object Storage {
object ThreadLocal {
def apply(): ThreadLocal = new ThreadLocal()
}
-} \ No newline at end of file
+}