diff options
| author | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2022-07-29 16:59:16 +0200 |
|---|---|---|
| committer | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2022-07-29 16:59:16 +0200 |
| commit | 0f7773e8546ad2fdc6ea44a1bbc0a5d82399667f (patch) | |
| tree | 3b064619743c0063a0b8bf21d9240b8dc5502f67 /opendc-trace/opendc-trace-api/src | |
| parent | 6d5734447048552c46a5c46dbf630f0e5be50765 (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')
| -rw-r--r-- | opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/spi/TraceFormat.kt | 12 |
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 } + } } } |
