func()

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
		}
	}
}