[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