[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] r13593: New debugging code to figure out what is happending with soc (in tor/trunk: . src/common)



Author: nickm
Date: 2008-02-19 17:46:19 -0500 (Tue, 19 Feb 2008)
New Revision: 13593

Modified:
   tor/trunk/
   tor/trunk/src/common/compat.c
   tor/trunk/src/common/container.h
Log:
 r18221@catbus:  nickm | 2008-02-19 17:46:16 -0500
 New debugging code to figure out what is happending with socket counts.



Property changes on: tor/trunk
___________________________________________________________________
 svk:merge ticket from /tor/trunk [r18221] on 8246c3cf-6607-4228-993b-4d95d33730f1

Modified: tor/trunk/src/common/compat.c
===================================================================
--- tor/trunk/src/common/compat.c	2008-02-19 22:32:32 UTC (rev 13592)
+++ tor/trunk/src/common/compat.c	2008-02-19 22:46:19 UTC (rev 13593)
@@ -487,6 +487,12 @@
   return 0;
 }
 
+#undef DEBUG_SOCKET_COUNTING
+#ifdef DEBUG_SOCKET_COUNTING
+static bitarray_t *open_sockets = NULL;
+static int max_socket = -1;
+#endif
+
 /** Count of number of sockets currently open.  (Undercounts sockets opened by
  * eventdns and libevent.) */
 static int n_sockets_open = 0;
@@ -498,6 +504,15 @@
 tor_close_socket(int s)
 {
   int r = 0;
+#ifdef DEBUG_SOCKET_COUNTING
+  if (s > max_socket || ! bitarray_is_set(open_sockets, s)) {
+    log_warn(LD_BUG, "Closing a socket (%d) that wasn't returned by tor_open_"
+             "socket(), or that was already closed or something.", s);
+  } else {
+    tor_assert(open_sockets && s <= max_socket);
+    bitarray_clear(open_sockets, s);
+  }
+#endif
   /* On Windows, you have to call close() on fds returned by open(),
    * and closesocket() on fds returned by socket().  On Unix, everything
    * gets close()'d.  We abstract this difference by always using
@@ -536,8 +551,25 @@
 tor_open_socket(int domain, int type, int protocol)
 {
   int s = socket(domain, type, protocol);
-  if (s >= 0)
+  if (s >= 0) {
     ++n_sockets_open;
+#ifdef DEBUG_SOCKET_COUNTING
+    if (s > max_socket) {
+      if (max_socket == -1) {
+        open_sockets = bitarray_init_zero(s+128);
+        max_socket = s+128;
+      } else {
+        open_sockets = bitarray_expand(open_sockets, max_socket, s+128);
+        max_socket = s+128;
+      }
+    }
+    if (bitarray_is_set(open_sockets, s)) {
+      log_warn(LD_BUG, "I thought that %d was already open, but socket() just "
+               "gave it to me!", s);
+    }
+    bitarray_set(open_sockets, s);
+#endif
+  }
   return s;
 }
 

Modified: tor/trunk/src/common/container.h
===================================================================
--- tor/trunk/src/common/container.h	2008-02-19 22:32:32 UTC (rev 13592)
+++ tor/trunk/src/common/container.h	2008-02-19 22:46:19 UTC (rev 13593)
@@ -336,6 +336,21 @@
   size_t sz = (n_bits+BITARRAY_MASK) / (1u << BITARRAY_SHIFT);
   return tor_malloc_zero(sz*sizeof(unsigned int));
 }
+static INLINE bitarray_t *
+bitarray_expand(bitarray_t *ba, int n_bits_old, int n_bits_new)
+{
+  size_t sz_old = (n_bits_old+BITARRAY_MASK) / (1u << BITARRAY_SHIFT);
+  size_t sz_new = (n_bits_new+BITARRAY_MASK) / (1u << BITARRAY_SHIFT);
+  char *ptr;
+  if (sz_new <= sz_old)
+    return ba;
+  ptr = tor_realloc(ba, sz_new);
+  memset(ptr+sz_old, 0, sz_new-sz_old); /* This does nothing to the older
+                                         * excess bytes.  But they were
+                                         * already set to 0 by
+                                         * bitarry_init_zero. */
+  return (bitarray_t*) ptr;
+}
 /** Free the bit array <b>ba</b>. */
 static INLINE void
 bitarray_free(bitarray_t *ba)