[Spice-devel] [PATCH spice-server 1/3] red-qxl: Move private declarations to red-worker.h

Christophe Fergeau cfergeau at redhat.com
Mon Sep 4 12:22:44 UTC 2017


On Fri, Sep 01, 2017 at 10:36:57AM +0100, Frediano Ziglio wrote:
> RedQxl and RedWorker are quite bound together running
> CursorChannel and DisplayChannel in a separate thread
> marshalling (RedQxl) and unmarshalling and executing
> (RedWorker) requests.
> Make the communication between them private trying
> to maintaining the implementation in these 2 files.

One thing which is not exactly clear from the log is why red-worker.h is
"more private" than red-qxl.h.
red-qxl.h indeed provides the 'external' api, while red-worker.c takes
care of the actual invocation in the thread, and thus its API is
internal, and only red-qxl.h makes use of it.

Acked-by: Christophe Fergeau <cfergeau at redhat.com>

Christophe


> 
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  server/red-qxl.h        | 241 ----------------------------------------------
>  server/red-replay-qxl.c |   1 +
>  server/red-worker.h     | 248 ++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 249 insertions(+), 241 deletions(-)
> 
> Maybe messages should be moved in a separate file in order to avoid
> having to include red-worker.h from red-replay-qxl.c ?
> 
> diff --git a/server/red-qxl.h b/server/red-qxl.h
> index f925f065..3ac7bf90 100644
> --- a/server/red-qxl.h
> +++ b/server/red-qxl.h
> @@ -35,8 +35,6 @@ void red_qxl_set_compression_level(QXLInstance *qxl, int level);
>  void red_qxl_stop(QXLInstance *qxl);
>  void red_qxl_start(QXLInstance *qxl);
>  uint32_t red_qxl_get_ram_size(QXLInstance *qxl);
> -void red_qxl_async_complete(QXLInstance *qxl, AsyncCommand *async_command);
> -struct Dispatcher *red_qxl_get_dispatcher(QXLInstance *qxl);
>  gboolean red_qxl_use_client_monitors_config(QXLInstance *qxl);
>  gboolean red_qxl_client_monitors_config(QXLInstance *qxl, VDAgentMonitorsConfig *monitors_config);
>  gboolean red_qxl_get_primary_active(QXLInstance *qxl);
> @@ -64,243 +62,4 @@ void red_qxl_set_client_capabilities(QXLInstance *qxl,
>                                       uint8_t client_present,
>                                       uint8_t caps[SPICE_CAPABILITIES_SIZE]);
>  
> -typedef uint32_t RedWorkerMessage;
> -
> -/* Keep message order, only append new messages!
> - * Replay code store enum values into save files.
> - */
> -enum {
> -    RED_WORKER_MESSAGE_NOP,
> -
> -    RED_WORKER_MESSAGE_UPDATE,
> -    RED_WORKER_MESSAGE_WAKEUP,
> -    RED_WORKER_MESSAGE_OOM,
> -    RED_WORKER_MESSAGE_READY, /* unused */
> -
> -    RED_WORKER_MESSAGE_DISPLAY_CONNECT,
> -    RED_WORKER_MESSAGE_DISPLAY_DISCONNECT,
> -    RED_WORKER_MESSAGE_DISPLAY_MIGRATE,
> -    RED_WORKER_MESSAGE_START,
> -    RED_WORKER_MESSAGE_STOP,
> -    RED_WORKER_MESSAGE_CURSOR_CONNECT,
> -    RED_WORKER_MESSAGE_CURSOR_DISCONNECT,
> -    RED_WORKER_MESSAGE_CURSOR_MIGRATE,
> -    RED_WORKER_MESSAGE_SET_COMPRESSION,
> -    RED_WORKER_MESSAGE_SET_STREAMING_VIDEO,
> -    RED_WORKER_MESSAGE_SET_MOUSE_MODE,
> -    RED_WORKER_MESSAGE_ADD_MEMSLOT,
> -    RED_WORKER_MESSAGE_DEL_MEMSLOT,
> -    RED_WORKER_MESSAGE_RESET_MEMSLOTS,
> -    RED_WORKER_MESSAGE_DESTROY_SURFACES,
> -    RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE,
> -    RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE,
> -    RED_WORKER_MESSAGE_RESET_CURSOR,
> -    RED_WORKER_MESSAGE_RESET_IMAGE_CACHE,
> -    RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT,
> -    RED_WORKER_MESSAGE_LOADVM_COMMANDS,
> -    /* async commands */
> -    RED_WORKER_MESSAGE_UPDATE_ASYNC,
> -    RED_WORKER_MESSAGE_ADD_MEMSLOT_ASYNC,
> -    RED_WORKER_MESSAGE_DESTROY_SURFACES_ASYNC,
> -    RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE_ASYNC,
> -    RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE_ASYNC,
> -    RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT_ASYNC,
> -    /* suspend/windows resolution change command */
> -    RED_WORKER_MESSAGE_FLUSH_SURFACES_ASYNC,
> -
> -    RED_WORKER_MESSAGE_DISPLAY_CHANNEL_CREATE, /* unused */
> -    RED_WORKER_MESSAGE_CURSOR_CHANNEL_CREATE, /* unused */
> -
> -    RED_WORKER_MESSAGE_MONITORS_CONFIG_ASYNC,
> -    RED_WORKER_MESSAGE_DRIVER_UNLOAD,
> -    RED_WORKER_MESSAGE_GL_SCANOUT,
> -    RED_WORKER_MESSAGE_GL_DRAW_ASYNC,
> -    RED_WORKER_MESSAGE_SET_VIDEO_CODECS,
> -
> -    /* close worker thread */
> -    RED_WORKER_MESSAGE_CLOSE_WORKER,
> -
> -    RED_WORKER_MESSAGE_COUNT // LAST
> -};
> -
> -typedef struct RedWorkerMessageDisplayConnect {
> -    RedClient * client;
> -    RedsStream * stream;
> -    RedChannelCapabilities caps;   // red_worker should reset
> -    int migration;
> -} RedWorkerMessageDisplayConnect;
> -
> -typedef struct RedWorkerMessageDisplayDisconnect {
> -    RedChannelClient *rcc;
> -} RedWorkerMessageDisplayDisconnect;
> -
> -typedef struct RedWorkerMessageDisplayMigrate {
> -    RedChannelClient *rcc;
> -} RedWorkerMessageDisplayMigrate;
> -
> -typedef struct RedWorkerMessageCursorConnect {
> -    RedClient *client;
> -    RedsStream *stream;
> -    int migration;
> -    RedChannelCapabilities caps;   // red_worker should reset
> -} RedWorkerMessageCursorConnect;
> -
> -typedef struct RedWorkerMessageCursorDisconnect {
> -    RedChannelClient *rcc;
> -} RedWorkerMessageCursorDisconnect;
> -
> -typedef struct RedWorkerMessageCursorMigrate {
> -    RedChannelClient *rcc;
> -} RedWorkerMessageCursorMigrate;
> -
> -typedef struct RedWorkerMessageUpdate {
> -    uint32_t surface_id;
> -    QXLRect * qxl_area;
> -    QXLRect * qxl_dirty_rects;
> -    uint32_t num_dirty_rects;
> -    uint32_t clear_dirty_region;
> -} RedWorkerMessageUpdate;
> -
> -typedef struct RedWorkerMessageAsync {
> -    AsyncCommand *cmd;
> -} RedWorkerMessageAsync;
> -
> -typedef struct RedWorkerMessageUpdateAsync {
> -    RedWorkerMessageAsync base;
> -    uint32_t surface_id;
> -    QXLRect qxl_area;
> -    uint32_t clear_dirty_region;
> -} RedWorkerMessageUpdateAsync;
> -
> -typedef struct RedWorkerMessageAddMemslot {
> -    QXLDevMemSlot mem_slot;
> -} RedWorkerMessageAddMemslot;
> -
> -typedef struct RedWorkerMessageAddMemslotAsync {
> -    RedWorkerMessageAsync base;
> -    QXLDevMemSlot mem_slot;
> -} RedWorkerMessageAddMemslotAsync;
> -
> -typedef struct RedWorkerMessageDelMemslot {
> -    uint32_t slot_group_id;
> -    uint32_t slot_id;
> -} RedWorkerMessageDelMemslot;
> -
> -typedef struct RedWorkerMessageDestroySurfaces {
> -} RedWorkerMessageDestroySurfaces;
> -
> -typedef struct RedWorkerMessageDestroySurfacesAsync {
> -    RedWorkerMessageAsync base;
> -} RedWorkerMessageDestroySurfacesAsync;
> -
> -
> -typedef struct RedWorkerMessageDestroyPrimarySurface {
> -    uint32_t surface_id;
> -} RedWorkerMessageDestroyPrimarySurface;
> -
> -typedef struct RedWorkerMessageDestroyPrimarySurfaceAsync {
> -    RedWorkerMessageAsync base;
> -    uint32_t surface_id;
> -} RedWorkerMessageDestroyPrimarySurfaceAsync;
> -
> -typedef struct RedWorkerMessageCreatePrimarySurfaceAsync {
> -    RedWorkerMessageAsync base;
> -    uint32_t surface_id;
> -    QXLDevSurfaceCreate surface;
> -} RedWorkerMessageCreatePrimarySurfaceAsync;
> -
> -typedef struct RedWorkerMessageCreatePrimarySurface {
> -    uint32_t surface_id;
> -    QXLDevSurfaceCreate surface;
> -} RedWorkerMessageCreatePrimarySurface;
> -
> -typedef struct RedWorkerMessageResetImageCache {
> -} RedWorkerMessageResetImageCache;
> -
> -typedef struct RedWorkerMessageResetCursor {
> -} RedWorkerMessageResetCursor;
> -
> -typedef struct RedWorkerMessageWakeup {
> -} RedWorkerMessageWakeup;
> -
> -typedef struct RedWorkerMessageOom {
> -} RedWorkerMessageOom;
> -
> -typedef struct RedWorkerMessageStart {
> -} RedWorkerMessageStart;
> -
> -typedef struct RedWorkerMessageFlushSurfacesAsync {
> -    RedWorkerMessageAsync base;
> -} RedWorkerMessageFlushSurfacesAsync;
> -
> -typedef struct RedWorkerMessageStop {
> -} RedWorkerMessageStop;
> -
> -/* this command is sync, so it's ok to pass a pointer */
> -typedef struct RedWorkerMessageLoadvmCommands {
> -    uint32_t count;
> -    QXLCommandExt *ext;
> -} RedWorkerMessageLoadvmCommands;
> -
> -typedef struct RedWorkerMessageSetCompression {
> -    SpiceImageCompression image_compression;
> -} RedWorkerMessageSetCompression;
> -
> -typedef struct RedWorkerMessageSetStreamingVideo {
> -    uint32_t streaming_video;
> -} RedWorkerMessageSetStreamingVideo;
> -
> -typedef struct RedWorkerMessageSetVideoCodecs {
> -    GArray* video_codecs;
> -} RedWorkerMessageSetVideoCodecs;
> -
> -typedef struct RedWorkerMessageSetMouseMode {
> -    uint32_t mode;
> -} RedWorkerMessageSetMouseMode;
> -
> -typedef struct RedWorkerMessageDisplayChannelCreate {
> -} RedWorkerMessageDisplayChannelCreate;
> -
> -typedef struct RedWorkerMessageCursorChannelCreate {
> -} RedWorkerMessageCursorChannelCreate;
> -
> -typedef struct RedWorkerMessageDestroySurfaceWait {
> -    uint32_t surface_id;
> -} RedWorkerMessageDestroySurfaceWait;
> -
> -typedef struct RedWorkerMessageDestroySurfaceWaitAsync {
> -    RedWorkerMessageAsync base;
> -    uint32_t surface_id;
> -} RedWorkerMessageDestroySurfaceWaitAsync;
> -
> -typedef struct RedWorkerMessageResetMemslots {
> -} RedWorkerMessageResetMemslots;
> -
> -typedef struct RedWorkerMessageMonitorsConfigAsync {
> -    RedWorkerMessageAsync base;
> -    QXLPHYSICAL monitors_config;
> -    int group_id;
> -    unsigned int max_monitors;
> -} RedWorkerMessageMonitorsConfigAsync;
> -
> -typedef struct RedWorkerMessageDriverUnload {
> -} RedWorkerMessageDriverUnload;
> -
> -typedef struct RedWorkerMessageGlScanout {
> -} RedWorkerMessageGlScanout;
> -
> -typedef struct RedWorkerMessageClose {
> -} RedWorkerMessageClose;
> -
> -typedef struct RedWorkerMessageGlDraw {
> -    SpiceMsgDisplayGlDraw draw;
> -} RedWorkerMessageGlDraw;
> -
> -enum {
> -    RED_DISPATCHER_PENDING_WAKEUP,
> -    RED_DISPATCHER_PENDING_OOM,
> -};
> -
> -void red_qxl_clear_pending(QXLState *qxl_state, int pending);
> -
>  #endif /* RED_QXL_H_ */
> diff --git a/server/red-replay-qxl.c b/server/red-replay-qxl.c
> index 6172ed22..2f31e9cd 100644
> --- a/server/red-replay-qxl.c
> +++ b/server/red-replay-qxl.c
> @@ -26,6 +26,7 @@
>  
>  #include "reds.h"
>  #include "red-qxl.h"
> +#include "red-worker.h"
>  #include "red-common.h"
>  #include "memslot.h"
>  #include "red-parse-qxl.h"
> diff --git a/server/red-worker.h b/server/red-worker.h
> index 8ec28f14..4f64b729 100644
> --- a/server/red-worker.h
> +++ b/server/red-worker.h
> @@ -15,6 +15,12 @@
>     License along with this library; if not, see <http://www.gnu.org/licenses/>.
>  */
>  
> +/* This header should contains internal details between RedQxl and
> + * RedWorker.
> + * Should be included only by red-worker.c, red-qxl.c and
> + * red-replay-qxl.c (which uses message values).
> + */
> +
>  #ifndef RED_WORKER_H_
>  #define RED_WORKER_H_
>  
> @@ -31,4 +37,246 @@ RedWorker* red_worker_new(QXLInstance *qxl,
>  bool       red_worker_run(RedWorker *worker);
>  void red_worker_free(RedWorker *worker);
>  
> +void red_qxl_async_complete(QXLInstance *qxl, AsyncCommand *async_command);
> +struct Dispatcher *red_qxl_get_dispatcher(QXLInstance *qxl);
> +
> +typedef uint32_t RedWorkerMessage;
> +
> +/* Keep message order, only append new messages!
> + * Replay code store enum values into save files.
> + */
> +enum {
> +    RED_WORKER_MESSAGE_NOP,
> +
> +    RED_WORKER_MESSAGE_UPDATE,
> +    RED_WORKER_MESSAGE_WAKEUP,
> +    RED_WORKER_MESSAGE_OOM,
> +    RED_WORKER_MESSAGE_READY, /* unused */
> +
> +    RED_WORKER_MESSAGE_DISPLAY_CONNECT,
> +    RED_WORKER_MESSAGE_DISPLAY_DISCONNECT,
> +    RED_WORKER_MESSAGE_DISPLAY_MIGRATE,
> +    RED_WORKER_MESSAGE_START,
> +    RED_WORKER_MESSAGE_STOP,
> +    RED_WORKER_MESSAGE_CURSOR_CONNECT,
> +    RED_WORKER_MESSAGE_CURSOR_DISCONNECT,
> +    RED_WORKER_MESSAGE_CURSOR_MIGRATE,
> +    RED_WORKER_MESSAGE_SET_COMPRESSION,
> +    RED_WORKER_MESSAGE_SET_STREAMING_VIDEO,
> +    RED_WORKER_MESSAGE_SET_MOUSE_MODE,
> +    RED_WORKER_MESSAGE_ADD_MEMSLOT,
> +    RED_WORKER_MESSAGE_DEL_MEMSLOT,
> +    RED_WORKER_MESSAGE_RESET_MEMSLOTS,
> +    RED_WORKER_MESSAGE_DESTROY_SURFACES,
> +    RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE,
> +    RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE,
> +    RED_WORKER_MESSAGE_RESET_CURSOR,
> +    RED_WORKER_MESSAGE_RESET_IMAGE_CACHE,
> +    RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT,
> +    RED_WORKER_MESSAGE_LOADVM_COMMANDS,
> +    /* async commands */
> +    RED_WORKER_MESSAGE_UPDATE_ASYNC,
> +    RED_WORKER_MESSAGE_ADD_MEMSLOT_ASYNC,
> +    RED_WORKER_MESSAGE_DESTROY_SURFACES_ASYNC,
> +    RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE_ASYNC,
> +    RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE_ASYNC,
> +    RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT_ASYNC,
> +    /* suspend/windows resolution change command */
> +    RED_WORKER_MESSAGE_FLUSH_SURFACES_ASYNC,
> +
> +    RED_WORKER_MESSAGE_DISPLAY_CHANNEL_CREATE, /* unused */
> +    RED_WORKER_MESSAGE_CURSOR_CHANNEL_CREATE, /* unused */
> +
> +    RED_WORKER_MESSAGE_MONITORS_CONFIG_ASYNC,
> +    RED_WORKER_MESSAGE_DRIVER_UNLOAD,
> +    RED_WORKER_MESSAGE_GL_SCANOUT,
> +    RED_WORKER_MESSAGE_GL_DRAW_ASYNC,
> +    RED_WORKER_MESSAGE_SET_VIDEO_CODECS,
> +
> +    /* close worker thread */
> +    RED_WORKER_MESSAGE_CLOSE_WORKER,
> +
> +    RED_WORKER_MESSAGE_COUNT // LAST
> +};
> +
> +typedef struct RedWorkerMessageDisplayConnect {
> +    RedClient * client;
> +    RedsStream * stream;
> +    RedChannelCapabilities caps;   // red_worker should reset
> +    int migration;
> +} RedWorkerMessageDisplayConnect;
> +
> +typedef struct RedWorkerMessageDisplayDisconnect {
> +    RedChannelClient *rcc;
> +} RedWorkerMessageDisplayDisconnect;
> +
> +typedef struct RedWorkerMessageDisplayMigrate {
> +    RedChannelClient *rcc;
> +} RedWorkerMessageDisplayMigrate;
> +
> +typedef struct RedWorkerMessageCursorConnect {
> +    RedClient *client;
> +    RedsStream *stream;
> +    int migration;
> +    RedChannelCapabilities caps;   // red_worker should reset
> +} RedWorkerMessageCursorConnect;
> +
> +typedef struct RedWorkerMessageCursorDisconnect {
> +    RedChannelClient *rcc;
> +} RedWorkerMessageCursorDisconnect;
> +
> +typedef struct RedWorkerMessageCursorMigrate {
> +    RedChannelClient *rcc;
> +} RedWorkerMessageCursorMigrate;
> +
> +typedef struct RedWorkerMessageUpdate {
> +    uint32_t surface_id;
> +    QXLRect * qxl_area;
> +    QXLRect * qxl_dirty_rects;
> +    uint32_t num_dirty_rects;
> +    uint32_t clear_dirty_region;
> +} RedWorkerMessageUpdate;
> +
> +typedef struct RedWorkerMessageAsync {
> +    AsyncCommand *cmd;
> +} RedWorkerMessageAsync;
> +
> +typedef struct RedWorkerMessageUpdateAsync {
> +    RedWorkerMessageAsync base;
> +    uint32_t surface_id;
> +    QXLRect qxl_area;
> +    uint32_t clear_dirty_region;
> +} RedWorkerMessageUpdateAsync;
> +
> +typedef struct RedWorkerMessageAddMemslot {
> +    QXLDevMemSlot mem_slot;
> +} RedWorkerMessageAddMemslot;
> +
> +typedef struct RedWorkerMessageAddMemslotAsync {
> +    RedWorkerMessageAsync base;
> +    QXLDevMemSlot mem_slot;
> +} RedWorkerMessageAddMemslotAsync;
> +
> +typedef struct RedWorkerMessageDelMemslot {
> +    uint32_t slot_group_id;
> +    uint32_t slot_id;
> +} RedWorkerMessageDelMemslot;
> +
> +typedef struct RedWorkerMessageDestroySurfaces {
> +} RedWorkerMessageDestroySurfaces;
> +
> +typedef struct RedWorkerMessageDestroySurfacesAsync {
> +    RedWorkerMessageAsync base;
> +} RedWorkerMessageDestroySurfacesAsync;
> +
> +
> +typedef struct RedWorkerMessageDestroyPrimarySurface {
> +    uint32_t surface_id;
> +} RedWorkerMessageDestroyPrimarySurface;
> +
> +typedef struct RedWorkerMessageDestroyPrimarySurfaceAsync {
> +    RedWorkerMessageAsync base;
> +    uint32_t surface_id;
> +} RedWorkerMessageDestroyPrimarySurfaceAsync;
> +
> +typedef struct RedWorkerMessageCreatePrimarySurfaceAsync {
> +    RedWorkerMessageAsync base;
> +    uint32_t surface_id;
> +    QXLDevSurfaceCreate surface;
> +} RedWorkerMessageCreatePrimarySurfaceAsync;
> +
> +typedef struct RedWorkerMessageCreatePrimarySurface {
> +    uint32_t surface_id;
> +    QXLDevSurfaceCreate surface;
> +} RedWorkerMessageCreatePrimarySurface;
> +
> +typedef struct RedWorkerMessageResetImageCache {
> +} RedWorkerMessageResetImageCache;
> +
> +typedef struct RedWorkerMessageResetCursor {
> +} RedWorkerMessageResetCursor;
> +
> +typedef struct RedWorkerMessageWakeup {
> +} RedWorkerMessageWakeup;
> +
> +typedef struct RedWorkerMessageOom {
> +} RedWorkerMessageOom;
> +
> +typedef struct RedWorkerMessageStart {
> +} RedWorkerMessageStart;
> +
> +typedef struct RedWorkerMessageFlushSurfacesAsync {
> +    RedWorkerMessageAsync base;
> +} RedWorkerMessageFlushSurfacesAsync;
> +
> +typedef struct RedWorkerMessageStop {
> +} RedWorkerMessageStop;
> +
> +/* this command is sync, so it's ok to pass a pointer */
> +typedef struct RedWorkerMessageLoadvmCommands {
> +    uint32_t count;
> +    QXLCommandExt *ext;
> +} RedWorkerMessageLoadvmCommands;
> +
> +typedef struct RedWorkerMessageSetCompression {
> +    SpiceImageCompression image_compression;
> +} RedWorkerMessageSetCompression;
> +
> +typedef struct RedWorkerMessageSetStreamingVideo {
> +    uint32_t streaming_video;
> +} RedWorkerMessageSetStreamingVideo;
> +
> +typedef struct RedWorkerMessageSetVideoCodecs {
> +    GArray* video_codecs;
> +} RedWorkerMessageSetVideoCodecs;
> +
> +typedef struct RedWorkerMessageSetMouseMode {
> +    uint32_t mode;
> +} RedWorkerMessageSetMouseMode;
> +
> +typedef struct RedWorkerMessageDisplayChannelCreate {
> +} RedWorkerMessageDisplayChannelCreate;
> +
> +typedef struct RedWorkerMessageCursorChannelCreate {
> +} RedWorkerMessageCursorChannelCreate;
> +
> +typedef struct RedWorkerMessageDestroySurfaceWait {
> +    uint32_t surface_id;
> +} RedWorkerMessageDestroySurfaceWait;
> +
> +typedef struct RedWorkerMessageDestroySurfaceWaitAsync {
> +    RedWorkerMessageAsync base;
> +    uint32_t surface_id;
> +} RedWorkerMessageDestroySurfaceWaitAsync;
> +
> +typedef struct RedWorkerMessageResetMemslots {
> +} RedWorkerMessageResetMemslots;
> +
> +typedef struct RedWorkerMessageMonitorsConfigAsync {
> +    RedWorkerMessageAsync base;
> +    QXLPHYSICAL monitors_config;
> +    int group_id;
> +    unsigned int max_monitors;
> +} RedWorkerMessageMonitorsConfigAsync;
> +
> +typedef struct RedWorkerMessageDriverUnload {
> +} RedWorkerMessageDriverUnload;
> +
> +typedef struct RedWorkerMessageGlScanout {
> +} RedWorkerMessageGlScanout;
> +
> +typedef struct RedWorkerMessageClose {
> +} RedWorkerMessageClose;
> +
> +typedef struct RedWorkerMessageGlDraw {
> +    SpiceMsgDisplayGlDraw draw;
> +} RedWorkerMessageGlDraw;
> +
> +enum {
> +    RED_DISPATCHER_PENDING_WAKEUP,
> +    RED_DISPATCHER_PENDING_OOM,
> +};
> +
> +void red_qxl_clear_pending(QXLState *qxl_state, int pending);
> +
>  #endif /* RED_WORKER_H_ */
> -- 
> 2.13.5
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel


More information about the Spice-devel mailing list