// package topic -- потокобезопасный топик шины данных package topic import ( "fmt" "sync" "p78git.ddns.net/svi/gobus/pkg/alias" "p78git.ddns.net/svi/gobus/pkg/types" ) // Topic -- потокобезопасный топик шины данных type Topic struct { name alias.TopicName srcNum int // Номер источника val []byte // Содержимое топика block sync.RWMutex } // Newtopic -- возвращает новый топик func NewTopic(name alias.TopicName) (*Topic, error) { if name == "" { return nil, fmt.Errorf("NewTopic(): name is empty") } sf := &Topic{ name: name, val: []byte{}, } _ = types.ITopic(sf) return sf, nil } // Name -- возвращает имя топика func (sf *Topic) Name() alias.TopicName { return sf.name } // Get -- возвращает содержимое топика func (sf *Topic) Get() []byte { sf.block.RLock() defer sf.block.RUnlock() return sf.val } // Set -- устанавливает значение топика func (sf *Topic) Set(srcNum int, val []byte) { sf.block.Lock() defer sf.block.Unlock() sf.srcNum = srcNum sf.val = val } // Size -- возвращает размер топика func (sf *Topic) Size() int { sf.block.RLock() defer sf.block.RUnlock() return len(sf.name) + len(sf.val) }