summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2010-11-07 14:53:49 +0200
committerAlon Levy <alevy@redhat.com>2010-11-07 18:51:28 +0200
commitc325cc83ab8da77c6b0b0c1b2179f9660fe4a899 (patch)
tree40ff1b6fe5a43cf3dd16e1172652e627c93f796f
parentc62ea7d263cc3110ae82f203126714ae0657547d (diff)
downloadspice-c325cc83ab8da77c6b0b0c1b2179f9660fe4a899.tar.gz
spice-c325cc83ab8da77c6b0b0c1b2179f9660fe4a899.tar.xz
spice-c325cc83ab8da77c6b0b0c1b2179f9660fe4a899.zip
server/red_worker: add free cb to EventHandler
Added cb takes care of non zero offset embedded EventHandler, which happens now with the introduced CommonChannel.
-rw-r--r--server/red_worker.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/server/red_worker.c b/server/red_worker.c
index 2f4abb80..59fa6ec2 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 {
@@ -9330,6 +9332,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,
@@ -9367,6 +9376,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;
@@ -10198,6 +10208,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;
@@ -10213,6 +10228,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;
@@ -10324,7 +10340,8 @@ void *red_worker_main(void *arg)
continue;
}
}
- free(evt_listener);
+ red_printf("freeing event listener");
+ evt_listener->free(evt_listener);
}
if (worker.running) {