-
Notifications
You must be signed in to change notification settings - Fork 820
/
Copy pathAsyncLocalRuntimeContextSlot.cs
56 lines (49 loc) · 1.4 KB
/
AsyncLocalRuntimeContextSlot.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
using System.Runtime.CompilerServices;
namespace OpenTelemetry.Context;
/// <summary>
/// The async local implementation of context slot.
/// </summary>
/// <typeparam name="T">The type of the underlying value.</typeparam>
public class AsyncLocalRuntimeContextSlot<T> : RuntimeContextSlot<T>, IRuntimeContextSlotValueAccessor
{
private readonly AsyncLocal<T> slot;
/// <summary>
/// Initializes a new instance of the <see cref="AsyncLocalRuntimeContextSlot{T}"/> class.
/// </summary>
/// <param name="name">The name of the context slot.</param>
public AsyncLocalRuntimeContextSlot(string name)
: base(name)
{
this.slot = new AsyncLocal<T>();
}
/// <inheritdoc/>
public object? Value
{
get => this.slot.Value;
set
{
if (typeof(T).IsValueType && value is null)
{
this.slot.Value = default!;
}
else
{
this.slot.Value = (T)value!;
}
}
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override T? Get()
{
return this.slot.Value;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override void Set(T value)
{
this.slot.Value = value;
}
}