mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2026-01-12 10:09:00 +08:00
Some checks are pending
Test / test (1.20, macos-15-intel) (push) Waiting to run
Test / test (1.20, macos-latest) (push) Waiting to run
Test / test (1.20, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.20, ubuntu-latest) (push) Waiting to run
Test / test (1.20, windows-latest) (push) Waiting to run
Test / test (1.21, macos-15-intel) (push) Waiting to run
Test / test (1.21, macos-latest) (push) Waiting to run
Test / test (1.21, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.21, ubuntu-latest) (push) Waiting to run
Test / test (1.21, windows-latest) (push) Waiting to run
Test / test (1.22, macos-15-intel) (push) Waiting to run
Test / test (1.22, macos-latest) (push) Waiting to run
Test / test (1.22, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.22, ubuntu-latest) (push) Waiting to run
Test / test (1.22, windows-latest) (push) Waiting to run
Test / test (1.23, macos-15-intel) (push) Waiting to run
Test / test (1.23, macos-latest) (push) Waiting to run
Test / test (1.23, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.23, ubuntu-latest) (push) Waiting to run
Test / test (1.23, windows-latest) (push) Waiting to run
Test / test (1.24, macos-15-intel) (push) Waiting to run
Test / test (1.24, macos-latest) (push) Waiting to run
Test / test (1.24, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.24, ubuntu-latest) (push) Waiting to run
Test / test (1.24, windows-latest) (push) Waiting to run
Test / test (1.25, macos-15-intel) (push) Waiting to run
Test / test (1.25, macos-latest) (push) Waiting to run
Test / test (1.25, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.25, ubuntu-latest) (push) Waiting to run
Test / test (1.25, windows-latest) (push) Waiting to run
Test / test (1.26.0-rc.1, macos-15-intel) (push) Waiting to run
Test / test (1.26.0-rc.1, macos-latest) (push) Waiting to run
Test / test (1.26.0-rc.1, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.26.0-rc.1, ubuntu-latest) (push) Waiting to run
Test / test (1.26.0-rc.1, windows-latest) (push) Waiting to run
Trigger CMFA Update / trigger-CMFA-update (push) Waiting to run
111 lines
2.2 KiB
Go
111 lines
2.2 KiB
Go
package wrapper
|
|
|
|
import (
|
|
"sync/atomic"
|
|
"time"
|
|
|
|
C "github.com/metacubex/mihomo/constant"
|
|
)
|
|
|
|
type RuleWrapper struct {
|
|
C.Rule
|
|
disabled atomic.Bool
|
|
hitCount atomic.Uint64
|
|
hitAt atomicTime
|
|
missCount atomic.Uint64
|
|
missAt atomicTime
|
|
}
|
|
|
|
func (r *RuleWrapper) IsDisabled() bool {
|
|
return r.disabled.Load()
|
|
}
|
|
|
|
func (r *RuleWrapper) SetDisabled(v bool) {
|
|
r.disabled.Store(v)
|
|
}
|
|
|
|
func (r *RuleWrapper) HitCount() uint64 {
|
|
return r.hitCount.Load()
|
|
}
|
|
|
|
func (r *RuleWrapper) HitAt() time.Time {
|
|
return r.hitAt.Load()
|
|
}
|
|
|
|
func (r *RuleWrapper) MissCount() uint64 {
|
|
return r.missCount.Load()
|
|
}
|
|
|
|
func (r *RuleWrapper) MissAt() time.Time {
|
|
return r.missAt.Load()
|
|
}
|
|
|
|
func (r *RuleWrapper) Unwrap() C.Rule {
|
|
return r.Rule
|
|
}
|
|
|
|
func (r *RuleWrapper) Hit() {
|
|
r.hitCount.Add(1)
|
|
r.hitAt.Store(time.Now())
|
|
}
|
|
|
|
func (r *RuleWrapper) Miss() {
|
|
r.missCount.Add(1)
|
|
r.missAt.Store(time.Now())
|
|
}
|
|
|
|
func (r *RuleWrapper) Match(metadata *C.Metadata, helper C.RuleMatchHelper) (bool, string) {
|
|
if r.IsDisabled() {
|
|
return false, ""
|
|
}
|
|
ok, adapter := r.Rule.Match(metadata, helper)
|
|
if ok {
|
|
r.Hit()
|
|
} else {
|
|
r.Miss()
|
|
}
|
|
return ok, adapter
|
|
}
|
|
|
|
func NewRuleWrapper(rule C.Rule) C.RuleWrapper {
|
|
return &RuleWrapper{Rule: rule}
|
|
}
|
|
|
|
// atomicTime is a wrapper of [atomic.Int64] to provide atomic time storage.
|
|
// it only saves unix nanosecond export from time.Time.
|
|
// unlike atomic.TypedValue[time.Time] always escapes a new time.Time to heap when storing.
|
|
// that will lead to higher GC pressure during high frequency writes.
|
|
// be careful, it discards monotime so should not be used for internal time comparisons.
|
|
type atomicTime struct {
|
|
i atomic.Int64
|
|
}
|
|
|
|
func (t *atomicTime) Load() time.Time {
|
|
return time.Unix(0, t.i.Load())
|
|
}
|
|
|
|
func (t *atomicTime) Store(v time.Time) {
|
|
t.i.Store(v.UnixNano())
|
|
}
|
|
|
|
func (t *atomicTime) Swap(v time.Time) time.Time {
|
|
return time.Unix(0, t.i.Swap(v.UnixNano()))
|
|
}
|
|
|
|
func (t *atomicTime) CompareAndSwap(old, new time.Time) bool {
|
|
return t.i.CompareAndSwap(old.UnixNano(), new.UnixNano())
|
|
}
|
|
|
|
func (t *atomicTime) MarshalText() ([]byte, error) {
|
|
return t.Load().MarshalText()
|
|
}
|
|
|
|
func (t *atomicTime) UnmarshalText(text []byte) error {
|
|
var v time.Time
|
|
if err := v.UnmarshalText(text); err != nil {
|
|
return err
|
|
}
|
|
t.Store(v)
|
|
return nil
|
|
}
|