1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-06-29 02:35:23 +00:00
v2fly/stats.go

88 lines
1.5 KiB
Go
Raw Normal View History

2018-03-30 17:56:59 +00:00
package core
import (
"sync"
)
type StatCounter interface {
Value() int64
2018-03-30 21:17:28 +00:00
Set(int64) int64
2018-03-30 17:56:59 +00:00
Add(int64) int64
}
type StatManager interface {
Feature
RegisterCounter(string) (StatCounter, error)
GetCounter(string) StatCounter
}
2018-04-11 22:10:14 +00:00
// GetOrRegisterStatCounter tries to get the StatCounter first. If not exist, it then tries to create a new counter.
func GetOrRegisterStatCounter(m StatManager, name string) (StatCounter, error) {
counter := m.GetCounter(name)
if counter != nil {
return counter, nil
}
return m.RegisterCounter(name)
}
2018-03-30 17:56:59 +00:00
type syncStatManager struct {
sync.RWMutex
StatManager
}
func (s *syncStatManager) Start() error {
s.RLock()
defer s.RUnlock()
if s.StatManager == nil {
2018-03-31 08:30:12 +00:00
return nil
2018-03-30 17:56:59 +00:00
}
return s.StatManager.Start()
}
func (s *syncStatManager) Close() error {
s.RLock()
defer s.RUnlock()
if s.StatManager == nil {
2018-03-31 08:30:12 +00:00
return nil
2018-03-30 17:56:59 +00:00
}
return s.StatManager.Close()
}
func (s *syncStatManager) RegisterCounter(name string) (StatCounter, error) {
s.RLock()
defer s.RUnlock()
if s.StatManager == nil {
return nil, newError("StatManager not set.")
}
return s.StatManager.RegisterCounter(name)
}
func (s *syncStatManager) GetCounter(name string) StatCounter {
s.RLock()
defer s.RUnlock()
if s.StatManager == nil {
return nil
}
return s.StatManager.GetCounter(name)
}
func (s *syncStatManager) Set(m StatManager) {
2018-04-03 09:03:03 +00:00
if m == nil {
return
}
2018-03-30 17:56:59 +00:00
s.Lock()
defer s.Unlock()
2018-04-03 09:40:21 +00:00
if s.StatManager != nil {
2018-05-31 09:55:11 +00:00
s.StatManager.Close() // nolint: errcheck
2018-04-03 09:40:21 +00:00
}
2018-03-30 17:56:59 +00:00
s.StatManager = m
}