[Spice-devel] [PATCH 04/15] Introduce spice_char_device_get_interface()

Frediano Ziglio fziglio at redhat.com
Wed Mar 9 16:28:16 UTC 2016


From: Christophe Fergeau <cfergeau at redhat.com>

Hides awkward casting/dereferencing to go from a
SpiceCharDeviceInstance to a SpiceCharDeviceInterface
---
 server/char-device.c |  9 +++++++--
 server/char-device.h |  2 ++
 server/reds.c        |  6 +++---
 server/smartcard.c   |  2 +-
 server/spicevmc.c    | 16 ++++++----------
 5 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/server/char-device.c b/server/char-device.c
index 9858ab3..cda2d60 100644
--- a/server/char-device.c
+++ b/server/char-device.c
@@ -460,7 +460,7 @@ static int spice_char_device_write_to_device(SpiceCharDeviceState *dev)
         reds_core_timer_cancel(dev->reds, dev->write_to_dev_timer);
     }
 
-    sif = SPICE_CONTAINEROF(dev->sin->base.sif, SpiceCharDeviceInterface, base);
+    sif = spice_char_device_get_interface(dev->sin);
     while (dev->running) {
         uint32_t write_len;
 
@@ -695,7 +695,7 @@ SpiceCharDeviceState *spice_char_device_state_create(SpiceCharDeviceInstance *si
     ring_init(&char_dev->write_bufs_pool);
     ring_init(&char_dev->clients);
 
-    sif = SPICE_CONTAINEROF(char_dev->sin->base.sif, SpiceCharDeviceInterface, base);
+    sif = spice_char_device_get_interface(char_dev->sin);
     if (sif->base.minor_version <= 2 ||
         !(sif->flags & SPICE_CHAR_DEVICE_NOTIFY_WRITABLE)) {
         char_dev->write_to_dev_timer = reds_core_timer_add(reds, spice_char_dev_write_retry, char_dev);
@@ -1044,3 +1044,8 @@ SpiceServer* spice_char_device_get_server(SpiceCharDeviceState *dev)
 {
     return dev->reds;
 }
+
+SpiceCharDeviceInterface *spice_char_device_get_interface(SpiceCharDeviceInstance *instance)
+{
+   return SPICE_CONTAINEROF(instance->base.sif, SpiceCharDeviceInterface, base);
+}
diff --git a/server/char-device.h b/server/char-device.h
index db72bfe..7c78524 100644
--- a/server/char-device.h
+++ b/server/char-device.h
@@ -219,4 +219,6 @@ SpiceCharDeviceState *spicevmc_device_connect(struct RedsState *reds,
 void spicevmc_device_disconnect(struct RedsState *reds,
                                 SpiceCharDeviceInstance *char_device);
 
+SpiceCharDeviceInterface *spice_char_device_get_interface(SpiceCharDeviceInstance *instance);
+
 #endif // CHAR_DEVICE_H_
diff --git a/server/reds.c b/server/reds.c
index 1b7d394..736dca6 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -439,7 +439,7 @@ static void reds_reset_vdp(RedsState *reds)
         spice_char_device_reset(state->base);
     }
 
-    sif = SPICE_CONTAINEROF(reds->vdagent->base.sif, SpiceCharDeviceInterface, base);
+    sif = spice_char_device_get_interface(reds->vdagent);
     if (sif->state) {
         sif->state(reds->vdagent, 0);
     }
@@ -714,7 +714,7 @@ static SpiceCharDeviceMsgToClient *vdi_port_read_one_msg_from_device(SpiceCharDe
         return NULL;
     }
     spice_assert(reds->vdagent == sin);
-    sif = SPICE_CONTAINEROF(reds->vdagent->base.sif, SpiceCharDeviceInterface, base);
+    sif = spice_char_device_get_interface(reds->vdagent);
     while (reds->vdagent) {
         switch (state->read_state) {
         case VDI_PORT_READ_STATE_READ_HEADER:
@@ -2990,7 +2990,7 @@ static SpiceCharDeviceState *attach_to_red_agent(RedsState *reds, SpiceCharDevic
     reds->vdagent = sin;
     reds_update_mouse_mode(reds);
 
-    sif = SPICE_CONTAINEROF(reds->vdagent->base.sif, SpiceCharDeviceInterface, base);
+    sif = spice_char_device_get_interface(reds->vdagent);
     if (sif->state) {
         sif->state(reds->vdagent, 1);
     }
diff --git a/server/smartcard.c b/server/smartcard.c
index 565a71d..6071f59 100644
--- a/server/smartcard.c
+++ b/server/smartcard.c
@@ -133,7 +133,7 @@ SpiceCharDeviceMsgToClient *smartcard_read_msg_from_device(SpiceCharDeviceInstan
                                                            void *opaque)
 {
     SmartCardDeviceState *state = opaque;
-    SpiceCharDeviceInterface *sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base);
+    SpiceCharDeviceInterface *sif = spice_char_device_get_interface(sin);
     VSCMsgHeader *vheader = (VSCMsgHeader*)state->buf;
     int n;
     int remaining;
diff --git a/server/spicevmc.c b/server/spicevmc.c
index 35d1393..929ec0e 100644
--- a/server/spicevmc.c
+++ b/server/spicevmc.c
@@ -112,7 +112,7 @@ static SpiceCharDeviceMsgToClient *spicevmc_chardev_read_msg_from_dev(SpiceCharD
     SpiceVmcPipeItem *msg_item;
     int n;
 
-    sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base);
+    sif = spice_char_device_get_interface(sin);
 
     if (!state->rcc) {
         return NULL;
@@ -212,7 +212,6 @@ static int spicevmc_red_channel_client_config_socket(RedChannelClient *rcc)
 static void spicevmc_red_channel_client_on_disconnect(RedChannelClient *rcc)
 {
     SpiceVmcState *state;
-    SpiceCharDeviceInstance *sin;
     SpiceCharDeviceInterface *sif;
 
     if (!rcc) {
@@ -220,8 +219,6 @@ static void spicevmc_red_channel_client_on_disconnect(RedChannelClient *rcc)
     }
 
     state = SPICE_CONTAINEROF(rcc->channel, SpiceVmcState, channel);
-    sin = state->chardev_sin;
-    sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base);
 
     if (state->recv_from_client_buf) { /* partial message which wasn't pushed to device */
         spice_char_device_write_buffer_release(state->chardev_st, state->recv_from_client_buf);
@@ -243,8 +240,9 @@ static void spicevmc_red_channel_client_on_disconnect(RedChannelClient *rcc)
         red_channel_client_destroy(rcc);
 
     state->rcc = NULL;
+    sif = spice_char_device_get_interface(state->chardev_sin);
     if (sif->state) {
-        sif->state(sin, 0);
+        sif->state(state->chardev_sin, 0);
     }
 }
 
@@ -287,12 +285,10 @@ static int spicevmc_red_channel_client_handle_message(RedChannelClient *rcc,
                                                       uint8_t *msg)
 {
     SpiceVmcState *state;
-    SpiceCharDeviceInstance *sin;
     SpiceCharDeviceInterface *sif;
 
     state = spicevmc_red_channel_client_get_state(rcc);
-    sin = state->chardev_sin;
-    sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base);
+    sif = spice_char_device_get_interface(state->chardev_sin);
 
     switch (type) {
     case SPICE_MSGC_SPICEVMC_DATA:
@@ -307,7 +303,7 @@ static int spicevmc_red_channel_client_handle_message(RedChannelClient *rcc,
             return FALSE;
         }
         if (sif->base.minor_version >= 2 && sif->event != NULL)
-            sif->event(sin, *msg);
+            sif->event(state->chardev_sin, *msg);
         break;
     default:
         return red_channel_client_handle_message(rcc, size, type, msg);
@@ -467,7 +463,6 @@ static void spicevmc_connect(RedChannel *channel, RedClient *client,
 
     state = SPICE_CONTAINEROF(channel, SpiceVmcState, channel);
     sin = state->chardev_sin;
-    sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base);
 
     if (state->rcc) {
         spice_printerr("channel client %d:%d (%p) already connected, refusing second connection",
@@ -499,6 +494,7 @@ static void spicevmc_connect(RedChannel *channel, RedClient *client,
         return;
     }
 
+    sif = spice_char_device_get_interface(state->chardev_sin);
     if (sif->state) {
         sif->state(sin, 1);
     }
-- 
2.5.0



More information about the Spice-devel mailing list