Pārlūkot izejas kodu

SVI Добавление поткобезопасного словаря топиков

SVI 2 gadi atpakaļ
vecāks
revīzija
2720b2d03d
2 mainītis faili ar 122 papildinājumiem un 0 dzēšanām
  1. 64 0
      internal/dict_topic/dict_topic.go
  2. 58 0
      internal/dict_topic/topic/topic.go

+ 64 - 0
internal/dict_topic/dict_topic.go

@@ -0,0 +1,64 @@
+// package dict_topic -- потокобезопасный словарь топиков
+package dict_topic
+
+import (
+	"log"
+	"sync"
+
+	"p78git.ddns.net/svi/gobus/internal/dict_topic/topic"
+	"p78git.ddns.net/svi/gobus/pkg/alias"
+	"p78git.ddns.net/svi/gobus/pkg/types"
+)
+
+// DictTopic -- потокобезопасный словарь топиков
+type DictTopic struct {
+	dict  map[alias.TopicName]types.ITopic
+	block sync.RWMutex
+}
+
+// NewDictTopic -- возвращает новый потокобезопасный словарь топиков
+func NewDictTopic() (*DictTopic, error) {
+	sf := &DictTopic{
+		dict: make(map[alias.TopicName]types.ITopic),
+	}
+	_ = types.IDictTopic(sf)
+	return sf, nil
+}
+
+// Add -- добавляет новый топик
+func (sf *DictTopic) Add(name alias.TopicName) {
+	sf.block.Lock()
+	defer sf.block.Unlock()
+	topic, err := topic.NewTopic(name)
+	if err != nil {
+		log.Printf("DictTopic.Add(): in create ITopic, err=\n\t%v\n", err)
+		return
+	}
+	sf.dict[name] = topic
+}
+
+// Get -- возвращае ттопик по имени
+func (sf *DictTopic) Get(name alias.TopicName) types.ITopic {
+	sf.block.RLock()
+	defer sf.block.RUnlock()
+	topic := sf.dict[name]
+	return topic
+}
+
+// Len -- возвращает число всех топиков
+func (sf *DictTopic) Len() int {
+	sf.block.RLock()
+	defer sf.block.RUnlock()
+	return len(sf.dict)
+}
+
+// Size -- возвращает размер всех тпоиков
+func (sf *DictTopic) Size() int {
+	sf.block.RLock()
+	defer sf.block.RUnlock()
+	res := 0
+	for _, topic := range sf.dict {
+		res += topic.Size()
+	}
+	return res
+}

+ 58 - 0
internal/dict_topic/topic/topic.go

@@ -0,0 +1,58 @@
+// 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)
+}