feedback/internal/controller/feedback_queue.go

59 lines
1.3 KiB
Go
Raw Normal View History

2023-04-20 02:03:21 +00:00
package controller
import (
"container/list"
"penahub.gitlab.yandexcloud.net/backend/templategen_feedback/internal/models"
"sync"
)
const QueueSize = 100 // Размер очереди
// FeedbackQueue - FIFO очередь с размером QueueSize
type FeedbackQueue struct {
tasks *list.List
m sync.Mutex
}
// NewFeedbackQueue - создать новую очередь
func NewFeedbackQueue() *FeedbackQueue {
return &FeedbackQueue{tasks: list.New(), m: sync.Mutex{}}
}
// Enqueue - добавить элемент в очередь. Возвращает true если очередь не переполнена и false в ином случае
func (q *FeedbackQueue) Enqueue(record *models.Feedback) bool {
q.m.Lock()
if q.tasks.Len() >= QueueSize {
q.m.Unlock()
return false
}
q.tasks.PushBack(record)
q.m.Unlock()
return true
}
// Dequeue - взять элемент из очереди
func (q *FeedbackQueue) Dequeue() *models.Feedback {
q.m.Lock()
value := q.tasks.Front()
if value == nil {
q.m.Unlock()
return nil
}
q.tasks.Remove(value)
q.m.Unlock()
return value.Value.(*models.Feedback)
}
// Len - получить длину очереди
func (q *FeedbackQueue) Len() int {
q.m.Lock()
l := q.tasks.Len()
q.m.Unlock()
return l
}