Forráskód Böngészése

flatiron: Free outq items list on conn exit

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Reviewed-by: Fabio M. Di Nitto <fdinitto@redhat.com>
Jan Friesse 13 éve
szülő
commit
4cdaf8ef1e
1 módosított fájl, 25 hozzáadás és 0 törlés
  1. 25 0
      exec/coroipcs.c

+ 25 - 0
exec/coroipcs.c

@@ -163,6 +163,8 @@ static int shared_mem_dispatch_bytes_left (const struct conn_info *conn_info);
 
 
 static void outq_flush (struct conn_info *conn_info);
 static void outq_flush (struct conn_info *conn_info);
 
 
+static void outq_destroy (struct conn_info *conn_info);
+
 static int priv_change (struct conn_info *conn_info);
 static int priv_change (struct conn_info *conn_info);
 
 
 static void ipc_disconnect (struct conn_info *conn_info);
 static void ipc_disconnect (struct conn_info *conn_info);
@@ -567,6 +569,12 @@ static inline int conn_info_destroy (struct conn_info *conn_info)
 	if (conn_info->private_data) {
 	if (conn_info->private_data) {
 		api->free (conn_info->private_data);
 		api->free (conn_info->private_data);
 	}
 	}
+
+	/*
+	 * Free outq list
+	 */
+	outq_destroy(conn_info);
+
 	close (conn_info->fd);
 	close (conn_info->fd);
 	res = circular_memory_unmap (conn_info->dispatch_buffer, conn_info->dispatch_size);
 	res = circular_memory_unmap (conn_info->dispatch_buffer, conn_info->dispatch_size);
 	zcb_all_free (conn_info);
 	zcb_all_free (conn_info);
@@ -1260,6 +1268,23 @@ static void msg_send (void *conn, const struct iovec *iov, unsigned int iov_len,
 	ipc_sem_post (conn_info->control_buffer, SEMAPHORE_DISPATCH);
 	ipc_sem_post (conn_info->control_buffer, SEMAPHORE_DISPATCH);
 }
 }
 
 
+static void outq_destroy (struct conn_info *conn_info) {
+	struct list_head *list, *list_next;
+	struct outq_item *outq_item;
+
+	for (list = conn_info->outq_head.next;
+		list != &conn_info->outq_head; list = list_next) {
+
+		list_next = list->next;
+		outq_item = list_entry (list, struct outq_item, list);
+		list_del (list);
+		api->free (outq_item->msg);
+		api->free (outq_item);
+	}
+
+	list_init (&conn_info->outq_head);
+}
+
 static void outq_flush (struct conn_info *conn_info) {
 static void outq_flush (struct conn_info *conn_info) {
 	struct list_head *list, *list_next;
 	struct list_head *list, *list_next;
 	struct outq_item *outq_item;
 	struct outq_item *outq_item;