| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- // 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)
- }
|