@@ -12,7 +12,7 @@ const maxSpans = 300
12
12
type traceContext struct {
13
13
sw * spanWrapper
14
14
n int
15
- Data interface {}
15
+ Data map [ string ] interface {}
16
16
}
17
17
18
18
type spanWrapper struct {
@@ -71,22 +71,31 @@ func (tc *traceContext) clear() {
71
71
}
72
72
73
73
func (tc * traceContext ) TakeSnapShot () interface {} {
74
+ // take a deep copy to avoid reading & writing the same map at the same time
75
+ var dataCopy = make (map [string ]interface {})
76
+ for key , value := range tc .Data {
77
+ dataCopy [key ] = value
78
+ }
74
79
if tc .n == 0 {
75
- return & traceContext {nil , 0 , tc . Data }
80
+ return & traceContext {nil , 0 , dataCopy }
76
81
}
77
82
last := tc .tail ()
78
83
sw := & spanWrapper {last , nil }
79
- return & traceContext {sw , 1 , tc . Data }
84
+ return & traceContext {sw , 1 , dataCopy }
80
85
}
81
86
82
- func GetGLocalData () interface {} {
87
+ func GetGLocalData (key string ) interface {} {
83
88
t := getOrInitTraceContext ()
84
- return t .Data
89
+ r := t .Data [key ]
90
+ return r
85
91
}
86
92
87
- func SetGLocalData (data interface {}) {
93
+ func SetGLocalData (key string , value interface {}) {
88
94
t := getOrInitTraceContext ()
89
- t .Data = data
95
+ if t .Data == nil {
96
+ t .Data = make (map [string ]interface {})
97
+ }
98
+ t .Data [key ] = value
90
99
setTraceContext (t )
91
100
}
92
101
0 commit comments