]> 127.0.0.1 Git - part/.git/commitdiff
tmplK或存在严重问题,使用funcCtrl替代
authorqydysky <qydysky@foxmail.com>
Mon, 22 Feb 2021 17:23:17 +0000 (01:23 +0800)
committerqydysky <qydysky@foxmail.com>
Mon, 22 Feb 2021 17:23:17 +0000 (01:23 +0800)
funcCtrl/FuncCtrl.go [new file with mode: 0644]
funcCtrl/FuncCtrl_test.go [new file with mode: 0644]

diff --git a/funcCtrl/FuncCtrl.go b/funcCtrl/FuncCtrl.go
new file mode 100644 (file)
index 0000000..be2563f
--- /dev/null
@@ -0,0 +1,53 @@
+package part
+
+import (
+       "sync"
+       "unsafe"
+       "sync/atomic"
+       "container/list"
+       idpool "github.com/qydysky/part/idpool"
+)
+
+type SkipFunc struct{//新的跳过
+       c unsafe.Pointer
+}
+
+func (t *SkipFunc) NeedSkip() (result bool) {
+       return !atomic.CompareAndSwapPointer(&t.c, nil, unsafe.Pointer(&struct{}{}))
+}
+
+func (t *SkipFunc) UnSet() {
+       atomic.CompareAndSwapPointer(&t.c, atomic.LoadPointer(&t.c), nil)
+}
+
+type FlashFunc struct{//新的替换旧的
+       b *list.List
+       pool *idpool.Idpool
+}
+
+func (t *FlashFunc) Flash() (current uintptr) {
+       if t.pool == nil {t.pool = idpool.New()}
+       if t.b == nil {t.b = list.New()}
+
+       e := t.pool.Get()
+       current = e.Id
+       t.b.PushFront(e)
+       
+       return
+}
+
+func (t *FlashFunc) NeedExit(current uintptr) (bool) {
+       return current != t.b.Front().Value.(*idpool.Id).Id
+}
+
+type BlockFunc struct{//新的等待旧的
+       sync.Mutex
+}
+
+func (t *BlockFunc) Block() {
+       t.Lock()
+}
+
+func (t *BlockFunc) UnBlock() {
+       t.Unlock()
+}
\ No newline at end of file
diff --git a/funcCtrl/FuncCtrl_test.go b/funcCtrl/FuncCtrl_test.go
new file mode 100644 (file)
index 0000000..801cdae
--- /dev/null
@@ -0,0 +1,51 @@
+package part
+
+import (
+       "testing"
+       "time"
+)
+
+func Test_SkipFunc(t *testing.T) {
+       var b SkipFunc
+       var a = func(i int){
+               if b.NeedSkip() {return}
+               defer b.UnSet()
+               t.Log(i,`.`)
+               time.Sleep(time.Second)
+               t.Log(i,`..`)
+       }
+       t.Log(`just show 1 or 2 twice`)
+       go a(1)
+       go a(2)
+       time.Sleep(5*time.Second)
+}
+
+func Test_FlashFunc(t *testing.T) {
+       var b FlashFunc
+       var a = func(i int){
+               id := b.Flash()
+               t.Log(i,`.`)
+               time.Sleep(time.Second)
+               if b.NeedExit(id) {return}
+               t.Log(i,`.`)
+       }
+       t.Log(`show 1 or 2, then show the other twice`)
+       go a(1)
+       go a(2)
+       time.Sleep(5*time.Second)
+}
+
+func Test_BlockFunc(t *testing.T) {
+       var b BlockFunc
+       var a = func(i int){
+               b.Block()
+               defer b.UnBlock()
+               t.Log(i,`.`)
+               time.Sleep(time.Second)
+               t.Log(i,`.`)
+       }
+       t.Log(`show 1 and 2 twice`)
+       go a(1)
+       go a(2)
+       time.Sleep(5*time.Second)
+}
\ No newline at end of file