mirror of
https://github.com/mainflux/mainflux.git
synced 2025-05-06 19:29:15 +08:00

* Switch CoAP lib Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Revert removed adapter code Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * WIP CoAP refactor Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Add auth key Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Fix observers map Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Fix reading message body Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Fix subtopic parsing Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Fix error handling Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Fix multi-protocol communication Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Separate client from observer Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Remove unused config Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Remove TCP option Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Inline error check Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Add logging client errors Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Replace RWMutex since we're not using RLock Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Inline error handling Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com> * Inline error handling Signed-off-by: dusanb94 <dusan.borovcanin@mainflux.com>
36 lines
641 B
Go
36 lines
641 B
Go
package sync
|
|
|
|
import (
|
|
"sync"
|
|
"sync/atomic"
|
|
)
|
|
|
|
// Once performs exactly one action.
|
|
// See sync.Once for more details.
|
|
type Once struct {
|
|
m sync.Mutex
|
|
done uint32
|
|
}
|
|
|
|
// Done returns true after Try executes succesfully.
|
|
func (o *Once) Done() bool {
|
|
return atomic.LoadUint32(&o.done) == 1
|
|
}
|
|
|
|
// Try executes the function f exactly once for this instance of Once.
|
|
// If the function f returns false, it enables further execution attempts.
|
|
func (o *Once) Try(f func() bool) {
|
|
if atomic.LoadUint32(&o.done) == 1 {
|
|
return
|
|
}
|
|
|
|
o.m.Lock()
|
|
defer o.m.Unlock()
|
|
if o.done == 1 {
|
|
return
|
|
}
|
|
if f() {
|
|
atomic.StoreUint32(&o.done, 1)
|
|
}
|
|
}
|