Forráskód Böngészése

Implement basic stack for ips

Docker-DCO-1.1-Signed-off-by: Guillaume J. Charmes <guillaume.charmes@docker.com> (github: creack)
Guillaume J. Charmes 11 éve
szülő
commit
63d18d875b

+ 1 - 1
networkdriver/portallocator/allocator.go

@@ -5,11 +5,11 @@ import (
 	"errors"
 	"errors"
 	"github.com/dotcloud/docker/pkg/netlink"
 	"github.com/dotcloud/docker/pkg/netlink"
 	"net"
 	"net"
+	"sort"
 	"sync"
 	"sync"
 )
 )
 
 
 type networkSet map[iPNet]iPSet
 type networkSet map[iPNet]iPSet
-type iPSet map[string]struct{}
 
 
 type iPNet struct {
 type iPNet struct {
 	IP   string
 	IP   string

+ 62 - 0
networkdriver/portallocator/ipset.go

@@ -0,0 +1,62 @@
+package ipallocator
+
+import (
+	"sync"
+)
+
+// iPSet is a thread-safe sorted set and a stack.
+type iPSet struct {
+	sync.RWMutex
+	set []string
+}
+
+// Push takes a string and adds it to the set. If the elem aready exists, it has no effect.
+func (s *iPSet) Push(elem string) {
+	s.RLock()
+	for i, e := range s.set {
+		if e == elem {
+			s.RUnlock()
+			return
+		}
+	}
+	s.RUnlock()
+
+	s.Lock()
+	s.set = append(s.set, elem)
+	// Make sure the list is always sorted
+	sort.Strings(s.set)
+	s.Unlock()
+}
+
+// Pop returns the first elemen from the list and removes it.
+// If the list is empty, it returns an empty string
+func (s *iPSet) Pop() string {
+	s.RLock()
+
+	for i, e := range s.set {
+		ret := e
+		s.RUnlock()
+		s.Lock()
+		s.set = append(s.set[:i], s.set[i+1:]...)
+		s.Unlock()
+		return e
+	}
+	s.RUnlock()
+	return ""
+}
+
+// Remove removes an element from the list.
+// If the element is not found, it has no effect.
+func (s *iPSet) Remove(elem string) {
+	for i, e := range s.set {
+		if e == elem {
+			s.set = append(s.set[:i], s.set[i+1:]...)
+			return
+		}
+	}
+}
+
+// Len returns the length of the list.
+func (s *iPSet) Len() int {
+	return len(s.set)
+}