brunel/buildqueue/queue.go

123 lines
2.6 KiB
Go
Raw Normal View History

2024-07-29 23:40:26 +02:00
package buildqueue
import (
"brunel/domain"
"brunel/fastmap"
2024-07-30 00:38:23 +02:00
"sync"
2024-07-29 23:40:26 +02:00
"errors"
)
var queue = fastmap.New[string, domain.BuildQueueItem]()
2024-07-30 00:38:23 +02:00
var queueLock = sync.RWMutex{}
2024-07-29 23:40:26 +02:00
func Add(buildItem domain.BuildQueueItem) error {
2024-07-30 00:38:23 +02:00
queueLock.Lock()
defer queueLock.Unlock()
2024-07-29 23:40:26 +02:00
if _, ok := queue.Get(buildItem.Source.Name); ok {
return errors.New("package already in queue")
}
queue.Set(buildItem.Source.Name, buildItem)
return nil
}
func Get(name string) (domain.BuildQueueItem, bool) {
2024-07-30 00:38:23 +02:00
queueLock.RLock()
defer queueLock.RUnlock()
2024-07-29 23:40:26 +02:00
item, ok := queue.Get(name)
return item, ok
}
func Remove(name string) error {
2024-07-30 00:38:23 +02:00
queueLock.Lock()
defer queueLock.Unlock()
2024-07-29 23:40:26 +02:00
_, ok := queue.Get(name)
if !ok {
return errors.New("package not in queue")
}
queue.Delete(name)
return nil
}
func Update(buildItem domain.BuildQueueItem) error {
2024-07-30 00:38:23 +02:00
queueLock.Lock()
defer queueLock.Unlock()
2024-07-29 23:40:26 +02:00
item, ok := queue.Get(buildItem.Source.Name)
if !ok {
return errors.New("package not in queue")
}
if item.Status == domain.Building {
return errors.New("package is already building")
}
queue.Set(buildItem.Source.Name, buildItem)
return nil
}
2024-07-30 00:38:23 +02:00
func GetQueueCopy() *fastmap.Fastmap[string, domain.BuildQueueItem] {
queueLock.RLock()
defer queueLock.RUnlock()
returnQueue := fastmap.New[string, domain.BuildQueueItem]()
queue.Iter(func(k string, v domain.BuildQueueItem) bool {
returnQueue.Set(k, v)
return true
})
return returnQueue
}
func GetBuildingQueue() *fastmap.Fastmap[string, domain.BuildQueueItem] {
queueLock.RLock()
defer queueLock.RUnlock()
returnQueue := fastmap.New[string, domain.BuildQueueItem]()
queue.Iter(func(k string, v domain.BuildQueueItem) bool {
if v.Status == domain.Building {
returnQueue.Set(k, v)
}
return true
})
return returnQueue
2024-07-29 23:40:26 +02:00
}
func GetCounts() domain.BuildQueueCount {
2024-07-30 00:38:23 +02:00
queueLock.RLock()
defer queueLock.RUnlock()
2024-07-29 23:40:26 +02:00
count := domain.BuildQueueCount{
Queued: 0,
Building: 0,
}
queue.Iter(func(k string, v domain.BuildQueueItem) bool {
if v.Status == domain.Queued {
count.Queued++
} else if v.Status == domain.Building {
count.Building++
}
return true
})
return count
}
func ProcessNext() error {
2024-07-30 00:38:23 +02:00
queueLock.RLock()
2024-07-29 23:40:26 +02:00
var item *domain.BuildQueueItem
queue.Iter(func(k string, v domain.BuildQueueItem) bool {
if v.Status == domain.Queued {
item = &v
return false
}
return true
})
if item == nil {
return errors.New("no packages in queue")
}
2024-07-30 00:38:23 +02:00
queueLock.RUnlock()
2024-07-29 23:40:26 +02:00
err := UpdateBuildFile(*item)
if err != nil {
return err
}
2024-07-30 00:38:23 +02:00
queueLock.Lock()
defer queueLock.Unlock()
2024-07-29 23:40:26 +02:00
item.Status = domain.Building
err = Update(*item)
return err
}