telegraph.go 1.3 KB
Newer Older
Y
Your Name 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
package telegraph

import (
	"context"
	"sync"
)

//Telegraph telegraph
type Telegraph struct {
	value   interface{}
	version string
	locker  sync.RWMutex
	c       chan struct{}
}

//NewTelegraph 创建telegraph
func NewTelegraph(version string, value interface{}) *Telegraph {
	return &Telegraph{
		value:   value,
		version: version,
		locker:  sync.RWMutex{},
		c:       make(chan struct{}),
	}
}

//Set set
func (t *Telegraph) Set(version string, value interface{}) {

	t.locker.Lock()
	close(t.c)
	t.version = version
	t.value = value

	t.c = make(chan struct{})

	t.locker.Unlock()

}

func (t *Telegraph) get() (string, <-chan struct{}, interface{}) {

	t.locker.RLock()

	version, c, value := t.version, t.c, t.value
	t.locker.RUnlock()

	return version, c, value
}

//Get get
func (t *Telegraph) Get(version string) interface{} {
	return t.GetWidthContext(context.Background(), version)
}

//Close close
func (t *Telegraph) Close() {
	t.locker.Lock()
	close(t.c)
	t.version = ""
	t.locker.Unlock()
}

//GetWidthContext 获取上下文
func (t *Telegraph) GetWidthContext(ctx context.Context, version string) interface{} {
	v, c, value := t.get()
	if v == "" {
		// closed
		return nil
	}
	if version != v {
		return value
	}

	select {
	case <-c:
		return t.GetWidthContext(ctx, version)
	case <-ctx.Done():
		return nil
	}

}