Compare commits

...

4 Commits

Author SHA1 Message Date
Alex X
699a995e8c Fix deadlock on write to track channel 2025-04-08 11:33:04 +03:00
Alex X
ce02b03a73 Merge pull request #1682 from infastin/fix/sender-deadlock
fix(core): potential sender goroutine deadlock
2025-04-08 11:26:18 +03:00
infastin
487527f5a5 chore: remove mutexes 2025-04-05 13:50:02 +05:00
infastin
0669cfbebf fix(core): potential sender loop deadlock 2025-03-31 19:12:07 +05:00

View File

@@ -97,13 +97,17 @@ func NewSender(media *Media, codec *Codec) *Sender {
buf: buf,
}
s.Input = func(packet *Packet) {
// writing to nil chan - OK, writing to closed chan - panic
s.mu.Lock()
select {
case s.buf <- packet:
s.Bytes += len(packet.Payload)
s.Packets++
default:
if s.buf != nil {
// unblocked write to channel
select {
case s.buf <- packet:
s.Bytes += len(packet.Payload)
s.Packets++
default:
s.Drops++
}
} else {
s.Drops++
}
s.mu.Unlock()
@@ -139,13 +143,13 @@ func (s *Sender) Start() {
}
s.done = make(chan struct{})
go func() {
// for range on nil chan is OK
for packet := range s.buf {
// pass buf directly so that it's impossible for buf to be nil
go func(buf chan *Packet) {
for packet := range buf {
s.Output(packet)
}
close(s.done)
}()
}(s.buf)
}
func (s *Sender) Wait() {