From 4e7459e8e12c9688805ec7c628ca8e9bb19a56e5 Mon Sep 17 00:00:00 2001
From: Andre Noll <maan@systemlinux.org>
Date: Sun, 11 Jan 2009 03:34:33 +0100
Subject: [PATCH] Simplify udp_send.c.

It's enough to loop only once over all targets.
---
 udp_send.c | 63 +++++++++++++++++++++++++-----------------------------
 1 file changed, 29 insertions(+), 34 deletions(-)

diff --git a/udp_send.c b/udp_send.c
index 1408ae7f..e83239d3 100644
--- a/udp_send.c
+++ b/udp_send.c
@@ -68,14 +68,41 @@ static void udp_delete_target(struct udp_target *ut, const char *msg)
 	free(ut);
 }
 
+#define UDP_CQ_BYTES 40000
+
+static int udp_init_session(struct udp_target *ut)
+{
+	int ret;
+
+	if (ut->fd >= 0) /* nothing to do */
+		return 0;
+	ret = create_udp_send_socket(TARGET_ADDR(ut), ut->port,
+		conf.udp_ttl_arg);
+	if (ret < 0)
+		return ret;
+	ut->fd = ret;
+	ret = mark_fd_nonblocking(ut->fd);
+	if (ret < 0) {
+		close(ut->fd);
+		return ret;
+	}
+	add_close_on_fork_list(ut->fd);
+	ut->cq = cq_new(UDP_CQ_BYTES);
+	PARA_NOTICE_LOG("sending to udp %s:%d\n", TARGET_ADDR(ut), ut->port);
+	return 1;
+}
+
 static void udp_send_buf(char *buf, size_t len)
 {
 	struct udp_target *ut, *tmp;
 	int ret;
 
 	list_for_each_entry_safe(ut, tmp, &targets, node) {
-		if (ut->fd < 0)
+		ret = udp_init_session(ut);
+		if (ret < 0) {
+			udp_delete_target(ut, para_strerror(-ret));
 			continue;
+		}
 		ret = send_queued_chunks(ut->fd, ut->cq, 0);
 		if (ret < 0) {
 			udp_delete_target(ut, para_strerror(-ret));
@@ -105,30 +132,6 @@ static void udp_send_buf(char *buf, size_t len)
 	}
 }
 
-#define UDP_CQ_BYTES 40000
-
-static int udp_init_session(struct udp_target *ut)
-{
-	int ret;
-
-	if (ut->fd >= 0) /* nothing to do */
-		return 0;
-	PARA_NOTICE_LOG("sending to udp %s:%d\n", TARGET_ADDR(ut), ut->port);
-	ret = create_udp_send_socket(TARGET_ADDR(ut), ut->port,
-		conf.udp_ttl_arg);
-	if (ret < 0)
-		return ret;
-	ut->fd = ret;
-	ret = mark_fd_nonblocking(ut->fd);
-	if (ret < 0) {
-		close(ut->fd);
-		return ret;
-	}
-	add_close_on_fork_list(ut->fd);
-	ut->cq = cq_new(UDP_CQ_BYTES);
-	return 1;
-}
-
 static void udp_shutdown_targets(void)
 {
 	char buf[UDP_AUDIO_HEADER_LEN];
@@ -162,16 +165,13 @@ static void udp_send(long unsigned current_chunk, __a_unused long unsigned chunk
 		const char *buf, size_t len, const char *header_buf,
 		size_t header_len)
 {
-	struct udp_target *ut, *tmp;
 	size_t sendbuf_len;
 	uint8_t packet_type = UDP_DATA_PACKET;
-	int ret;
 	char *sendbuf;
 	struct timeval *chunk_tv;
 	uint8_t stream_type = header_len? UDP_HEADER_STREAM : UDP_PLAIN_STREAM;
 
-//	PARA_NOTICE_LOG("header_len: %zd, header_buf: %p\n", header_len,
-//		header_buf);
+//	PARA_NOTICE_LOG("len: %zd, header_len: %zd\n", len, header_len);
 	if (sender_status != SENDER_ON)
 		return;
 
@@ -181,11 +181,6 @@ static void udp_send(long unsigned current_chunk, __a_unused long unsigned chunk
 		return;
 	if (list_empty(&targets))
 		return;
-	list_for_each_entry_safe(ut, tmp, &targets, node) {
-		ret = udp_init_session(ut);
-		if (ret < 0)
-			udp_delete_target(ut, para_strerror(-ret));
-	}
 	if (!need_extra_header(current_chunk))
 		header_len = 0;
 	if (!current_chunk)
-- 
2.39.5