topic.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // package topic -- потокобезопасный топик шины данных
  2. package topic
  3. import (
  4. "fmt"
  5. "sync"
  6. "p78git.ddns.net/svi/gobus/pkg/alias"
  7. "p78git.ddns.net/svi/gobus/pkg/types"
  8. )
  9. // Topic -- потокобезопасный топик шины данных
  10. type Topic struct {
  11. name alias.TopicName
  12. srcNum int // Номер источника
  13. val []byte // Содержимое топика
  14. block sync.RWMutex
  15. }
  16. // Newtopic -- возвращает новый топик
  17. func NewTopic(name alias.TopicName) (*Topic, error) {
  18. if name == "" {
  19. return nil, fmt.Errorf("NewTopic(): name is empty")
  20. }
  21. sf := &Topic{
  22. name: name,
  23. val: []byte{},
  24. }
  25. _ = types.ITopic(sf)
  26. return sf, nil
  27. }
  28. // Name -- возвращает имя топика
  29. func (sf *Topic) Name() alias.TopicName {
  30. return sf.name
  31. }
  32. // Get -- возвращает содержимое топика
  33. func (sf *Topic) Get() []byte {
  34. sf.block.RLock()
  35. defer sf.block.RUnlock()
  36. return sf.val
  37. }
  38. // Set -- устанавливает значение топика
  39. func (sf *Topic) Set(srcNum int, val []byte) {
  40. sf.block.Lock()
  41. defer sf.block.Unlock()
  42. sf.srcNum = srcNum
  43. sf.val = val
  44. }
  45. // Size -- возвращает размер топика
  46. func (sf *Topic) Size() int {
  47. sf.block.RLock()
  48. defer sf.block.RUnlock()
  49. return len(sf.name) + len(sf.val)
  50. }