- log
[oweals/gnunet.git] / src / mesh / gnunet-service-mesh_tunnel.c
index e30c8cd978dba1d9a2b55fe0fbcfc4ccdff2e7d3..a13d88fd53ad3a9ea3111eb5d973cd49fbc1e3f8 100644 (file)
@@ -395,7 +395,7 @@ get_connection_allowed (const struct MeshTConnection *tc)
  * @return GNUNET_OK if message is fine, GNUNET_SYSERR otherwise.
  */
 int
-check_ephemeral (struct MeshTunnel3 *t, 
+check_ephemeral (struct MeshTunnel3 *t,
                  const struct GNUNET_MESH_KX_Ephemeral *msg)
 {
   /* Check message size */
@@ -866,6 +866,27 @@ rekey (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 }
 
 
+/**
+ * Called only on shutdown, destroy every tunnel.
+ *
+ * @param cls Closure (unused).
+ * @param key Current public key.
+ * @param value Value in the hash map (tunnel).
+ *
+ * @return #GNUNET_YES, so we should continue to iterate,
+ */
+static int
+destroy_iterator (void *cls,
+                const struct GNUNET_PeerIdentity *key,
+                void *value)
+{
+  struct MeshTunnel3 *t = value;
+
+  GMT_destroy (t);
+  return GNUNET_YES;
+}
+
+
 /**
  * Demultiplex data per channel and call appropriate channel handler.
  *
@@ -1397,6 +1418,7 @@ GMT_shutdown (void)
     GNUNET_SCHEDULER_cancel (rekey_task);
     rekey_task = GNUNET_SCHEDULER_NO_TASK;
   }
+  GNUNET_CONTAINER_multipeermap_iterate (tunnels, &destroy_iterator, NULL);
   GNUNET_CONTAINER_multipeermap_destroy (tunnels);
 }
 
@@ -1601,6 +1623,7 @@ GMT_destroy_empty (struct MeshTunnel3 *t)
 {
   struct MeshTConnection *iter;
 
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "Tunnel empty: destroying scheduled\n");
   for (iter = t->connection_head; NULL != iter; iter = iter->next)
   {
     GMC_send_destroy (iter->c);
@@ -1639,21 +1662,30 @@ GMT_destroy_if_empty (struct MeshTunnel3 *t)
 void
 GMT_destroy (struct MeshTunnel3 *t)
 {
-  struct MeshTConnection *iter;
-  struct MeshTConnection *next;
+  struct MeshTConnection *iter_c;
+  struct MeshTConnection *next_c;
+  struct MeshTChannel *iter_ch;
+  struct MeshTChannel *next_ch;
 
   if (NULL == t)
     return;
 
   LOG (GNUNET_ERROR_TYPE_DEBUG, "destroying tunnel %s\n", GMP_2s (t->peer));
 
-//   if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (tunnels, &t->id, t))
-//     GNUNET_break (0);
+  GNUNET_break (GNUNET_YES ==
+                GNUNET_CONTAINER_multipeermap_remove (tunnels,
+                                                      GMP_get_id (t->peer), t));
 
-  for (iter = t->connection_head; NULL != iter; iter = next)
+  for (iter_c = t->connection_head; NULL != iter_c; iter_c = next_c)
+  {
+    next_c = iter_c->next;
+    GMC_destroy (iter_c->c);
+  }
+  for (iter_ch = t->channel_head; NULL != iter_ch; iter_ch = next_ch)
   {
-    next = iter->next;
-    GMC_destroy (iter->c);
+    next_ch = iter_ch->next;
+    GMCH_destroy (iter_ch->ch);
+    /* Should only happen on shutdown, but it's ok. */
   }
 
   GNUNET_STATISTICS_update (stats, "# tunnels", -1, GNUNET_NO);
@@ -1933,7 +1965,7 @@ GMT_send_connection_acks (struct MeshTunnel3 *t)
   unsigned int cs;
   unsigned int buffer;
 
-  LOG (GNUNET_ERROR_TYPE_DEBUG, 
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
        "Tunnel send connection ACKs on %s\n",
        GMT_2s (t));
 
@@ -1988,7 +2020,7 @@ GMT_send_connection_acks (struct MeshTunnel3 *t)
  * @param fwd Was this a FWD going message?
  * @param size Size of the message.
  */
-static void 
+static void
 message_sent (void *cls,
               struct MeshConnection *c,
               struct MeshConnectionQueue *q,
@@ -2098,7 +2130,7 @@ GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
     (void) GMC_send_prebuilt_message (&msg->header, c, fwd, NULL, NULL);
     return NULL;
   }
-  q = GNUNET_new (struct MeshTunnel3Queue);
+  q = GNUNET_new (struct MeshTunnel3Queue); /* FIXME valgrind: leak*/
   q->q = GMC_send_prebuilt_message (&msg->header, c, fwd, &message_sent, q);
   q->cont = cont;
   q->cont_cls = cont_cls;
@@ -2196,4 +2228,4 @@ GMT_2s (const struct MeshTunnel3 *t)
     return "(NULL)";
 
   return GMP_2s (t->peer);
-}
\ No newline at end of file
+}