Fix deadlock on transcoder (#1493)

This commit is contained in:
Zoe Roux 2026-05-07 01:21:41 +02:00 committed by GitHub
parent 13eb05b9ab
commit e181eb9961
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 11 additions and 9 deletions

View File

@ -29,7 +29,7 @@ type Keyframe struct {
type KeyframeInfo struct {
ready sync.WaitGroup
mutex sync.RWMutex
listeners []func(keyframes []float64)
listeners []func(keyframesLen int)
}
func (kf *Keyframe) Get(idx int32) float64 {
@ -63,14 +63,16 @@ func (kf *Keyframe) Length() (int32, bool) {
func (kf *Keyframe) add(values []float64) {
kf.info.mutex.Lock()
defer kf.info.mutex.Unlock()
kf.Keyframes = append(kf.Keyframes, values...)
newLen := len(kf.Keyframes)
kf.info.mutex.Unlock()
for _, listener := range kf.info.listeners {
listener(kf.Keyframes)
listener(newLen)
}
}
func (kf *Keyframe) AddListener(callback func(keyframes []float64)) {
func (kf *Keyframe) AddListener(callback func(keyframesLen int)) {
kf.info.mutex.Lock()
defer kf.info.mutex.Unlock()
kf.info.listeners = append(kf.info.listeners, callback)

View File

@ -84,16 +84,16 @@ func NewStream(file *FileStream, keyframes *Keyframe, handle StreamHandle, ret *
}
if !is_done {
keyframes.AddListener(func(keyframes []float64) {
keyframes.AddListener(func(keyframesLen int) {
ret.lock.Lock()
defer ret.lock.Unlock()
old_length := len(ret.segments)
if cap(ret.segments) > len(keyframes) {
ret.segments = ret.segments[:len(keyframes)]
if cap(ret.segments) > keyframesLen {
ret.segments = ret.segments[:keyframesLen]
} else {
ret.segments = append(ret.segments, make([]Segment, len(keyframes)-old_length)...)
ret.segments = append(ret.segments, make([]Segment, keyframesLen-old_length)...)
}
for seg := old_length; seg < len(keyframes); seg++ {
for seg := old_length; seg < keyframesLen; seg++ {
ret.segments[seg].channel = make(chan struct{})
}
})