[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