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

Frediano Ziglio fziglio at redhat.com
Fri Sep 1 09:36:57 UTC 2017


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.

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



More information about the Spice-devel mailing list