From: qydysky Date: Sat, 8 Apr 2023 13:09:17 +0000 (+0800) Subject: update X-Git-Tag: v0.24.6~1 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=97c818208e27987483e779e89e9b2cb5d17dd2aa;p=part%2F.git update --- diff --git a/funcCtrl/FuncCtrl.go b/funcCtrl/FuncCtrl.go index 26aca31..7648c45 100644 --- a/funcCtrl/FuncCtrl.go +++ b/funcCtrl/FuncCtrl.go @@ -1,6 +1,7 @@ package part import ( + "context" "runtime" "sync" "sync/atomic" @@ -23,11 +24,16 @@ func (t *SkipFunc) UnSet() { // 新的替换旧的 type FlashFunc struct { b atomic.Uintptr + c *context.CancelFunc } func (t *FlashFunc) Flash() (current uintptr) { current = uintptr(unsafe.Pointer(&struct{}{})) t.b.Store(current) + if t.c != nil { + (*t.c)() + t.c = nil + } return } @@ -37,6 +43,18 @@ func (t *FlashFunc) NeedExit(current uintptr) bool { return t.b.Load() != current } +func (t *FlashFunc) FlashWithContext() (current uintptr, c context.Context) { + current = uintptr(unsafe.Pointer(&struct{}{})) + t.b.Store(current) + if t.c != nil { + (*t.c)() + t.c = nil + } + c, cancle := context.WithCancel(context.Background()) + t.c = &cancle + return +} + // 新的等待旧的 type BlockFunc struct { sync.Mutex diff --git a/funcCtrl/FuncCtrl_test.go b/funcCtrl/FuncCtrl_test.go index 13de5b9..6d7a4f5 100644 --- a/funcCtrl/FuncCtrl_test.go +++ b/funcCtrl/FuncCtrl_test.go @@ -44,6 +44,23 @@ func Test_FlashFunc(t *testing.T) { } } +func Test_FlashFunc2(t *testing.T) { + var cc = make(chan int, 2) + var b FlashFunc + var a = func(i int) { + _, c := b.FlashWithContext() + <-c.Done() + cc <- i + } + go a(1) + go a(2) + go a(3) + time.Sleep(time.Second) + if len(cc) != 2 && <-cc != 1 && <-cc != 2 { + t.Fatal(len(cc)) + } +} + func Test_BlockFunc(t *testing.T) { var c = make(chan int, 2) var b BlockFunc