From 3978d820a8e67ac37a76eab9dae294dd4ecce2db Mon Sep 17 00:00:00 2001 From: Sydonian <794346190@qq.com> Date: Tue, 2 Jul 2024 17:36:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/sync2/event.go | 48 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 utils/sync2/event.go diff --git a/utils/sync2/event.go b/utils/sync2/event.go new file mode 100644 index 0000000..157c066 --- /dev/null +++ b/utils/sync2/event.go @@ -0,0 +1,48 @@ +package sync2 + +import ( + "context" + "errors" + "sync" +) + +var ErrEventClosed = errors.New("event is closed") +var ErrContextCanceled = errors.New("context canceled") + +type Event struct { + ch chan any + closeOnce sync.Once +} + +func NewEvent() Event { + return Event{ + ch: make(chan any, 1), + } +} + +func (e *Event) Set() { + select { + case e.ch <- nil: + default: + } +} + +func (e *Event) Wait(ctx context.Context) error { + select { + case _, ok := <-e.ch: + if ok { + return nil + } + + return ErrEventClosed + + case <-ctx.Done(): + return ErrContextCanceled + } +} + +func (e *Event) Close() { + e.closeOnce.Do(func() { + close(e.ch) + }) +}