// Copyright 2022 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

package poller

import "sync/atomic"

// Metric interface
type Metric interface {
	IncBusyWorker() int64
	DecBusyWorker() int64
	BusyWorkers() int64
}

var _ Metric = (*metric)(nil)

type metric struct {
	busyWorkers int64
}

// NewMetric for default metric structure
func NewMetric() Metric {
	return &metric{}
}

func (m *metric) IncBusyWorker() int64 {
	return atomic.AddInt64(&m.busyWorkers, 1)
}

func (m *metric) DecBusyWorker() int64 {
	return atomic.AddInt64(&m.busyWorkers, -1)
}

func (m *metric) BusyWorkers() int64 {
	return atomic.LoadInt64(&m.busyWorkers)
}