[Qemu-devel] [PATCH 2/9] add unregister_displaychangelistener
Also change the way the gui_timer is initialized: each time a displaychangelistener is registered or unregistered we'll check whenever we need a timer (due to dpy_refresh callback being present) and if so setup a timer, otherwise zap it. This way the gui timer works correctly with displaychangelisteners coming and going. Signed-off-by: Gerd Hoffmann kra...@redhat.com --- console.h | 10 ++ vl.c | 31 +++ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/console.h b/console.h index 646ad4b..48fef22 100644 --- a/console.h +++ b/console.h @@ -229,9 +229,19 @@ static inline int is_buffer_shared(DisplaySurface *surface) !(surface-flags QEMU_REALPIXELS_FLAG)); } +void gui_setup_refresh(DisplayState *ds); + static inline void register_displaychangelistener(DisplayState *ds, DisplayChangeListener *dcl) { QLIST_INSERT_HEAD(ds-listeners, dcl, next); +gui_setup_refresh(ds); +} + +static inline void unregister_displaychangelistener(DisplayState *ds, +DisplayChangeListener *dcl) +{ +QLIST_REMOVE(dcl, next); +gui_setup_refresh(ds); } static inline void dpy_update(DisplayState *s, int x, int y, int w, int h) diff --git a/vl.c b/vl.c index 2a7c92a..fbb77fe 100644 --- a/vl.c +++ b/vl.c @@ -1288,6 +1288,29 @@ static void gui_update(void *opaque) qemu_mod_timer(ds-gui_timer, interval + qemu_get_clock_ms(rt_clock)); } +void gui_setup_refresh(DisplayState *ds) +{ +DisplayChangeListener *dcl; +bool need_timer = false; + +QLIST_FOREACH(dcl, ds-listeners, next) { +if (dcl-dpy_refresh != NULL) { +need_timer = true; +break; +} +} + +if (need_timer ds-gui_timer == NULL) { +ds-gui_timer = qemu_new_timer_ms(rt_clock, gui_update, ds); +qemu_mod_timer(ds-gui_timer, qemu_get_clock_ms(rt_clock)); +} +if (!need_timer ds-gui_timer != NULL) { +qemu_del_timer(ds-gui_timer); +qemu_free_timer(ds-gui_timer); +ds-gui_timer = NULL; +} +} + struct vm_change_state_entry { VMChangeStateHandler *cb; void *opaque; @@ -2350,7 +2373,6 @@ int main(int argc, char **argv, char **envp) const char *kernel_filename, *kernel_cmdline; char boot_devices[33] = cad; /* default to HD-floppy-CD-ROM */ DisplayState *ds; -DisplayChangeListener *dcl; int cyls, heads, secs, translation; QemuOpts *hda_opts = NULL, *opts, *machine_opts; QemuOptsList *olist; @@ -3698,13 +3720,6 @@ int main(int argc, char **argv, char **envp) /* display setup */ dpy_resize(ds); -QLIST_FOREACH(dcl, ds-listeners, next) { -if (dcl-dpy_refresh != NULL) { -ds-gui_timer = qemu_new_timer_ms(rt_clock, gui_update, ds); -qemu_mod_timer(ds-gui_timer, qemu_get_clock_ms(rt_clock)); -break; -} -} text_consoles_set_display(ds); if (foreach_device_config(DEV_GDB, gdbserver_start) 0) { -- 1.7.1
[Qemu-devel] [PATCH 2/9] add unregister_displaychangelistener
Also change the way the gui_timer is initialized: each time a displaychangelistener is registered or unregistered we'll check whenever we need a timer (due to dpy_refresh callback being present) and if so setup a timer, otherwise zap it. This way the gui timer works correctly with displaychangelisteners coming and going. Signed-off-by: Gerd Hoffmann kra...@redhat.com --- console.h | 10 ++ vl.c | 31 +++ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/console.h b/console.h index 646ad4b..48fef22 100644 --- a/console.h +++ b/console.h @@ -229,9 +229,19 @@ static inline int is_buffer_shared(DisplaySurface *surface) !(surface-flags QEMU_REALPIXELS_FLAG)); } +void gui_setup_refresh(DisplayState *ds); + static inline void register_displaychangelistener(DisplayState *ds, DisplayChangeListener *dcl) { QLIST_INSERT_HEAD(ds-listeners, dcl, next); +gui_setup_refresh(ds); +} + +static inline void unregister_displaychangelistener(DisplayState *ds, +DisplayChangeListener *dcl) +{ +QLIST_REMOVE(dcl, next); +gui_setup_refresh(ds); } static inline void dpy_update(DisplayState *s, int x, int y, int w, int h) diff --git a/vl.c b/vl.c index 2a7c92a..fbb77fe 100644 --- a/vl.c +++ b/vl.c @@ -1288,6 +1288,29 @@ static void gui_update(void *opaque) qemu_mod_timer(ds-gui_timer, interval + qemu_get_clock_ms(rt_clock)); } +void gui_setup_refresh(DisplayState *ds) +{ +DisplayChangeListener *dcl; +bool need_timer = false; + +QLIST_FOREACH(dcl, ds-listeners, next) { +if (dcl-dpy_refresh != NULL) { +need_timer = true; +break; +} +} + +if (need_timer ds-gui_timer == NULL) { +ds-gui_timer = qemu_new_timer_ms(rt_clock, gui_update, ds); +qemu_mod_timer(ds-gui_timer, qemu_get_clock_ms(rt_clock)); +} +if (!need_timer ds-gui_timer != NULL) { +qemu_del_timer(ds-gui_timer); +qemu_free_timer(ds-gui_timer); +ds-gui_timer = NULL; +} +} + struct vm_change_state_entry { VMChangeStateHandler *cb; void *opaque; @@ -2350,7 +2373,6 @@ int main(int argc, char **argv, char **envp) const char *kernel_filename, *kernel_cmdline; char boot_devices[33] = cad; /* default to HD-floppy-CD-ROM */ DisplayState *ds; -DisplayChangeListener *dcl; int cyls, heads, secs, translation; QemuOpts *hda_opts = NULL, *opts, *machine_opts; QemuOptsList *olist; @@ -3698,13 +3720,6 @@ int main(int argc, char **argv, char **envp) /* display setup */ dpy_resize(ds); -QLIST_FOREACH(dcl, ds-listeners, next) { -if (dcl-dpy_refresh != NULL) { -ds-gui_timer = qemu_new_timer_ms(rt_clock, gui_update, ds); -qemu_mod_timer(ds-gui_timer, qemu_get_clock_ms(rt_clock)); -break; -} -} text_consoles_set_display(ds); if (foreach_device_config(DEV_GDB, gdbserver_start) 0) { -- 1.7.1
Re: [Qemu-devel] [PATCH 2/9] add unregister_displaychangelistener
On Tue, 18 Sep 2012, Gerd Hoffmann wrote: Also change the way the gui_timer is initialized: each time a displaychangelistener is registered or unregistered we'll check whenever we need a timer (due to dpy_refresh callback being present) and if so setup a timer, otherwise zap it. This way the gui timer works correctly with displaychangelisteners coming and going. Signed-off-by: Gerd Hoffmann kra...@redhat.com Acked-by: Stefano Stabellini stefano.stabell...@eu.citrix.com console.h | 10 ++ vl.c | 31 +++ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/console.h b/console.h index 646ad4b..48fef22 100644 --- a/console.h +++ b/console.h @@ -229,9 +229,19 @@ static inline int is_buffer_shared(DisplaySurface *surface) !(surface-flags QEMU_REALPIXELS_FLAG)); } +void gui_setup_refresh(DisplayState *ds); + static inline void register_displaychangelistener(DisplayState *ds, DisplayChangeListener *dcl) { QLIST_INSERT_HEAD(ds-listeners, dcl, next); +gui_setup_refresh(ds); +} + +static inline void unregister_displaychangelistener(DisplayState *ds, +DisplayChangeListener *dcl) +{ +QLIST_REMOVE(dcl, next); +gui_setup_refresh(ds); } static inline void dpy_update(DisplayState *s, int x, int y, int w, int h) diff --git a/vl.c b/vl.c index 2a7c92a..fbb77fe 100644 --- a/vl.c +++ b/vl.c @@ -1288,6 +1288,29 @@ static void gui_update(void *opaque) qemu_mod_timer(ds-gui_timer, interval + qemu_get_clock_ms(rt_clock)); } +void gui_setup_refresh(DisplayState *ds) +{ +DisplayChangeListener *dcl; +bool need_timer = false; + +QLIST_FOREACH(dcl, ds-listeners, next) { +if (dcl-dpy_refresh != NULL) { +need_timer = true; +break; +} +} + +if (need_timer ds-gui_timer == NULL) { +ds-gui_timer = qemu_new_timer_ms(rt_clock, gui_update, ds); +qemu_mod_timer(ds-gui_timer, qemu_get_clock_ms(rt_clock)); +} +if (!need_timer ds-gui_timer != NULL) { +qemu_del_timer(ds-gui_timer); +qemu_free_timer(ds-gui_timer); +ds-gui_timer = NULL; +} +} + struct vm_change_state_entry { VMChangeStateHandler *cb; void *opaque; @@ -2350,7 +2373,6 @@ int main(int argc, char **argv, char **envp) const char *kernel_filename, *kernel_cmdline; char boot_devices[33] = cad; /* default to HD-floppy-CD-ROM */ DisplayState *ds; -DisplayChangeListener *dcl; int cyls, heads, secs, translation; QemuOpts *hda_opts = NULL, *opts, *machine_opts; QemuOptsList *olist; @@ -3698,13 +3720,6 @@ int main(int argc, char **argv, char **envp) /* display setup */ dpy_resize(ds); -QLIST_FOREACH(dcl, ds-listeners, next) { -if (dcl-dpy_refresh != NULL) { -ds-gui_timer = qemu_new_timer_ms(rt_clock, gui_update, ds); -qemu_mod_timer(ds-gui_timer, qemu_get_clock_ms(rt_clock)); -break; -} -} text_consoles_set_display(ds); if (foreach_device_config(DEV_GDB, gdbserver_start) 0) { -- 1.7.1