]> 127.0.0.1 Git - part/.git/commitdiff
1 v0.28.20240125185017
authorqydysky <qydysky@foxmail.com>
Thu, 25 Jan 2024 18:43:00 +0000 (02:43 +0800)
committerqydysky <qydysky@foxmail.com>
Thu, 25 Jan 2024 18:43:00 +0000 (02:43 +0800)
pool/Pool.go
pool/Pool_test.go

index a73723b352e5a9aed976d14bd62393419b5472c1..4b9ed1a4fef6a28d186a699388f9b07435429755 100644 (file)
@@ -7,10 +7,7 @@ import (
 
 type Buf[T any] struct {
        maxsize     int
-       newF        func() *T
-       inUse       func(*T) bool
-       reuseF      func(*T) *T
-       poolF       func(*T) *T
+       pf          PoolFunc[T]
        mbuf        map[*T]bool
        getPerSec   float64
        periodCount float64
@@ -18,6 +15,17 @@ type Buf[T any] struct {
        l           sync.RWMutex
 }
 
+type PoolFunc[T any] struct {
+       // func() *T 新值
+       New func() *T
+       // func(*T) bool 是否在使用
+       InUse func(*T) bool
+       // func(*T) *T 重用(出池)前处理
+       Reuse func(*T) *T
+       // func(*T) *T 入池前处理
+       Pool func(*T) *T
+}
+
 // 创建池
 //
 // NewF: func() *T 新值
@@ -29,12 +37,9 @@ type Buf[T any] struct {
 // PoolF func(*T) *T 入池前处理
 //
 // maxsize int 池最大数量
-func New[T any](NewF func() *T, InUse func(*T) bool, ReuseF func(*T) *T, PoolF func(*T) *T, maxsize int) *Buf[T] {
+func New[T any](poolFunc PoolFunc[T], maxsize int) *Buf[T] {
        t := new(Buf[T])
-       t.newF = NewF
-       t.inUse = InUse
-       t.reuseF = ReuseF
-       t.poolF = PoolF
+       t.pf = poolFunc
        t.maxsize = maxsize
        t.mbuf = make(map[*T]bool)
        t.periodTime = time.Now()
@@ -68,7 +73,7 @@ func (t *Buf[T]) State() BufState {
                } else {
                        nopooled++
                }
-               if t.inUse(k) {
+               if t.pf.InUse(k) {
                        inuse++
                } else {
                        nouse++
@@ -95,13 +100,13 @@ func (t *Buf[T]) Get() *T {
        }
 
        for k, v := range t.mbuf {
-               if v && !t.inUse(k) {
+               if v && !t.pf.InUse(k) {
                        t.mbuf[k] = false
-                       return t.reuseF(k)
+                       return t.pf.Reuse(k)
                }
        }
 
-       return t.newF()
+       return t.pf.New()
 }
 
 func (t *Buf[T]) Put(item ...*T) {
@@ -114,10 +119,10 @@ func (t *Buf[T]) Put(item ...*T) {
 
        for i := 0; i < len(item); i++ {
                if _, ok := t.mbuf[item[i]]; ok {
-                       t.poolF(item[i])
+                       t.pf.Pool(item[i])
                        t.mbuf[item[i]] = true
                } else if t.maxsize > len(t.mbuf) {
-                       t.poolF(item[i])
+                       t.pf.Pool(item[i])
                        t.mbuf[item[i]] = true
                }
        }
index 5ffe16c52c893aa44ea57e4219541123d30da2e2..cd01fc61e2929694065e9e11bf474d5cb604011d 100644 (file)
@@ -32,7 +32,7 @@ func Test1(t *testing.T) {
                return t
        }
 
-       var b = New(newf, validf, reusef, poolf, 10)
+       var b = New(PoolFunc[a]{newf, validf, reusef, poolf}, 10)
 
        for i := 0; i < 10; i++ {
                b.Get()
@@ -44,25 +44,20 @@ func Test1(t *testing.T) {
 }
 
 func TestXxx(t *testing.T) {
-       var newf = func() *a {
-               return &a{v: true}
-       }
-
-       var validf = func(t *a) bool {
-               return t.v
-       }
-
-       var reusef = func(t *a) *a {
-               t.d = t.d[:0]
-               t.v = true
-               return t
-       }
-
-       var poolf = func(t *a) *a {
-               return t
-       }
-
-       var b = New(newf, validf, reusef, poolf, 10)
+       var b = New(PoolFunc[a]{
+               New: func() *a {
+                       return &a{v: true}
+               },
+               InUse: func(t *a) bool {
+                       return t.v
+               },
+               Reuse: func(t *a) *a {
+                       t.d = t.d[:0]
+                       t.v = true
+                       return t
+               }, Pool: func(t *a) *a {
+                       return t
+               }}, 10)
 
        var c1 = b.Get()
        var c1p = uintptr(unsafe.Pointer(c1))
@@ -72,7 +67,13 @@ func TestXxx(t *testing.T) {
        var c2p = uintptr(unsafe.Pointer(c2))
        c2.d = append(c2.d, []byte("2")...)
 
-       if c1p == c2p || bytes.Equal(c1.d, c2.d) || b.State().Inuse != 0 || b.State().Sum != 0 {
+       if c1p == c2p {
+               t.Fatal()
+       } else if bytes.Equal(c1.d, c2.d) {
+               t.Fatal()
+       } else if b.State().Inuse != 0 {
+               t.Fatal()
+       } else if b.State().Sum != 0 {
                t.Fatal()
        }