providerglobal.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. //go:build windows
  2. // +build windows
  3. package etw
  4. import (
  5. "sync"
  6. )
  7. // Because the provider callback function needs to be able to access the
  8. // provider data when it is invoked by ETW, we need to keep provider data stored
  9. // in a global map based on an index. The index is passed as the callback
  10. // context to ETW.
  11. type providerMap struct {
  12. m map[uint]*Provider
  13. i uint
  14. lock sync.Mutex
  15. }
  16. var providers = providerMap{
  17. m: make(map[uint]*Provider),
  18. }
  19. func (p *providerMap) newProvider() *Provider {
  20. p.lock.Lock()
  21. defer p.lock.Unlock()
  22. i := p.i
  23. p.i++
  24. provider := &Provider{
  25. index: i,
  26. }
  27. p.m[i] = provider
  28. return provider
  29. }
  30. func (p *providerMap) removeProvider(provider *Provider) {
  31. p.lock.Lock()
  32. defer p.lock.Unlock()
  33. delete(p.m, provider.index)
  34. }
  35. func (p *providerMap) getProvider(index uint) *Provider {
  36. p.lock.Lock()
  37. defer p.lock.Unlock()
  38. return p.m[index]
  39. }
  40. //todo: combine these into struct, so that "globalProviderCallback" is guaranteed to be initialized through method access
  41. var providerCallbackOnce sync.Once
  42. var globalProviderCallback uintptr