So it works like this:

_current - maintains a stack of call_id specific to each thread.
_calls - stores all Call objects keyed by call_id and is shared by all threads.

thread_1:
1. call_1 = Call(foo)    {id:10}
2. call_1()                 Call._current.stack = [10]
3. call_2 = Call(foo)    {id:20}
4. call_2()                 Call._current.stack = [10, 20] 

_calls = {10: call_1, 20: call_2}

thread_2:
1. call_3 = Call(foo)    {id:30}
2. call_3()                 Call._current.stack = [30] 

_calls = {10: call_1, 20: call_2, 30: call_3}