summaryrefslogtreecommitdiffstats
path: root/cid
diff options
context:
space:
mode:
authorJakob Borg <jakob@nym.se>2014-03-28 14:36:57 +0100
committerJakob Borg <jakob@nym.se>2014-03-29 13:47:21 +0100
commitf87b1520e892c22da184f16e16fa95684b711e8d (patch)
tree93b179582683d852f0781cd192e9f7ce8f543070 /cid
parent3700eb1e61166eb9f95d1a2a6c7d606be5cbb614 (diff)
The Great Rewrite (fixes #36, #61, #94, #101)
Rewrite of the file model and pulling mechanism. Needs lots of cleanup and bugfixes, now...
Diffstat (limited to 'cid')
-rw-r--r--cid/cid.go47
-rw-r--r--cid/cid_test.go27
2 files changed, 68 insertions, 6 deletions
diff --git a/cid/cid.go b/cid/cid.go
index 3a3727dc5f..8295a81ed1 100644
--- a/cid/cid.go
+++ b/cid/cid.go
@@ -1,18 +1,30 @@
// Package cid provides a manager for mappings between node ID:s and connection ID:s.
package cid
+import "sync"
+
type Map struct {
- toCid map[string]int
+ sync.Mutex
+ toCid map[string]uint
toName []string
}
+var (
+ LocalName = "<local>"
+ LocalID uint = 0
+)
+
func NewMap() *Map {
return &Map{
- toCid: make(map[string]int),
+ toCid: map[string]uint{"<local>": 0},
+ toName: []string{"<local>"},
}
}
-func (m *Map) Get(name string) int {
+func (m *Map) Get(name string) uint {
+ m.Lock()
+ defer m.Unlock()
+
cid, ok := m.toCid[name]
if ok {
return cid
@@ -22,22 +34,45 @@ func (m *Map) Get(name string) int {
for i, n := range m.toName {
if n == "" {
m.toName[i] = name
- m.toCid[name] = i
- return i
+ m.toCid[name] = uint(i)
+ return uint(i)
}
}
// Add it to the end since we didn't find a free slot
m.toName = append(m.toName, name)
- cid = len(m.toName) - 1
+ cid = uint(len(m.toName) - 1)
m.toCid[name] = cid
return cid
}
+func (m *Map) Name(cid uint) string {
+ m.Lock()
+ defer m.Unlock()
+
+ return m.toName[cid]
+}
+
+func (m *Map) Names() []string {
+ m.Lock()
+
+ var names []string
+ for _, name := range m.toName {
+ if name != "" {
+ names = append(names, name)
+ }
+ }
+
+ m.Unlock()
+ return names
+}
+
func (m *Map) Clear(name string) {
+ m.Lock()
cid, ok := m.toCid[name]
if ok {
m.toName[cid] = ""
delete(m.toCid, name)
}
+ m.Unlock()
}
diff --git a/cid/cid_test.go b/cid/cid_test.go
new file mode 100644
index 0000000000..37f64716d5
--- /dev/null
+++ b/cid/cid_test.go
@@ -0,0 +1,27 @@
+package cid
+
+import "testing"
+
+func TestGet(t *testing.T) {
+ m := NewMap()
+
+ if i := m.Get("foo"); i != 1 {
+ t.Errorf("Unexpected id %d != 1", i)
+ }
+ if i := m.Get("bar"); i != 2 {
+ t.Errorf("Unexpected id %d != 2", i)
+ }
+ if i := m.Get("foo"); i != 1 {
+ t.Errorf("Unexpected id %d != 1", i)
+ }
+ if i := m.Get("bar"); i != 2 {
+ t.Errorf("Unexpected id %d != 2", i)
+ }
+
+ if LocalID != 0 {
+ t.Error("LocalID should be 0")
+ }
+ if i := m.Get(LocalName); i != LocalID {
+ t.Errorf("Unexpected id %d != %c", i, LocalID)
+ }
+}