summaryrefslogtreecommitdiff
path: root/opendc-trace/opendc-trace-api/src/main/kotlin/org
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2022-07-29 16:59:16 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2022-07-29 16:59:16 +0200
commit0f7773e8546ad2fdc6ea44a1bbc0a5d82399667f (patch)
tree3b064619743c0063a0b8bf21d9240b8dc5502f67 /opendc-trace/opendc-trace-api/src/main/kotlin/org
parent6d5734447048552c46a5c46dbf630f0e5be50765 (diff)
fix(trace/api): Do not cache trace formats
This change updates the TraceFormat lookup algorithm to prevent caching the available trace format on first access. Since the result of ServiceLoader depends on the Thread's context ClassLoader, they may differ between different threads. Furthermore, ServiceLoader maintains its own thread-local cache, so we can instead utilize that cache and always use the results returned by it.
Diffstat (limited to 'opendc-trace/opendc-trace-api/src/main/kotlin/org')
-rw-r--r--opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/spi/TraceFormat.kt12
1 files changed, 7 insertions, 5 deletions
diff --git a/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/spi/TraceFormat.kt b/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/spi/TraceFormat.kt
index eff6fa83..26e81cf8 100644
--- a/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/spi/TraceFormat.kt
+++ b/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/spi/TraceFormat.kt
@@ -90,18 +90,20 @@ public interface TraceFormat {
*/
public companion object {
/**
- * A list of [TraceFormat] that are available on this system.
+ * Obtain a list of [TraceFormat] that are available in the current thread context.
*/
@JvmStatic
- public val installedProviders: List<TraceFormat> by lazy {
- val loader = ServiceLoader.load(TraceFormat::class.java)
- loader.toList()
+ public fun getInstalledProviders(): Iterable<TraceFormat> {
+ return ServiceLoader.load(TraceFormat::class.java)
}
/**
* Obtain a [TraceFormat] implementation by [name].
*/
@JvmStatic
- public fun byName(name: String): TraceFormat? = installedProviders.find { it.name == name }
+ public fun byName(name: String): TraceFormat? {
+ val loader = ServiceLoader.load(TraceFormat::class.java)
+ return loader.find { it.name == name }
+ }
}
}