[Spice-devel] [RFC PATCH] worker: remove dependencies from red-worker.h

Jonathon Jongsma jjongsma at redhat.com
Fri Jan 22 13:57:12 PST 2016


In general, it sounds like good stuff, but can we wait with this stuff until
after we finish merging the refactory branch? I haven't looked in detail, but it
seems to me that at least some of this stuff is already handled in the refactory
branch (for instance, there is a common-worker-channel.[ch] in the refactory
branch already). I'm reluctant to commit things that will create conflicts when
rebasing or merging the stuff we've already got.


On Fri, 2016-01-22 at 17:57 +0000, Frediano Ziglio wrote:
> This patch try to make sure that CursorChannel and DisplayChannel don't
> know RedWorker existence.
> Definition common to CursorChannel and DisplayChannel are moved to a new
> common-channel.h header.
> RedWorker pointers are removed from CommonChannel and CommonChannelClient.
> red_drawable_ref declaration is moved to display-channel.h and accept
> a DisplayChannel* instead of a RedWorker* (perhaps should be moved to
> display-channel.c too with red_drawable_new).
> As a small hack red_worker_new_channel is renamed to common_channel_new
> accepting a pointer to a structure with finally is a RedWorker*.
> A good thing you can see is that red_worker_get_qxl and
> red_worker_get_memslot went away.
> There are only 4 function declaration for RedWorker (red-worker.h) and I
> already have a patch to remove the red_worker_get_* ones.
> Result is that only RedDispatcher know of the existence of RedWorker!
> 
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  server/Makefile.am       |   1 +
>  server/common-channel.h  | 107
> +++++++++++++++++++++++++++++++++++++++++++++++
>  server/cursor-channel.c  |  10 ++---
>  server/cursor-channel.h  |   4 +-
>  server/dcc-encoders.c    |   3 +-
>  server/dcc.c             |   2 +-
>  server/dcc.h             |   4 +-
>  server/display-channel.c |  15 +++----
>  server/display-channel.h |  12 ++++--
>  server/red-record-qxl.c  |   1 -
>  server/red-replay-qxl.c  |   2 +-
>  server/red-worker.c      |  44 +++++++------------
>  server/red-worker.h      |  91 +---------------------------------------
>  13 files changed, 152 insertions(+), 144 deletions(-)
>  create mode 100644 server/common-channel.h
> 
> diff --git a/server/Makefile.am b/server/Makefile.am
> index 92b716f..feb69c5 100644
> --- a/server/Makefile.am
> +++ b/server/Makefile.am
> @@ -106,6 +106,7 @@ libserver_la_SOURCES =				\
>  	red-parse-qxl.h				\
>  	red-worker.c				\
>  	red-worker.h				\
> +	common-channel.h			\
>  	display-channel.c			\
>  	display-channel.h			\
>  	cursor-channel.c			\
> diff --git a/server/common-channel.h b/server/common-channel.h
> new file mode 100644
> index 0000000..5bd85d3
> --- /dev/null
> +++ b/server/common-channel.h
> @@ -0,0 +1,107 @@
> +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
> +/*
> +   Copyright (C) 2009-2015 Red Hat, Inc.
> +
> +   This library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   This library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with this library; if not, see <http://www.gnu.org/licenses/
> >.
> +*/
> +#ifndef COMMON_CHANNEL_H_
> +#define COMMON_CHANNEL_H_
> +
> +typedef struct CommonChannelClient {
> +    RedChannelClient base;
> +
> +    uint32_t id;
> +    int is_low_bandwidth;
> +} CommonChannelClient;
> +
> +#define COMMON_CHANNEL_CLIENT(Client) ((CommonChannelClient*)(Client))
> +#define COMMON_CLIENT_TIMEOUT (NSEC_PER_SEC * 30)
> +
> +#define CHANNEL_RECEIVE_BUF_SIZE 1024
> +typedef struct CommonChannel {
> +    RedChannel base; // Must be the first thing
> +
> +    QXLInstance *qxl;
> +    uint8_t recv_buf[CHANNEL_RECEIVE_BUF_SIZE];
> +    uint32_t id_alloc; // bitfield. TODO - use this instead of shift scheme.
> +    int during_target_migrate; /* TRUE when the client that is associated
> with the channel
> +                                  is during migration. Turned off when the vm
> is started.
> +                                  The flag is used to avoid sending messages
> that are artifacts
> +                                  of the transition from stopped vm to loaded
> vm (e.g., recreation
> +                                  of the primary surface) */
> +} CommonChannel;
> +
> +#define COMMON_CHANNEL(Channel) ((CommonChannel*)(Channel))
> +
> +enum {
> +    PIPE_ITEM_TYPE_VERB = PIPE_ITEM_TYPE_CHANNEL_BASE,
> +    PIPE_ITEM_TYPE_INVAL_ONE,
> +
> +    PIPE_ITEM_TYPE_COMMON_LAST
> +};
> +
> +typedef struct VerbItem {
> +    PipeItem base;
> +    uint16_t verb;
> +} VerbItem;
> +
> +static inline void red_marshall_verb(RedChannelClient *rcc, VerbItem *item)
> +{
> +    red_channel_client_init_send_data(rcc, item->verb, NULL);
> +}
> +
> +static inline void red_pipe_add_verb(RedChannelClient* rcc, uint16_t verb)
> +{
> +    VerbItem *item = spice_new(VerbItem, 1);
> +
> +    red_channel_pipe_item_init(rcc->channel, &item->base,
> PIPE_ITEM_TYPE_VERB);
> +    item->verb = verb;
> +    red_channel_client_pipe_add(rcc, &item->base);
> +}
> +
> +#define LINK_TO_RCC(ptr) SPICE_CONTAINEROF(ptr, RedChannelClient,
> channel_link)
> +#define RCC_FOREACH_SAFE(link, next, rcc, channel) \
> +    SAFE_FOREACH(link, next, channel,  &(channel)->clients, rcc,
> LINK_TO_RCC(link))
> +
> +
> +static inline void red_pipes_add_verb(RedChannel *channel, uint16_t verb)
> +{
> +    RedChannelClient *rcc;
> +    RingItem *link, *next;
> +
> +    RCC_FOREACH_SAFE(link, next, rcc, channel) {
> +        red_pipe_add_verb(rcc, verb);
> +    }
> +}
> +
> +typedef struct CommonChannelNewParam CommonChannelNewParam;
> +
> +CommonChannel *common_channel_new(CommonChannelNewParam *param, int size,
> +                                  const char *name,
> +                                  uint32_t channel_type, int migration_flags,
> +                                  ChannelCbs *channel_cbs,
> +                                  channel_handle_parsed_proc handle_parsed);
> +
> +CommonChannelClient *common_channel_new_client(CommonChannel *common,
> +                                               int size,
> +                                               RedClient *client,
> +                                               RedsStream *stream,
> +                                               int mig_target,
> +                                               int monitor_latency,
> +                                               uint32_t *common_caps,
> +                                               int num_common_caps,
> +                                               uint32_t *caps,
> +                                               int num_caps);
> +
> +#endif
> diff --git a/server/cursor-channel.c b/server/cursor-channel.c
> index 4c15582..917cf4b 100644
> --- a/server/cursor-channel.c
> +++ b/server/cursor-channel.c
> @@ -424,7 +424,7 @@ static void cursor_channel_release_item(RedChannelClient
> *rcc, PipeItem *item, i
>      }
>  }
>  
> -CursorChannel* cursor_channel_new(RedWorker *worker)
> +CursorChannel* cursor_channel_new(CommonChannelNewParam *param)
>  {
>      CursorChannel *cursor_channel;
>      CommonChannel *channel = NULL;
> @@ -436,9 +436,9 @@ CursorChannel* cursor_channel_new(RedWorker *worker)
>      };
>  
>      spice_info("create cursor channel");
> -    channel = red_worker_new_channel(worker, sizeof(CursorChannel),
> "cursor_channel",
> -                                     SPICE_CHANNEL_CURSOR, 0,
> -                                     &cbs,
> red_channel_client_handle_message);
> +    channel = common_channel_new(param, sizeof(CursorChannel),
> "cursor_channel",
> +                                 SPICE_CHANNEL_CURSOR, 0,
> +                                 &cbs, red_channel_client_handle_message);
>  
>      cursor_channel = (CursorChannel *)channel;
>      cursor_channel->cursor_visible = TRUE;
> @@ -496,7 +496,7 @@ void cursor_channel_process_cmd(CursorChannel *cursor,
> RedCursorCmd *cursor_cmd,
>      spice_return_if_fail(cursor);
>      spice_return_if_fail(cursor_cmd);
>  
> -    cursor_item = cursor_item_new(red_worker_get_qxl(cursor->common.worker),
> +    cursor_item = cursor_item_new(cursor->common.qxl,
>                                    cursor_cmd, group_id);
>  
>      switch (cursor_cmd->type) {
> diff --git a/server/cursor-channel.h b/server/cursor-channel.h
> index 104af20..c4381c7 100644
> --- a/server/cursor-channel.h
> +++ b/server/cursor-channel.h
> @@ -20,7 +20,7 @@
>  
>  #include "spice.h"
>  #include "reds.h"
> -#include "red-worker.h"
> +#include "common-channel.h"
>  #include "red-parse-qxl.h"
>  #include "cache-item.h"
>  #include "stat.h"
> @@ -30,7 +30,7 @@ typedef struct CursorChannelClient CursorChannelClient;
>  
>  #define CURSOR_CHANNEL_CLIENT(Client) ((CursorChannelClient*)(Client))
>  
> -CursorChannel*       cursor_channel_new         (RedWorker *worker);
> +CursorChannel*       cursor_channel_new         (CommonChannelNewParam
> *param);
>  void                 cursor_channel_disconnect  (CursorChannel
> *cursor_channel);
>  void                 cursor_channel_reset       (CursorChannel *cursor);
>  void                 cursor_channel_init        (CursorChannel *cursor,
> CursorChannelClient* client);
> diff --git a/server/dcc-encoders.c b/server/dcc-encoders.c
> index 0923c9c..c810b8e 100644
> --- a/server/dcc-encoders.c
> +++ b/server/dcc-encoders.c
> @@ -456,7 +456,6 @@ void dcc_free_glz_drawable_instance(DisplayChannelClient
> *dcc,
>                                      GlzDrawableInstanceItem *instance)
>  {
>      DisplayChannel *display_channel = DCC_TO_DC(dcc);
> -    RedWorker *worker = display_channel->common.worker;
>      RedGlzDrawable *glz_drawable;
>  
>      spice_assert(instance);
> @@ -484,7 +483,7 @@ void dcc_free_glz_drawable_instance(DisplayChannelClient
> *dcc,
>          if (drawable) {
>              ring_remove(&glz_drawable->drawable_link);
>          }
> -        red_drawable_unref(worker, glz_drawable->red_drawable,
> +        red_drawable_unref(display_channel, glz_drawable->red_drawable,
>                             glz_drawable->group_id);
>          display_channel->glz_drawable_count--;
>          if (ring_item_is_linked(&glz_drawable->link)) {
> diff --git a/server/dcc.c b/server/dcc.c
> index bf692f8..3f02a98 100644
> --- a/server/dcc.c
> +++ b/server/dcc.c
> @@ -1085,7 +1085,7 @@ int dcc_compress_image(DisplayChannelClient *dcc,
>      if (drawable != NULL) {
>          group_id = drawable->group_id;
>      } else {
> -        group_id = red_worker_get_memslot(display_channel->common.worker)
> ->internal_groupslot_id;
> +        group_id = display_channel->groupslot_id;
>      }
>  
>      if (quic_compress) {
> diff --git a/server/dcc.h b/server/dcc.h
> index f715792..e4592b4 100644
> --- a/server/dcc.h
> +++ b/server/dcc.h
> @@ -16,14 +16,14 @@
>     License along with this library; if not, see <http://www.gnu.org/licenses/
> >.
>  */
>  #ifndef DCC_H_
> -# define DCC_H_
> +#define DCC_H_
>  
> -#include "red-worker.h"
>  #include "pixmap-cache.h"
>  #include "cache-item.h"
>  #include "dcc-encoders.h"
>  #include "stream.h"
>  #include "display-limits.h"
> +#include "common-channel.h"
>  
>  #define PALETTE_CACHE_HASH_SHIFT 8
>  #define PALETTE_CACHE_HASH_SIZE (1 << PALETTE_CACHE_HASH_SHIFT)
> diff --git a/server/display-channel.c b/server/display-channel.c
> index f0d133a..12f44e9 100644
> --- a/server/display-channel.c
> +++ b/server/display-channel.c
> @@ -241,8 +241,7 @@ static void stop_streams(DisplayChannel *display)
>  void display_channel_surface_unref(DisplayChannel *display, uint32_t
> surface_id)
>  {
>      RedSurface *surface = &display->surfaces[surface_id];
> -    RedWorker *worker = COMMON_CHANNEL(display)->worker;
> -    QXLInstance *qxl = red_worker_get_qxl(worker);
> +    QXLInstance *qxl = display->common.qxl;
>      DisplayChannelClient *dcc;
>      RingItem *link, *next;
>  
> @@ -1445,7 +1444,7 @@ void display_channel_drawable_unref(DisplayChannel
> *display, Drawable *drawable)
>          ring_remove(item);
>      }
>      if (drawable->red_drawable) {
> -        red_drawable_unref(COMMON_CHANNEL(display)->worker, drawable
> ->red_drawable, drawable->group_id);
> +        red_drawable_unref(display, drawable->red_drawable, drawable
> ->group_id);
>      }
>      drawable_free(display, drawable);
>      display->drawable_count--;
> @@ -2014,8 +2013,8 @@ static SpiceCanvas
> *image_surfaces_get(SpiceImageSurfaces *surfaces, uint32_t su
>      return display->surfaces[surface_id].context.canvas;
>  }
>  
> -DisplayChannel* display_channel_new(RedWorker *worker, int migrate, int
> stream_video,
> -                                    uint32_t n_surfaces)
> +DisplayChannel* display_channel_new(CommonChannelNewParam *param, int
> migrate, int stream_video,
> +                                    uint32_t n_surfaces, uint32_t
> groupslot_id)
>  {
>      DisplayChannel *display;
>      ChannelCbs cbs = {
> @@ -2034,13 +2033,15 @@ DisplayChannel* display_channel_new(RedWorker *worker,
> int migrate, int stream_v
>      spice_return_val_if_fail(num_renderers > 0, NULL);
>  
>      spice_info("create display channel");
> -    display = (DisplayChannel *)red_worker_new_channel(
> -        worker, sizeof(*display), "display_channel",
> +    display = (DisplayChannel *)common_channel_new(
> +        param, sizeof(*display), "display_channel",
>          SPICE_CHANNEL_DISPLAY,
>          SPICE_MIGRATE_NEED_FLUSH | SPICE_MIGRATE_NEED_DATA_TRANSFER,
>          &cbs, dcc_handle_message);
>      spice_return_val_if_fail(display, NULL);
>  
> +    display->groupslot_id = groupslot_id;
> +
>      clockid_t stat_clock = CLOCK_THREAD_CPUTIME_ID;
>      stat_init(&display->add_stat, "add", stat_clock);
>      stat_init(&display->exclude_stat, "exclude", stat_clock);
> diff --git a/server/display-channel.h b/server/display-channel.h
> index bf29cd3..73289f2 100644
> --- a/server/display-channel.h
> +++ b/server/display-channel.h
> @@ -21,7 +21,6 @@
>  #include <setjmp.h>
>  
>  #include "common/rect.h"
> -#include "red-worker.h"
>  #include "reds-stream.h"
>  #include "cache-item.h"
>  #include "pixmap-cache.h"
> @@ -200,6 +199,8 @@ struct DisplayChannel {
>      ImageCache image_cache;
>      RedCompressBuf *free_compress_bufs;
>  
> +    uint32_t groupslot_id;
> +
>  /* TODO: some day unify this, make it more runtime.. */
>      stat_info_t add_stat;
>      stat_info_t exclude_stat;
> @@ -248,11 +249,11 @@ typedef struct UpgradeItem {
>      SpiceClipRects *rects;
>  } UpgradeItem;
>  
> -
> -DisplayChannel*            display_channel_new                      
>  (RedWorker *worker,
> +DisplayChannel*            display_channel_new                      
>  (CommonChannelNewParam *param,
>                                                                        int
> migrate,
>                                                                        int
> stream_video,
> -                                                                     
>  uint32_t n_surfaces);
> +                                                                     
>  uint32_t n_surfaces,
> +                                                                     
>  uint32_t groupslot_id);
>  void                       display_channel_create_surface           
>  (DisplayChannel *display, uint32_t surface_id,
>                                                                       
>  uint32_t width, uint32_t height,
>                                                                        int32_t
> stride, uint32_t format, void *line_0,
> @@ -307,6 +308,9 @@ void                      
>  display_channel_process_surface_cmd       (DisplayCha
>  void                       display_channel_update_compression       
>  (DisplayChannel *display,
>                                                                       
>  DisplayChannelClient *dcc);
>  
> +void red_drawable_unref(DisplayChannel *display, RedDrawable *red_drawable,
> +                        uint32_t group_id);
> +
>  static inline int validate_surface(DisplayChannel *display, uint32_t
> surface_id)
>  {
>      if SPICE_UNLIKELY(surface_id >= display->n_surfaces) {
> diff --git a/server/red-record-qxl.c b/server/red-record-qxl.c
> index 9c9dd62..2791903 100644
> --- a/server/red-record-qxl.c
> +++ b/server/red-record-qxl.c
> @@ -21,7 +21,6 @@
>  
>  #include <stdbool.h>
>  #include <inttypes.h>
> -#include "red-worker.h"
>  #include "red-common.h"
>  #include "memslot.h"
>  #include "red-parse-qxl.h"
> diff --git a/server/red-replay-qxl.c b/server/red-replay-qxl.c
> index 17ee022..0c0515b 100644
> --- a/server/red-replay-qxl.c
> +++ b/server/red-replay-qxl.c
> @@ -24,7 +24,7 @@
>  #include <zlib.h>
>  #include <pthread.h>
>  #include "reds.h"
> -#include "red-worker.h"
> +#include "red-dispatcher.h"
>  #include "red-common.h"
>  #include "memslot.h"
>  #include "red-parse-qxl.h"
> diff --git a/server/red-worker.c b/server/red-worker.c
> index ad8ba1a..c27533f 100644
> --- a/server/red-worker.c
> +++ b/server/red-worker.c
> @@ -99,20 +99,6 @@ struct RedWorker {
>      FILE *record_fd;
>  };
>  
> -QXLInstance* red_worker_get_qxl(RedWorker *worker)
> -{
> -    spice_return_val_if_fail(worker != NULL, NULL);
> -
> -    return worker->qxl;
> -}
> -
> -RedMemSlotInfo* red_worker_get_memslot(RedWorker *worker)
> -{
> -    spice_return_val_if_fail(worker != NULL, NULL);
> -
> -    return &worker->mem_slots;
> -}
> -
>  static int display_is_connected(RedWorker *worker)
>  {
>      return (worker->display_channel && red_channel_is_connected(
> @@ -149,7 +135,7 @@ static void common_release_recv_buf(RedChannelClient *rcc,
> uint16_t type, uint32
>      }
>  }
>  
> -void red_drawable_unref(RedWorker *worker, RedDrawable *red_drawable,
> +void red_drawable_unref(DisplayChannel *display, RedDrawable *red_drawable,
>                          uint32_t group_id)
>  {
>      QXLReleaseInfoExt release_info_ext;
> @@ -157,10 +143,10 @@ void red_drawable_unref(RedWorker *worker, RedDrawable
> *red_drawable,
>      if (--red_drawable->refs) {
>          return;
>      }
> -    worker->display_channel->red_drawable_count--;
> +    display->red_drawable_count--;
>      release_info_ext.group_id = group_id;
>      release_info_ext.info = red_drawable->release_info;
> -    worker->qxl->st->qif->release_resource(worker->qxl, release_info_ext);
> +    display->common.qxl->st->qif->release_resource(display->common.qxl,
> release_info_ext);
>      red_put_drawable(red_drawable);
>      free(red_drawable);
>  }
> @@ -270,7 +256,7 @@ static int red_process_display(RedWorker *worker, uint32_t
> max_pipe_size, int *r
>                                               worker
> ->process_display_generation);
>              }
>              // release the red_drawable
> -            red_drawable_unref(worker, red_drawable, ext_cmd.group_id);
> +            red_drawable_unref(worker->display_channel, red_drawable,
> ext_cmd.group_id);
>              break;
>          }
>          case QXL_CMD_UPDATE: {
> @@ -606,8 +592,7 @@ CommonChannelClient
> *common_channel_new_client(CommonChannel *common,
>          return NULL;
>      }
>      CommonChannelClient *common_cc = (CommonChannelClient*)rcc;
> -    common_cc->worker = common->worker;
> -    common_cc->id = common->worker->qxl->id;
> +    common_cc->id = common->qxl->id;
>      common->during_target_migrate = mig_target;
>  
>      // TODO: move wide/narrow ack setting to red_channel.
> @@ -618,12 +603,13 @@ CommonChannelClient
> *common_channel_new_client(CommonChannel *common,
>  }
>  
>  
> -CommonChannel *red_worker_new_channel(RedWorker *worker, int size,
> -                                   const char *name,
> -                                   uint32_t channel_type, int
> migration_flags,
> -                                   ChannelCbs *channel_cbs,
> -                                   channel_handle_parsed_proc handle_parsed)
> +CommonChannel *common_channel_new(CommonChannelNewParam *param, int size,
> +                                  const char *name,
> +                                  uint32_t channel_type, int migration_flags,
> +                                  ChannelCbs *channel_cbs,
> +                                  channel_handle_parsed_proc handle_parsed)
>  {
> +    RedWorker *worker = (RedWorker *) param;
>      RedChannel *channel = NULL;
>      CommonChannel *common;
>  
> @@ -648,7 +634,7 @@ CommonChannel *red_worker_new_channel(RedWorker *worker,
> int size,
>      red_channel_set_stat_node(channel, stat_add_node(worker->stat, name,
> TRUE));
>  
>      common = (CommonChannel *)channel;
> -    common->worker = worker;
> +    common->qxl = worker->qxl;
>      return common;
>  }
>  
> @@ -1597,10 +1583,10 @@ RedWorker* red_worker_new(QXLInstance *qxl,
> RedDispatcher *red_dispatcher)
>  
>      worker->event_timeout = INF_EVENT_WAIT;
>  
> -    worker->cursor_channel = cursor_channel_new(worker);
> +    worker->cursor_channel = cursor_channel_new((CommonChannelNewParam*)
> worker);
>      // TODO: handle seemless migration. Temp, setting migrate to FALSE
> -    worker->display_channel = display_channel_new(worker, FALSE,
> streaming_video,
> -                                                  init_info.n_surfaces);
> +    worker->display_channel = display_channel_new((CommonChannelNewParam*)
> worker, FALSE, streaming_video,
> +                                                  init_info.n_surfaces,
> worker->mem_slots.internal_groupslot_id);
>  
>      return worker;
>  }
> diff --git a/server/red-worker.h b/server/red-worker.h
> index 91533e1..f6db1d5 100644
> --- a/server/red-worker.h
> +++ b/server/red-worker.h
> @@ -21,102 +21,13 @@
>  #include "red-common.h"
>  #include "red-dispatcher.h"
>  #include "red-parse-qxl.h"
> +#include "common-channel.h"
>  
>  typedef struct RedWorker RedWorker;
>  
> -typedef struct CommonChannelClient {
> -    RedChannelClient base;
> -
> -    uint32_t id;
> -    RedWorker *worker;
> -    int is_low_bandwidth;
> -} CommonChannelClient;
> -
> -#define COMMON_CHANNEL_CLIENT(Client) ((CommonChannelClient*)(Client))
> -#define COMMON_CLIENT_TIMEOUT (NSEC_PER_SEC * 30)
> -
> -#define CHANNEL_RECEIVE_BUF_SIZE 1024
> -typedef struct CommonChannel {
> -    RedChannel base; // Must be the first thing
> -
> -    struct RedWorker *worker;
> -    uint8_t recv_buf[CHANNEL_RECEIVE_BUF_SIZE];
> -    uint32_t id_alloc; // bitfield. TODO - use this instead of shift scheme.
> -    int during_target_migrate; /* TRUE when the client that is associated
> with the channel
> -                                  is during migration. Turned off when the vm
> is started.
> -                                  The flag is used to avoid sending messages
> that are artifacts
> -                                  of the transition from stopped vm to loaded
> vm (e.g., recreation
> -                                  of the primary surface) */
> -} CommonChannel;
> -
> -#define COMMON_CHANNEL(Channel) ((CommonChannel*)(Channel))
> -
> -enum {
> -    PIPE_ITEM_TYPE_VERB = PIPE_ITEM_TYPE_CHANNEL_BASE,
> -    PIPE_ITEM_TYPE_INVAL_ONE,
> -
> -    PIPE_ITEM_TYPE_COMMON_LAST
> -};
> -
> -typedef struct VerbItem {
> -    PipeItem base;
> -    uint16_t verb;
> -} VerbItem;
> -
> -static inline void red_marshall_verb(RedChannelClient *rcc, VerbItem *item)
> -{
> -    red_channel_client_init_send_data(rcc, item->verb, NULL);
> -}
> -
> -static inline void red_pipe_add_verb(RedChannelClient* rcc, uint16_t verb)
> -{
> -    VerbItem *item = spice_new(VerbItem, 1);
> -
> -    red_channel_pipe_item_init(rcc->channel, &item->base,
> PIPE_ITEM_TYPE_VERB);
> -    item->verb = verb;
> -    red_channel_client_pipe_add(rcc, &item->base);
> -}
> -
> -#define LINK_TO_RCC(ptr) SPICE_CONTAINEROF(ptr, RedChannelClient,
> channel_link)
> -#define RCC_FOREACH_SAFE(link, next, rcc, channel) \
> -    SAFE_FOREACH(link, next, channel,  &(channel)->clients, rcc,
> LINK_TO_RCC(link))
> -
> -
> -static inline void red_pipes_add_verb(RedChannel *channel, uint16_t verb)
> -{
> -    RedChannelClient *rcc;
> -    RingItem *link, *next;
> -
> -    RCC_FOREACH_SAFE(link, next, rcc, channel) {
> -        red_pipe_add_verb(rcc, verb);
> -    }
> -}
> -
>  RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher);
>  bool       red_worker_run(RedWorker *worker);
> -QXLInstance* red_worker_get_qxl(RedWorker *worker);
>  RedChannel* red_worker_get_cursor_channel(RedWorker *worker);
>  RedChannel* red_worker_get_display_channel(RedWorker *worker);
> -RedMemSlotInfo* red_worker_get_memslot(RedWorker *worker);
> -
> -void red_drawable_unref(RedWorker *worker, RedDrawable *red_drawable,
> -                        uint32_t group_id);
> -
> -CommonChannel *red_worker_new_channel(RedWorker *worker, int size,
> -                                   const char *name,
> -                                   uint32_t channel_type, int
> migration_flags,
> -                                   ChannelCbs *channel_cbs,
> -                                   channel_handle_parsed_proc handle_parsed);
> -
> -CommonChannelClient *common_channel_new_client(CommonChannel *common,
> -                                               int size,
> -                                               RedClient *client,
> -                                               RedsStream *stream,
> -                                               int mig_target,
> -                                               int monitor_latency,
> -                                               uint32_t *common_caps,
> -                                               int num_common_caps,
> -                                               uint32_t *caps,
> -                                               int num_caps);
>  
>  #endif


More information about the Spice-devel mailing list