From 98598dfc19b1852e5acbea2802fc0fff1c89a7fc Mon Sep 17 00:00:00 2001 From: Diego Date: Sat, 29 Sep 2018 19:58:34 -0300 Subject: ContextHolder --- .../agent/bootstrap/context/ContextHolder.java | 9 +++++ .../main/scala/kamon/context/ContextHolder.scala | 3 ++ .../src/main/scala/kamon/context/Storage.scala | 46 ++++++++++++++++++++-- 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 kamon-core/src/main/java/kanela/agent/bootstrap/context/ContextHolder.java create mode 100644 kamon-core/src/main/scala/kamon/context/ContextHolder.scala (limited to 'kamon-core/src/main') diff --git a/kamon-core/src/main/java/kanela/agent/bootstrap/context/ContextHolder.java b/kamon-core/src/main/java/kanela/agent/bootstrap/context/ContextHolder.java new file mode 100644 index 00000000..ae8d41b6 --- /dev/null +++ b/kamon-core/src/main/java/kanela/agent/bootstrap/context/ContextHolder.java @@ -0,0 +1,9 @@ +package kanela.agent.bootstrap.context; + +public final class ContextHolder { + public Object value; + + public ContextHolder(Object value) { + this.value = value; + } +} diff --git a/kamon-core/src/main/scala/kamon/context/ContextHolder.scala b/kamon-core/src/main/scala/kamon/context/ContextHolder.scala new file mode 100644 index 00000000..321d478f --- /dev/null +++ b/kamon-core/src/main/scala/kamon/context/ContextHolder.scala @@ -0,0 +1,3 @@ +//package kanela.agent.bootstrap.context +// +//final class ContextHolder(var value: Object) diff --git a/kamon-core/src/main/scala/kamon/context/Storage.scala b/kamon-core/src/main/scala/kamon/context/Storage.scala index 2b409592..5ead7db9 100644 --- a/kamon-core/src/main/scala/kamon/context/Storage.scala +++ b/kamon-core/src/main/scala/kamon/context/Storage.scala @@ -15,6 +15,10 @@ package kamon.context +import kanela.agent.bootstrap.context.ContextHolder + +//import kanela.agent.bootstrap.context.ContextHolder + trait Storage { def current(): Context def store(context: Context): Storage.Scope @@ -40,7 +44,15 @@ object Storage { *

One small change is that we don't use an kamon-defined holder object as that would prevent class unloading. * * */ - class ThreadLocal extends Storage { + + object ThreadLocal { + def apply(): Storage = { + if(classOf[ContextHolder].getClassLoader == null) SuperFastThreadLocal() + else FastThreadLocal() + } + } + + final class FastThreadLocal extends Storage { private val tls = new java.lang.ThreadLocal[Array[AnyRef]]() { override def initialValue(): Array[AnyRef] = Array(Context.Empty) @@ -61,7 +73,35 @@ object Storage { } } - object ThreadLocal { - def apply(): ThreadLocal = new ThreadLocal() + object FastThreadLocal { + def apply(): FastThreadLocal = new FastThreadLocal() + } + + + final class SuperFastThreadLocal extends Storage { + private val tls = new java.lang.ThreadLocal[ContextHolder]() { + override def initialValue(): ContextHolder = { + new ContextHolder(Context.Empty) + } + } + + override def current(): Context = + tls.get().value.asInstanceOf[Context] + + override def store(newContext: Context): Scope = { + val ref = tls.get() + val previousContext = ref.value + ref.value = newContext + + new Scope { + override def context: Context = newContext + override def close(): Unit = ref.value = previousContext + } + } + } + + object SuperFastThreadLocal { + def apply(): SuperFastThreadLocal = new SuperFastThreadLocal() } } + -- cgit v1.2.3