mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Implement basic stack for ips
Docker-DCO-1.1-Signed-off-by: Guillaume J. Charmes <guillaume.charmes@docker.com> (github: creack)
This commit is contained in:
parent
9e2e8a923c
commit
63d18d875b
2 changed files with 63 additions and 1 deletions
|
@ -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
networkdriver/portallocator/ipset.go
Normal file
62
networkdriver/portallocator/ipset.go
Normal file
|
@ -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)
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue