1
Fork 0
mirror of https://github.com/jech/galene.git synced 2024-11-22 16:45:58 +01:00

Maintain local connections explicitly.

This commit is contained in:
Juliusz Chroboczek 2020-05-23 02:22:43 +02:00
parent 4699c338e1
commit bfdc22ff83
2 changed files with 50 additions and 21 deletions

View file

@ -612,28 +612,12 @@ func delUpConn(c *client, id string) bool {
} }
} }
type clientId struct { local := conn.getLocal()
client *client go func() {
id string for _, l := range local {
l.Close()
} }
cids := make([]clientId, 0) }()
clients := c.group.getClients(c)
for _, cc := range clients {
cc.mu.Lock()
for _, otherconn := range cc.down {
if otherconn.remote == conn {
cids = append(cids, clientId{cc, otherconn.id})
}
}
cc.mu.Unlock()
}
go func(cids []clientId) {
for _, cid := range cids {
cid.client.action(delConnAction{cid.id})
}
}(cids)
conn.pc.Close() conn.pc.Close()
delete(c.up, id) delete(c.up, id)
@ -691,17 +675,21 @@ func addDownConn(c *client, id string, remote *upConnection) (*downConnection, e
} }
conn := &downConnection{ conn := &downConnection{
id: id, id: id,
client: c,
pc: pc, pc: pc,
remote: remote, remote: remote,
} }
c.mu.Lock() c.mu.Lock()
defer c.mu.Unlock() defer c.mu.Unlock()
if c.down[id] != nil || (c.up != nil && c.up[id] != nil) { if c.down[id] != nil || (c.up != nil && c.up[id] != nil) {
conn.pc.Close() conn.pc.Close()
return nil, errors.New("Adding duplicate connection") return nil, errors.New("Adding duplicate connection")
} }
c.down[id] = conn c.down[id] = conn
remote.addLocal(conn)
return conn, nil return conn, nil
} }
@ -717,6 +705,7 @@ func delDownConn(c *client, id string) bool {
return false return false
} }
conn.remote.delLocal(conn)
for _, track := range conn.tracks { for _, track := range conn.tracks {
found := track.remote.delLocal(track) found := track.remote.delLocal(track)
if !found { if !found {

40
conn.go
View file

@ -100,12 +100,47 @@ type upConnection struct {
tracks []*upTrack tracks []*upTrack
labels map[string]string labels map[string]string
iceCandidates []*webrtc.ICECandidateInit iceCandidates []*webrtc.ICECandidateInit
mu sync.Mutex
local []*downConnection
} }
func (up *upConnection) getPC() *webrtc.PeerConnection { func (up *upConnection) getPC() *webrtc.PeerConnection {
return up.pc return up.pc
} }
func (up *upConnection) addLocal(local *downConnection) {
up.mu.Lock()
defer up.mu.Unlock()
for _, t := range up.local {
if t == local {
up.mu.Unlock()
return
}
}
up.local = append(up.local, local)
}
func (up *upConnection) delLocal(local *downConnection) bool {
up.mu.Lock()
defer up.mu.Unlock()
for i, l := range up.local {
if l == local {
up.local = append(up.local[:i], up.local[i+1:]...)
return true
}
}
return false
}
func (up *upConnection) getLocal() []*downConnection {
up.mu.Lock()
defer up.mu.Unlock()
local := make([]*downConnection, len(up.local))
copy(local, up.local)
return local
}
func (up *upConnection) addICECandidate(candidate *webrtc.ICECandidateInit) error { func (up *upConnection) addICECandidate(candidate *webrtc.ICECandidateInit) error {
if up.pc.RemoteDescription() != nil { if up.pc.RemoteDescription() != nil {
return up.pc.AddICECandidate(*candidate) return up.pc.AddICECandidate(*candidate)
@ -224,12 +259,17 @@ func (down *downTrack) GetMaxBitrate(now uint64) uint64 {
type downConnection struct { type downConnection struct {
id string id string
client *client
pc *webrtc.PeerConnection pc *webrtc.PeerConnection
remote *upConnection remote *upConnection
tracks []*downTrack tracks []*downTrack
iceCandidates []*webrtc.ICECandidateInit iceCandidates []*webrtc.ICECandidateInit
} }
func (down *downConnection) Close() error {
return down.client.action(delConnAction{down.id})
}
func (down *downConnection) getPC() *webrtc.PeerConnection { func (down *downConnection) getPC() *webrtc.PeerConnection {
return down.pc return down.pc
} }