mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
vnc update fix
We need to remember has_updates for each vnc client. Otherwise it might happen that vnc_update_client(has_dirty=1) takes the first exit due to output buffers not being flushed yet and subsequent calls with has_dirty=0 take the second exit, wrongly assuming there is nothing to do because the work defered in the first call is ignored. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Peter Lieven <pl@kamp.de>
This commit is contained in:
parent
07535a8902
commit
6365828003
2 changed files with 4 additions and 1 deletions
4
ui/vnc.c
4
ui/vnc.c
|
@ -887,6 +887,7 @@ static int find_and_clear_dirty_height(struct VncState *vs,
|
|||
|
||||
static int vnc_update_client(VncState *vs, int has_dirty, bool sync)
|
||||
{
|
||||
vs->has_dirty += has_dirty;
|
||||
if (vs->need_update && vs->csock != -1) {
|
||||
VncDisplay *vd = vs->vd;
|
||||
VncJob *job;
|
||||
|
@ -898,7 +899,7 @@ static int vnc_update_client(VncState *vs, int has_dirty, bool sync)
|
|||
/* kernel send buffers are full -> drop frames to throttle */
|
||||
return 0;
|
||||
|
||||
if (!has_dirty && !vs->audio_cap && !vs->force_update)
|
||||
if (!vs->has_dirty && !vs->audio_cap && !vs->force_update)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
|
@ -941,6 +942,7 @@ static int vnc_update_client(VncState *vs, int has_dirty, bool sync)
|
|||
vnc_jobs_join(vs);
|
||||
}
|
||||
vs->force_update = 0;
|
||||
vs->has_dirty = 0;
|
||||
return n;
|
||||
}
|
||||
|
||||
|
|
1
ui/vnc.h
1
ui/vnc.h
|
@ -263,6 +263,7 @@ struct VncState
|
|||
VncDisplay *vd;
|
||||
int need_update;
|
||||
int force_update;
|
||||
int has_dirty;
|
||||
uint32_t features;
|
||||
int absolute;
|
||||
int last_x;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue