mirror of https://github.com/k3s-io/k3s
53 lines
943 B
Go
53 lines
943 B
Go
|
package etw
|
||
|
|
||
|
import (
|
||
|
"sync"
|
||
|
)
|
||
|
|
||
|
// Because the provider callback function needs to be able to access the
|
||
|
// provider data when it is invoked by ETW, we need to keep provider data stored
|
||
|
// in a global map based on an index. The index is passed as the callback
|
||
|
// context to ETW.
|
||
|
type providerMap struct {
|
||
|
m map[uint]*Provider
|
||
|
i uint
|
||
|
lock sync.Mutex
|
||
|
once sync.Once
|
||
|
}
|
||
|
|
||
|
var providers = providerMap{
|
||
|
m: make(map[uint]*Provider),
|
||
|
}
|
||
|
|
||
|
func (p *providerMap) newProvider() *Provider {
|
||
|
p.lock.Lock()
|
||
|
defer p.lock.Unlock()
|
||
|
|
||
|
i := p.i
|
||
|
p.i++
|
||
|
|
||
|
provider := &Provider{
|
||
|
index: i,
|
||
|
}
|
||
|
|
||
|
p.m[i] = provider
|
||
|
return provider
|
||
|
}
|
||
|
|
||
|
func (p *providerMap) removeProvider(provider *Provider) {
|
||
|
p.lock.Lock()
|
||
|
defer p.lock.Unlock()
|
||
|
|
||
|
delete(p.m, provider.index)
|
||
|
}
|
||
|
|
||
|
func (p *providerMap) getProvider(index uint) *Provider {
|
||
|
p.lock.Lock()
|
||
|
defer p.lock.Unlock()
|
||
|
|
||
|
return p.m[index]
|
||
|
}
|
||
|
|
||
|
var providerCallbackOnce sync.Once
|
||
|
var globalProviderCallback uintptr
|