|
From: | Hailiang Zhang |
Subject: | Re: [Qemu-devel] [PATCH 3/5] colo-compare: release all unhandled packets in finalize function |
Date: | Thu, 16 Feb 2017 13:25:48 +0800 |
User-agent: | Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 |
On 2017/2/16 10:27, Zhang Chen wrote:
On 02/15/2017 04:34 PM, zhanghailiang wrote:We should release all unhandled packets before finalize colo compare. Besides, we need to free connection_track_table, or there will be a memory leak bug. Signed-off-by: zhanghailiang<address@hidden> --- net/colo-compare.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/net/colo-compare.c b/net/colo-compare.c index a16e2d5..809bad3 100644 --- a/net/colo-compare.c +++ b/net/colo-compare.c @@ -676,6 +676,23 @@ static void colo_compare_complete(UserCreatable *uc, Error **errp) return; }This function in my patch "colo-compare and filter-rewriter work with colo-frame " Named 'colo_flush_connection', I think use 'flush' instead of 'release' is better,
OK, i will fix it in next version, thanks.
Thanks Zhang Chen+static void colo_release_packets(void *opaque, void *user_data) +{ + CompareState *s = user_data; + Connection *conn = opaque; + Packet *pkt = NULL; + + while (!g_queue_is_empty(&conn->primary_list)) { + pkt = g_queue_pop_head(&conn->primary_list); + compare_chr_send(&s->chr_out, pkt->data, pkt->size); + packet_destroy(pkt, NULL); + } + while (!g_queue_is_empty(&conn->secondary_list)) { + pkt = g_queue_pop_head(&conn->secondary_list); + packet_destroy(pkt, NULL); + } +} + static void colo_compare_class_init(ObjectClass *oc, void *data) { UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc); @@ -707,9 +724,12 @@ static void colo_compare_finalize(Object *obj) g_main_loop_quit(s->compare_loop); qemu_thread_join(&s->thread); + /* Release all unhandled packets after compare thead exited */ + g_queue_foreach(&s->conn_list, colo_release_packets, s); g_queue_free(&s->conn_list); + g_hash_table_destroy(s->connection_track_table); g_free(s->pri_indev); g_free(s->sec_indev); g_free(s->outdev);
[Prev in Thread] | Current Thread | [Next in Thread] |