mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-08-31 12:54:01 +03:00
FILE / ScuroNeko/mtg
hub/connection_list.go
Исходный файл и его история в репозитории.
71 lines
1.5 KiB
Go
71 lines
1.5 KiB
Go
package hub
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
|
|
"github.com/9seconds/mtg/config"
|
|
)
|
|
|
|
type connectionList struct {
|
|
connections []*connection
|
|
}
|
|
|
|
func (c *connectionList) get(conn *ProxyConn) (*connection, error) {
|
|
if len(c.connections) > 0 && c.connections[0].Len() < config.C.MultiplexPerConnection {
|
|
if err := c.connections[0].Attach(conn); err == nil {
|
|
return c.connections[0], nil
|
|
}
|
|
}
|
|
|
|
newConn, err := newConnection(conn.req)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("cannot allocate a new connection: %w", err)
|
|
}
|
|
|
|
if err = newConn.Attach(conn); err != nil {
|
|
newConn.Close()
|
|
|
|
return nil, fmt.Errorf("cannot attach to the newly created connection: %w", err)
|
|
}
|
|
|
|
c.connections = append(c.connections, newConn)
|
|
lastIndex := len(c.connections) - 1
|
|
c.connections[0], c.connections[lastIndex] = c.connections[lastIndex], c.connections[0]
|
|
|
|
return newConn, nil
|
|
}
|
|
|
|
func (c *connectionList) gc() {
|
|
prevLen := len(c.connections)
|
|
if prevLen == 0 {
|
|
return
|
|
}
|
|
|
|
for i := len(c.connections) - 1; i >= 0; i-- {
|
|
lastIndex := len(c.connections) - 1
|
|
|
|
if c.connections[i].Done() {
|
|
c.connections[i].Close()
|
|
|
|
if len(c.connections)-1 == i {
|
|
c.connections = c.connections[:lastIndex]
|
|
} else {
|
|
c.connections[i], c.connections[lastIndex] = c.connections[lastIndex], c.connections[i]
|
|
}
|
|
}
|
|
}
|
|
|
|
if prevLen != len(c.connections) {
|
|
c.sort()
|
|
}
|
|
}
|
|
|
|
func (c *connectionList) sort() {
|
|
if len(c.connections) > 1 {
|
|
sort.Slice(c.connections, func(i, j int) bool {
|
|
return c.connections[i].Len() < c.connections[j].Len()
|
|
})
|
|
}
|
|
}
|