diff --git a/internal/caches/open_file_cache.go b/internal/caches/open_file_cache.go index 0d932d0..def7177 100644 --- a/internal/caches/open_file_cache.go +++ b/internal/caches/open_file_cache.go @@ -16,7 +16,7 @@ import ( type OpenFileCache struct { poolMap map[string]*OpenFilePool // file path => Pool - poolList *linkedlist.List + poolList *linkedlist.List[*OpenFilePool] watcher *fsnotify.Watcher locker sync.RWMutex @@ -33,7 +33,7 @@ func NewOpenFileCache(maxSize int) (*OpenFileCache, error) { var cache = &OpenFileCache{ maxSize: maxSize, poolMap: map[string]*OpenFilePool{}, - poolList: linkedlist.NewList(), + poolList: linkedlist.NewList[*OpenFilePool](), } watcher, err := fsnotify.NewWatcher() @@ -105,7 +105,7 @@ func (this *OpenFileCache) Put(filename string, file *OpenFile) { break } - var headPool = head.Value.(*OpenFilePool) + var headPool = head.Value headFile, consumed := headPool.Get() if consumed { this.count-- @@ -163,8 +163,8 @@ func (this *OpenFileCache) Debug() { goman.New(func() { for range ticker.C { logs.Println("==== " + types.String(this.count) + " ====") - this.poolList.Range(func(item *linkedlist.Item) (goNext bool) { - logs.Println(filepath.Base(item.Value.(*OpenFilePool).Filename()), item.Value.(*OpenFilePool).Len()) + this.poolList.Range(func(item *linkedlist.Item[*OpenFilePool]) (goNext bool) { + logs.Println(filepath.Base(item.Value.Filename()), item.Value.Len()) return true }) } diff --git a/internal/caches/open_file_cache_test.go b/internal/caches/open_file_cache_test.go index b13f2e4..85211a6 100644 --- a/internal/caches/open_file_cache_test.go +++ b/internal/caches/open_file_cache_test.go @@ -42,5 +42,7 @@ func TestNewOpenFileCache_CloseAll(t *testing.T) { cache.Get("d.txt") cache.CloseAll() - time.Sleep(6 * time.Second) + if testutils.IsSingleTesting() { + time.Sleep(6 * time.Second) + } } diff --git a/internal/caches/open_file_pool.go b/internal/caches/open_file_pool.go index 0d13816..7934f15 100644 --- a/internal/caches/open_file_pool.go +++ b/internal/caches/open_file_pool.go @@ -9,7 +9,7 @@ import ( type OpenFilePool struct { c chan *OpenFile - linkItem *linkedlist.Item + linkItem *linkedlist.Item[*OpenFilePool] filename string version int64 isClosed bool @@ -21,7 +21,7 @@ func NewOpenFilePool(filename string) *OpenFilePool { c: make(chan *OpenFile, 1024), version: fasttime.Now().UnixMilli(), } - pool.linkItem = linkedlist.NewItem(pool) + pool.linkItem = linkedlist.NewItem[*OpenFilePool](pool) return pool } diff --git a/internal/utils/linkedlist/item.go b/internal/utils/linkedlist/item.go index 8bf3023..d4bfe9e 100644 --- a/internal/utils/linkedlist/item.go +++ b/internal/utils/linkedlist/item.go @@ -2,13 +2,13 @@ package linkedlist -type Item struct { - prev *Item - next *Item +type Item[T any] struct { + prev *Item[T] + next *Item[T] - Value interface{} + Value T } -func NewItem(value interface{}) *Item { - return &Item{Value: value} +func NewItem[T any](value T) *Item[T] { + return &Item[T]{Value: value} } diff --git a/internal/utils/linkedlist/list.go b/internal/utils/linkedlist/list.go index 8faef43..3907427 100644 --- a/internal/utils/linkedlist/list.go +++ b/internal/utils/linkedlist/list.go @@ -2,25 +2,25 @@ package linkedlist -type List struct { - head *Item - end *Item +type List[T any] struct { + head *Item[T] + end *Item[T] count int } -func NewList() *List { - return &List{} +func NewList[T any]() *List[T] { + return &List[T]{} } -func (this *List) Head() *Item { +func (this *List[T]) Head() *Item[T] { return this.head } -func (this *List) End() *Item { +func (this *List[T]) End() *Item[T] { return this.end } -func (this *List) Push(item *Item) { +func (this *List[T]) Push(item *Item[T]) { if item == nil { return } @@ -36,7 +36,7 @@ func (this *List) Push(item *Item) { this.add(item) } -func (this *List) Remove(item *Item) { +func (this *List[T]) Remove(item *Item[T]) { if item == nil { return } @@ -58,11 +58,11 @@ func (this *List) Remove(item *Item) { this.count-- } -func (this *List) Len() int { +func (this *List[T]) Len() int { return this.count } -func (this *List) Range(f func(item *Item) (goNext bool)) { +func (this *List[T]) Range(f func(item *Item[T]) (goNext bool)) { for e := this.head; e != nil; e = e.next { goNext := f(e) if !goNext { @@ -71,12 +71,12 @@ func (this *List) Range(f func(item *Item) (goNext bool)) { } } -func (this *List) Reset() { +func (this *List[T]) Reset() { this.head = nil this.end = nil } -func (this *List) add(item *Item) { +func (this *List[T]) add(item *Item[T]) { if item == nil { return } diff --git a/internal/utils/linkedlist/list_test.go b/internal/utils/linkedlist/list_test.go index 55400fc..690a823 100644 --- a/internal/utils/linkedlist/list_test.go +++ b/internal/utils/linkedlist/list_test.go @@ -12,19 +12,21 @@ func TestNewList_Memory(t *testing.T) { var stat1 = &runtime.MemStats{} runtime.ReadMemStats(stat1) - var list = linkedlist.NewList() + var list = linkedlist.NewList[int]() for i := 0; i < 1_000_000; i++ { - var item = &linkedlist.Item{} + var item = &linkedlist.Item[int]{} list.Push(item) } + runtime.GC() + var stat2 = &runtime.MemStats{} runtime.ReadMemStats(stat2) - t.Log((stat2.HeapInuse-stat1.HeapInuse)/1024/1024, "MB") + t.Log((stat2.HeapInuse-stat1.HeapInuse)>>20, "MB") t.Log(list.Len()) var count = 0 - list.Range(func(item *linkedlist.Item) (goNext bool) { + list.Range(func(item *linkedlist.Item[int]) (goNext bool) { count++ return true }) @@ -32,7 +34,7 @@ func TestNewList_Memory(t *testing.T) { } func TestList_Push(t *testing.T) { - var list = linkedlist.NewList() + var list = linkedlist.NewList[int]() list.Push(linkedlist.NewItem(1)) list.Push(linkedlist.NewItem(2)) @@ -41,42 +43,43 @@ func TestList_Push(t *testing.T) { var item4 = linkedlist.NewItem(4) list.Push(item4) - list.Range(func(item *linkedlist.Item) (goNext bool) { + list.Range(func(item *linkedlist.Item[int]) (goNext bool) { t.Log(item.Value) return true }) - t.Log("=== after push3 ===") + t.Log("=== after push 3 ===") list.Push(item3) - list.Range(func(item *linkedlist.Item) (goNext bool) { + list.Range(func(item *linkedlist.Item[int]) (goNext bool) { t.Log(item.Value) return true }) - t.Log("=== after push4 ===") + t.Log("=== after push 4 ===") list.Push(item4) list.Push(item3) list.Push(item3) list.Push(item3) list.Push(item4) list.Push(item4) - list.Range(func(item *linkedlist.Item) (goNext bool) { + list.Range(func(item *linkedlist.Item[int]) (goNext bool) { t.Log(item.Value) return true }) - t.Log("=== after remove ===") + t.Log("=== after remove 3 ===") list.Remove(item3) - list.Range(func(item *linkedlist.Item) (goNext bool) { + list.Range(func(item *linkedlist.Item[int]) (goNext bool) { t.Log(item.Value) return true }) } func BenchmarkList_Add(b *testing.B) { - var list = linkedlist.NewList() + var list = linkedlist.NewList[int]() for i := 0; i < b.N; i++ { - var item = &linkedlist.Item{} + var item = &linkedlist.Item[int]{} list.Push(item) } } +