feat(gallery): display job status also during navigation (#2151)

* feat(gallery): keep showing progress also when refreshing

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* fix(intel-gpu): better defaults

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* feat: make it thread-safe

Signed-off-by: mudler <mudler@localai.io>

---------

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
Signed-off-by: mudler <mudler@localai.io>
This commit is contained in:
Ettore Di Giacinto 2024-04-27 09:08:33 +02:00 committed by GitHub
parent 030d555995
commit fb2a05ff43
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 164 additions and 9 deletions

77
pkg/xsync/map.go Normal file
View file

@ -0,0 +1,77 @@
package xsync
import (
"sync"
)
type SyncedMap[K comparable, V any] struct {
mu sync.RWMutex
m map[K]V
}
func NewSyncedMap[K comparable, V any]() *SyncedMap[K, V] {
return &SyncedMap[K, V]{
m: make(map[K]V),
}
}
func (m *SyncedMap[K, V]) Get(key K) V {
m.mu.RLock()
defer m.mu.RUnlock()
return m.m[key]
}
func (m *SyncedMap[K, V]) Keys() []K {
m.mu.RLock()
defer m.mu.RUnlock()
keys := make([]K, 0, len(m.m))
for k := range m.m {
keys = append(keys, k)
}
return keys
}
func (m *SyncedMap[K, V]) Values() []V {
m.mu.RLock()
defer m.mu.RUnlock()
values := make([]V, 0, len(m.m))
for _, v := range m.m {
values = append(values, v)
}
return values
}
func (m *SyncedMap[K, V]) Len() int {
m.mu.RLock()
defer m.mu.RUnlock()
return len(m.m)
}
func (m *SyncedMap[K, V]) Iterate(f func(key K, value V) bool) {
m.mu.RLock()
defer m.mu.RUnlock()
for k, v := range m.m {
if !f(k, v) {
break
}
}
}
func (m *SyncedMap[K, V]) Set(key K, value V) {
m.mu.Lock()
m.m[key] = value
m.mu.Unlock()
}
func (m *SyncedMap[K, V]) Delete(key K) {
m.mu.Lock()
delete(m.m, key)
m.mu.Unlock()
}
func (m *SyncedMap[K, V]) Exists(key K) bool {
m.mu.RLock()
defer m.mu.RUnlock()
_, ok := m.m[key]
return ok
}

26
pkg/xsync/map_test.go Normal file
View file

@ -0,0 +1,26 @@
package xsync_test
import (
. "github.com/go-skynet/LocalAI/pkg/xsync"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)
var _ = Describe("SyncMap", func() {
Context("Syncmap", func() {
It("sets and gets", func() {
m := NewSyncedMap[string, string]()
m.Set("foo", "bar")
Expect(m.Get("foo")).To(Equal("bar"))
})
It("deletes", func() {
m := NewSyncedMap[string, string]()
m.Set("foo", "bar")
m.Delete("foo")
Expect(m.Get("foo")).To(Equal(""))
Expect(m.Exists("foo")).To(Equal(false))
})
})
})

View file

@ -0,0 +1,13 @@
package xsync_test
import (
"testing"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)
func TestSync(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "LocalAI sync test")
}