[Spice-devel] [PATCH] Use typesafe version of setting timers

Frediano Ziglio fziglio at redhat.com
Tue May 17 10:49:34 UTC 2016


This version make sure the callback is compatible with the opaque data
passed.
Also reduce the casts needed by the callbacks.
This already fixed a bug in the code.

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 server/char-device.c    | 10 +++-------
 server/inputs-channel.c |  3 +--
 server/main-channel.c   |  4 +---
 server/reds.c           |  1 +
 server/reds.h           |  8 ++++++++
 5 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/server/char-device.c b/server/char-device.c
index b67e192..f88289c 100644
--- a/server/char-device.c
+++ b/server/char-device.c
@@ -93,7 +93,7 @@ enum {
 };
 
 static void red_char_device_write_buffer_unref(RedCharDeviceWriteBuffer *write_buf);
-static void red_char_device_write_retry(void *opaque);
+static void red_char_device_write_retry(SpiceCharDeviceState *dev);
 
 static RedPipeItem *
 red_char_device_read_one_msg_from_device(RedCharDevice *dev)
@@ -242,10 +242,8 @@ static RedCharDeviceClient *red_char_device_client_find(RedCharDevice *dev,
  * Reading from the device *
  **************************/
 
-static void device_client_wait_for_tokens_timeout(void *opaque)
+static void device_client_wait_for_tokens_timeout(RedCharDeviceClient *dev_client)
 {
-    RedCharDeviceClient *dev_client = opaque;
-
     red_char_device_handle_client_overflow(dev_client);
 }
 
@@ -528,10 +526,8 @@ static int red_char_device_write_to_device(RedCharDevice *dev)
     return total;
 }
 
-static void red_char_device_write_retry(void *opaque)
+static void red_char_device_write_retry(SpiceCharDeviceState *dev)
 {
-    RedCharDevice *dev = opaque;
-
     if (dev->priv->write_to_dev_timer) {
         reds_core_timer_cancel(dev->priv->reds, dev->priv->write_to_dev_timer);
     }
diff --git a/server/inputs-channel.c b/server/inputs-channel.c
index 0ce12de..c8b7726 100644
--- a/server/inputs-channel.c
+++ b/server/inputs-channel.c
@@ -577,9 +577,8 @@ void inputs_channel_on_keyboard_leds_change(InputsChannel *inputs, uint8_t leds)
     inputs_channel_push_keyboard_modifiers(inputs, leds);
 }
 
-static void key_modifiers_sender(void *opaque)
+static void key_modifiers_sender(InputsChannel *inputs)
 {
-    InputsChannel *inputs = opaque;
     inputs_channel_push_keyboard_modifiers(inputs, kbd_get_leds(inputs_channel_get_keyboard(inputs)));
 }
 
diff --git a/server/main-channel.c b/server/main-channel.c
index 98ce660..c2e1da4 100644
--- a/server/main-channel.c
+++ b/server/main-channel.c
@@ -1054,10 +1054,8 @@ static void do_ping_client(MainChannelClient *mcc,
     }
 }
 
-static void ping_timer_cb(void *opaque)
+static void ping_timer_cb(MainChannelClient *mcc)
 {
-    MainChannelClient *mcc = opaque;
-
     if (!red_channel_client_is_connected(&mcc->base)) {
         spice_printerr("not connected to peer, ping off");
         reds_core_timer_cancel(mcc->base.channel->reds, mcc->ping_timer);
diff --git a/server/reds.c b/server/reds.c
index 9898fe5..cbdb20b 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -4145,6 +4145,7 @@ void reds_core_watch_remove(RedsState *reds, SpiceWatch *watch)
    reds->core->watch_remove(watch);
 }
 
+#undef reds_core_timer_add
 SpiceTimer *reds_core_timer_add(RedsState *reds,
                                 SpiceTimerFunc func,
                                 void *opaque)
diff --git a/server/reds.h b/server/reds.h
index ec1ea59..86e6987 100644
--- a/server/reds.h
+++ b/server/reds.h
@@ -117,6 +117,14 @@ void reds_core_watch_remove(RedsState *reds, SpiceWatch *watch);
 SpiceTimer *reds_core_timer_add(RedsState *reds,
                                 SpiceTimerFunc func,
                                 void *opaque);
+#ifdef __GNUC__
+#define reds_core_timer_add(r,f,o) ({ \
+    void (*_func)(typeof(o) o) = (f); \
+    reds_core_timer_add((r), (SpiceTimerFunc)_func, (o)); })
+#else
+#define reds_core_timer_add(r,f,o) \
+    reds_core_timer_add((r), (SpiceTimerFunc)(f), (o))
+#endif
 void reds_core_timer_start(RedsState *reds,
                            SpiceTimer *timer,
                            uint32_t ms);
-- 
2.7.4



More information about the Spice-devel mailing list