summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2010-03-02 16:25:22 +0100
committerAlexander Larsson <alexl@redhat.com>2010-03-08 19:45:28 +0100
commit05697e502d709974f9b94feca5d9bdde20b993be (patch)
tree4b048e1a6b305ab18402edb01383fc77a367398c /server
parentf7a77f9881d5cd1d360b043d6b619216603941dd (diff)
downloadspice-05697e502d709974f9b94feca5d9bdde20b993be.tar.gz
spice-05697e502d709974f9b94feca5d9bdde20b993be.tar.xz
spice-05697e502d709974f9b94feca5d9bdde20b993be.zip
Make virt mapping an interface
Diffstat (limited to 'server')
-rw-r--r--server/red_worker.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/server/red_worker.c b/server/red_worker.c
index 52d8451b..6eaf391f 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -1007,6 +1007,7 @@ typedef struct RedWorker {
uint64_t *wakeup_counter;
uint64_t *command_counter;
#endif
+ SpiceVirtMapping preload_group_virt_mapping;
} RedWorker;
pthread_mutex_t avcodec_lock = PTHREAD_MUTEX_INITIALIZER;
@@ -1217,18 +1218,20 @@ static void cb_validate_virt(void *opaque, unsigned long virt, unsigned long fro
validate_virt((RedWorker *)opaque, virt, slot_id, add_size, group_id);
}
-static void *cb_get_virt_preload_group(void *opaque, unsigned long addr, uint32_t add_size)
+static void *op_get_virt_preload_group(SpiceVirtMapping *mapping, unsigned long addr, uint32_t add_size)
{
- return (void *)get_virt((RedWorker *)opaque, addr, add_size,
- ((RedWorker *)opaque)->preload_group_id);
+ RedWorker *worker = CONTAINEROF(mapping, RedWorker, preload_group_virt_mapping);
+ return (void *)get_virt(worker, addr, add_size,
+ worker->preload_group_id);
}
-static void cb_validate_virt_preload_group(void *opaque, unsigned long virt,
+static void op_validate_virt_preload_group(SpiceVirtMapping *mapping, unsigned long virt,
unsigned long from_addr, uint32_t add_size)
{
- int slot_id = get_memslot_id((RedWorker *)opaque, from_addr);
- validate_virt((RedWorker *)opaque, virt, slot_id, add_size,
- ((RedWorker *)opaque)->preload_group_id);
+ RedWorker *worker = CONTAINEROF(mapping, RedWorker, preload_group_virt_mapping);
+ int slot_id = get_memslot_id(worker, from_addr);
+ validate_virt(worker, virt, slot_id, add_size,
+ worker->preload_group_id);
}
char *draw_type_to_str(uint8_t type)
@@ -7491,8 +7494,7 @@ static CairoCanvas *create_cairo_context(RedWorker *worker, uint32_t width, uint
red_error("create cairo surface failed");
}
canvas = canvas_create(surface, depth, &worker->image_cache.base, NULL,
- worker, cb_get_virt_preload_group, worker,
- cb_validate_virt_preload_group);
+ &worker->preload_group_virt_mapping);
pixman_image_unref (surface);
return canvas;
}
@@ -7555,8 +7557,7 @@ static GLCanvas *create_ogl_context_common(RedWorker *worker, OGLCtx *ctx, uint3
oglctx_make_current(ctx);
if (!(canvas = gl_canvas_create(ctx, width, height, depth, &worker->image_cache.base, NULL,
- worker, cb_get_virt_preload_group,
- worker, cb_validate_virt_preload_group))) {
+ &worker->preload_group_virt_mapping))) {
return NULL;
}
@@ -9028,6 +9029,10 @@ static void red_init(RedWorker *worker, WorkerInitData *init_data)
struct epoll_event event;
RedWorkeMessage message;
int epoll;
+ static SpiceVirtMappingOps preload_group_virt_mapping_ops = {
+ op_get_virt_preload_group,
+ op_validate_virt_preload_group
+ };
ASSERT(sizeof(CursorItem) <= QXL_CURSUR_DEVICE_DATA_SIZE);
@@ -9081,6 +9086,8 @@ static void red_init(RedWorker *worker, WorkerInitData *init_data)
worker->internal_groupslot_id = init_data->internal_groupslot_id;
red_create_mem_slots(worker);
+ worker->preload_group_virt_mapping.ops = &preload_group_virt_mapping_ops;
+
message = RED_WORKER_MESSAGE_READY;
write_message(worker->channel, &message);
}