[Qemu-devel] [PATCH 2/9] add unregister_displaychangelistener

2012-09-19 Thread Gerd Hoffmann
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

2012-09-18 Thread Gerd Hoffmann
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

2012-09-18 Thread Stefano Stabellini
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