[Spice-devel] [PATCH 04/18] server/red_worker: add free cb to EventHandler
Alon Levy
alevy at redhat.com
Mon Feb 7 10:19:54 PST 2011
Added cb takes care of non zero offset embedded EventHandler, which happens
now with the introduced CommonChannel.
---
server/red_worker.c | 19 ++++++++++++++++++-
1 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/server/red_worker.c b/server/red_worker.c
index ba04a72..0ed46e9 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -218,9 +218,11 @@ double inline stat_byte_to_mega(uint64_t size)
typedef struct EventListener EventListener;
typedef void (*event_listener_action_proc)(EventListener *ctx, uint32_t events);
+typedef void (*event_listener_free_proc)(EventListener *ctx);
struct EventListener {
uint32_t refs;
event_listener_action_proc action;
+ event_listener_free_proc free;
};
enum {
@@ -9319,6 +9321,13 @@ static void red_receive(RedChannel *channel)
}
}
+static void free_common_channel_from_listener(EventListener *ctx)
+{
+ CommonChannel* common = SPICE_CONTAINEROF(ctx, CommonChannel, listener);
+
+ free(common);
+}
+
static RedChannel *__new_channel(RedWorker *worker, int size, uint32_t channel_id,
RedsStreamContext *peer, int migrate,
event_listener_action_proc handler,
@@ -9356,6 +9365,7 @@ static RedChannel *__new_channel(RedWorker *worker, int size, uint32_t channel_i
channel->parser = spice_get_client_channel_parser(channel_id, NULL);
common->listener.refs = 1;
common->listener.action = handler;
+ common->listener.free = free_common_channel_from_listener;
channel->disconnect = disconnect;
channel->hold_item = hold_item;
channel->release_item = release_item;
@@ -10187,6 +10197,11 @@ static void handle_dev_input(EventListener *listener, uint32_t events)
}
}
+static void handle_dev_free(EventListener *ctx)
+{
+ free(ctx);
+}
+
static void red_init(RedWorker *worker, WorkerInitData *init_data)
{
struct epoll_event event;
@@ -10202,6 +10217,7 @@ static void red_init(RedWorker *worker, WorkerInitData *init_data)
worker->pending = init_data->pending;
worker->dev_listener.refs = 1;
worker->dev_listener.action = handle_dev_input;
+ worker->dev_listener.free = handle_dev_free;
worker->cursor_visible = TRUE;
ASSERT(init_data->num_renderers > 0);
worker->num_renderers = init_data->num_renderers;
@@ -10313,7 +10329,8 @@ void *red_worker_main(void *arg)
continue;
}
}
- free(evt_listener);
+ red_printf("freeing event listener");
+ evt_listener->free(evt_listener);
}
if (worker.running) {
--
1.7.4
More information about the Spice-devel
mailing list