diff --git a/pkg/nazasync/once.go b/pkg/nazasync/once.go new file mode 100644 index 0000000..db8a442 --- /dev/null +++ b/pkg/nazasync/once.go @@ -0,0 +1,32 @@ +// Copyright 2022, Chef. All rights reserved. +// https://github.com/q191201771/naza +// +// Use of this source code is governed by a MIT-style license +// that can be found in the License file. +// +// Author: Chef (191201771@qq.com) + +package nazasync + +import ( + "sync" + "sync/atomic" +) + +type StdOnce struct { + core sync.Once +} + +func (o *StdOnce) Do(f func()) { + o.core.Do(f) +} + +type NonblockingOnce struct { + done uint32 +} + +func (o *NonblockingOnce) Do(f func()) { + if atomic.CompareAndSwapUint32(&o.done, 0, 1) { + f() + } +}