59 lines
1.3 KiB
Go
59 lines
1.3 KiB
Go
![]() |
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
|
|||
|
}
|