1
0
mirror of https://github.com/mainflux/mainflux.git synced 2025-05-04 22:17:59 +08:00
Dušan Borovčanin f10e49e6b5
MF-928 - Change CoAP lib (#1233)
* 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>
2020-09-22 11:59:10 +02:00

60 lines
1.2 KiB
Go

package sync
import (
"context"
"sync/atomic"
)
type ReleaseDataFunc = func(ctx context.Context, data interface{}) error
type RefCounter struct {
count int64
data interface{}
releaseDataFunc ReleaseDataFunc
}
// Data returns data
func (r *RefCounter) Data() interface{} {
v := atomic.LoadInt64(&r.count)
if v <= 0 {
panic("using RefCounter after data released")
}
return r.data
}
// Acquire increments counter
func (r *RefCounter) Acquire() {
v := atomic.AddInt64(&r.count, 1)
if v <= 1 {
panic("using RefCounter after data released")
}
}
// Count returns current counter value.
func (r *RefCounter) Count() int64 {
return atomic.LoadInt64(&r.count)
}
// Release decrements counter, when counter reach 0, releaseDataFunc will be called
func (r *RefCounter) Release(ctx context.Context) error {
v := atomic.AddInt64(&r.count, -1)
if v < 0 {
panic("using RefCounter after data released")
}
if v == 0 {
if r.releaseDataFunc != nil {
return r.releaseDataFunc(ctx, r.data)
}
}
return nil
}
// NewRefCounter creates RefCounter
func NewRefCounter(data interface{}, releaseDataFunc ReleaseDataFunc) *RefCounter {
return &RefCounter{
data: data,
count: 1,
releaseDataFunc: releaseDataFunc,
}
}