summaryrefslogtreecommitdiffstats
path: root/server/red_dispatcher.c
diff options
context:
space:
mode:
authorIzik Eidus <ieidus@redhat.com>2009-11-21 22:42:38 +0200
committerYaniv Kamay <ykamay@redhat.com>2009-11-23 20:54:11 +0200
commita70110c4e50aad99de7a844bb78eb868768e7841 (patch)
treec12cecce588255af581b6a7e3a85c7d4d3f62ed0 /server/red_dispatcher.c
parentf20e0d3200c17d3850e4d08ee55edb6c836ae71e (diff)
downloadspice-a70110c4e50aad99de7a844bb78eb868768e7841.tar.gz
spice-a70110c4e50aad99de7a844bb78eb868768e7841.tar.xz
spice-a70110c4e50aad99de7a844bb78eb868768e7841.zip
spice: server: add memslots support.
Signed-off-by: Izik Eidus <ieidus@redhat.com>
Diffstat (limited to 'server/red_dispatcher.c')
-rw-r--r--server/red_dispatcher.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/server/red_dispatcher.c b/server/red_dispatcher.c
index 58de5a33..f98301ac 100644
--- a/server/red_dispatcher.c
+++ b/server/red_dispatcher.c
@@ -247,6 +247,34 @@ static void qxl_worker_update_area(QXLWorker *qxl_worker)
ASSERT(message == RED_WORKER_MESSAGE_READY);
}
+static void qxl_worker_add_memslot(QXLWorker *qxl_worker, QXLDevMemSlot *mem_slot)
+{
+ RedDispatcher *dispatcher = (RedDispatcher *)qxl_worker;
+ RedWorkeMessage message = RED_WORKER_MESSAGE_ADD_MEMSLOT;
+
+ write_message(dispatcher->channel, &message);
+ send_data(dispatcher->channel, mem_slot, sizeof(QXLDevMemSlot));
+ read_message(dispatcher->channel, &message);
+ ASSERT(message == RED_WORKER_MESSAGE_READY);
+}
+
+static void qxl_worker_del_memslot(QXLWorker *qxl_worker, uint32_t slot_id)
+{
+ RedDispatcher *dispatcher = (RedDispatcher *)qxl_worker;
+ RedWorkeMessage message = RED_WORKER_MESSAGE_DEL_MEMSLOT;
+
+ write_message(dispatcher->channel, &message);
+ send_data(dispatcher->channel, &slot_id, sizeof(uint32_t));
+}
+
+static void qxl_worker_reset_memslots(QXLWorker *qxl_worker)
+{
+ RedDispatcher *dispatcher = (RedDispatcher *)qxl_worker;
+ RedWorkeMessage message = RED_WORKER_MESSAGE_RESET_MEMSLOTS;
+
+ write_message(dispatcher->channel, &message);
+}
+
static void qxl_worker_wakeup(QXLWorker *qxl_worker)
{
RedDispatcher *dispatcher = (RedDispatcher *)qxl_worker;
@@ -386,6 +414,7 @@ RedDispatcher *red_dispatcher_init(QXLInterface *qxl_interface)
int channels[2];
RedWorkeMessage message;
WorkerInitData init_data;
+ QXLDevInitInfo init_info;
int r;
Channel *reds_channel;
Channel *cursor_channel;
@@ -433,6 +462,15 @@ RedDispatcher *red_dispatcher_init(QXLInterface *qxl_interface)
dispatcher->base.start = qxl_worker_start;
dispatcher->base.stop = qxl_worker_stop;
dispatcher->base.update_area = qxl_worker_update_area;
+ dispatcher->base.add_memslot = qxl_worker_add_memslot;
+ dispatcher->base.del_memslot = qxl_worker_del_memslot;
+ dispatcher->base.reset_memslots = qxl_worker_reset_memslots;
+
+ qxl_interface->get_init_info(qxl_interface, &init_info);
+
+ init_data.memslot_id_bits = init_info.memslot_id_bits;
+ init_data.memslot_gen_bits = init_info.memslot_gen_bits;
+ init_data.num_memslots = init_info.num_memslots;
sigfillset(&thread_sig_mask);
sigdelset(&thread_sig_mask, SIGILL);