diff options
author | Izik Eidus <ieidus@redhat.com> | 2009-11-21 22:42:38 +0200 |
---|---|---|
committer | Yaniv Kamay <ykamay@redhat.com> | 2009-11-23 20:54:11 +0200 |
commit | a70110c4e50aad99de7a844bb78eb868768e7841 (patch) | |
tree | c12cecce588255af581b6a7e3a85c7d4d3f62ed0 /server/red_dispatcher.c | |
parent | f20e0d3200c17d3850e4d08ee55edb6c836ae71e (diff) | |
download | spice-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.c | 38 |
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); |