Get current `coroutineContext` inside a regular function


#1

Hello,
I asked the following question in Stack Overflow: https://stackoverflow.com/questions/54661138/how-to-get-current-coroutinecontext-from-a-non-suspend-function

But I am repeating here :slight_smile:

I would like to get the current coroutineContext inside a regular function declared as:

fun log(message: String)

If it is not running inside a coroutine I am fine will null.

Basically, instead of:

public suspend inline val coroutineContext: CoroutineContext

I need:

public inline val coroutineContext: CoroutineContext?

This is entirely for logging purposes. I need to log a certain element from the context (in some way this is similar how coroutine’s name is appended to Thread.currentThread().name for debugging).

Is this possible? Thanks!


#2

No, it is not. Coroutine context. Non-suspending function does not have a context. You need to pass it explicitly to your function as parameter or receiver.


#3

The way I solved it is to use ThreadLocal instead of CoroutineContext.Element to keep the value in question, then use asContextElement to have coroutine context manage the ThreadLocal. This is explained in the docs here: https://github.com/Kotlin/kotlinx.coroutines/blob/master/docs/coroutine-context-and-dispatchers.md#thread-local-data

Then ThreadLocal is accessible both from suspend fun and fun. In this way, ThreadLocals seem more powerful than coroutine context, since it is accessible from everywhere.

Technically, it would be even possible to expose coroutineContext as a ThreadLocal.