- avoid crashing on shutdown in the middle of a test (timeout)
authorBart Polot <bart@net.in.tum.de>
Thu, 11 Oct 2012 23:25:05 +0000 (23:25 +0000)
committerBart Polot <bart@net.in.tum.de>
Thu, 11 Oct 2012 23:25:05 +0000 (23:25 +0000)
src/mesh/gnunet-service-mesh.c

index acfd215fa9cc809191ab1f5ec224d92771671346..c58a25d2308166690fabec63cbc678cf55486b89 100644 (file)
@@ -205,6 +205,11 @@ struct MeshPeerInfo
      */
   struct GNUNET_TIME_Absolute last_contact;
 
+    /**
+     * Task handler for delayed connect task;
+     */
+  GNUNET_SCHEDULER_TaskIdentifier connect_task;
+
     /**
      * Number of attempts to reconnect so far
      */
@@ -2616,6 +2621,8 @@ peer_info_connect_task (void *cls,
 {
   struct MeshPathInfo *path_info = cls;
 
+  path_info->peer->connect_task = GNUNET_SCHEDULER_NO_TASK;
+
   if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
   {
     GNUNET_free (cls);
@@ -2663,6 +2670,10 @@ peer_info_destroy (struct MeshPeerInfo *pi)
     path_destroy (p);
     p = nextp;
   }
+  if (GNUNET_SCHEDULER_NO_TASK != pi->connect_task)
+  {
+    GNUNET_free (GNUNET_SCHEDULER_cancel (pi->connect_task));
+  }
   GNUNET_free (pi);
   return GNUNET_OK;
 }
@@ -3242,7 +3253,8 @@ tunnel_notify_client_peer_disconnected (void *cls, GNUNET_PEER_Id peer_id)
   path_info = GNUNET_malloc (sizeof (struct MeshPathInfo));
   path_info->peer = peer;
   path_info->t = t;
-  GNUNET_SCHEDULER_add_now (&peer_info_connect_task, path_info);
+  peer->connect_task = GNUNET_SCHEDULER_add_now (&peer_info_connect_task,
+                                                 path_info);
 }