From d86115e2f6f1797adaa9a2ab8864f1feb9615dfa Mon Sep 17 00:00:00 2001
From: "Nicolas \"Pixel\" Noble" <pixel@nobis-crew.org>
Date: Fri, 20 Nov 2015 05:56:25 +0100
Subject: [PATCH] Renaming dual_stack_second_port to sibling.

---
 src/core/iomgr/tcp_server_posix.c | 26 +++++++++++++++++---------
 1 file changed, 17 insertions(+), 9 deletions(-)

diff --git a/src/core/iomgr/tcp_server_posix.c b/src/core/iomgr/tcp_server_posix.c
index 5daf406c99..1439dfcd6e 100644
--- a/src/core/iomgr/tcp_server_posix.c
+++ b/src/core/iomgr/tcp_server_posix.c
@@ -67,7 +67,6 @@
 #include <grpc/support/sync.h>
 #include <grpc/support/time.h>
 
-#define INIT_PORT_CAP 2
 #define MIN_SAFE_ACCEPT_QUEUE_SIZE 100
 
 static gpr_once s_init_max_accept_queue_size;
@@ -89,8 +88,12 @@ struct grpc_tcp_listener {
   grpc_closure destroyed_closure;
   gpr_refcount refs;
   struct grpc_tcp_listener *next;
-  struct grpc_tcp_listener *dual_stack_second_port;
-  int is_dual_stack_second_port;
+  /* When we add a listener, more than one can be created, mainly because of
+     IPv6. A sibling will still be in the normal list, but will be flagged
+     as such. Any action, such as ref or unref, will affect all of the
+     siblings in the list. */
+  struct grpc_tcp_listener *sibling;
+  int is_sibling;
 };
 
 static void unlink_if_unix_domain_socket(const struct sockaddr_un *un) {
@@ -394,8 +397,8 @@ static grpc_tcp_listener *add_socket_to_server(grpc_tcp_server *s, int fd,
     memcpy(sp->addr.untyped, addr, addr_len);
     sp->addr_len = addr_len;
     sp->port = port;
-    sp->is_dual_stack_second_port = 0;
-    sp->dual_stack_second_port = NULL;
+    sp->is_sibling = 0;
+    sp->sibling = NULL;
     gpr_ref_init(&sp->refs, 1);
     GPR_ASSERT(sp->emfd);
     gpr_mu_unlock(&s->mu);
@@ -486,8 +489,8 @@ grpc_tcp_listener *grpc_tcp_server_add_port(grpc_tcp_server *s,
     addr_len = sizeof(addr4_copy);
   }
   sp = add_socket_to_server(s, fd, addr, addr_len);
-  sp->dual_stack_second_port = sp2;
-  if (sp2) sp2->is_dual_stack_second_port = 1;
+  sp->sibling = sp2;
+  if (sp2) sp2->is_sibling = 1;
 
 done:
   gpr_free(allocated_addr);
@@ -543,9 +546,14 @@ void grpc_tcp_listener_ref(grpc_tcp_listener *listener) {
 
 void grpc_tcp_listener_unref(grpc_tcp_listener *listener) {
   grpc_tcp_listener *sp = listener;
-  if (sp->is_dual_stack_second_port) return;
+  if (sp->is_sibling) return;
   if (gpr_unref(&sp->refs)) {
-    if (sp->dual_stack_second_port) gpr_free(sp->dual_stack_second_port);
+    grpc_tcp_listener *sibling = sp->sibling;
+    while (sibling) {
+      sp = sibling;
+      sibling = sp->sibling;
+      gpr_free(sp);
+    }
     gpr_free(listener);
   }
 }
-- 
GitLab