in gymvnc/gymvnc.go [355:391]
func (c *VNCSession) maintainFrameBuffer(updates chan *vncclient.FramebufferUpdateMessage) error {
done := false
for {
select {
case update := <-updates:
c.updated.L.Lock()
if err := c.applyDeferred(); err != nil {
c.updated.L.Unlock()
return errors.Annotate(err, "when applying deferred updates")
}
if err := c.applyUpdate(update); err != nil {
c.updated.L.Unlock()
return errors.Annotate(err, "when applying new update")
}
c.deferredUpdates = append(c.deferredUpdates, update)
if len(c.deferredUpdates) >= c.deferredUpdatesMax && !c.pauseUpdates {
log.Infof("[%s] update queue max of %d reached; pausing further updates", c.label, c.deferredUpdatesMax)
c.pauseUpdates = true
}
// Update complete!
c.updated.Broadcast()
c.updated.L.Unlock()
case <-c.mgr.Done:
log.Debugf("[%s] shutting down frame buffer thread", c.label)
return nil
}
if !done {
c.mgr.Ready.Done()
done = true
}
}
}