gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r22753 - gnunet/src/mesh


From: gnunet
Subject: [GNUnet-SVN] r22753 - gnunet/src/mesh
Date: Wed, 18 Jul 2012 16:58:15 +0200

Author: bartpolot
Date: 2012-07-18 16:58:15 +0200 (Wed, 18 Jul 2012)
New Revision: 22753

Modified:
   gnunet/src/mesh/gnunet-service-mesh.c
Log:
- let tunnel empty queue before destroying

Modified: gnunet/src/mesh/gnunet-service-mesh.c
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh.c       2012-07-18 14:13:30 UTC (rev 
22752)
+++ gnunet/src/mesh/gnunet-service-mesh.c       2012-07-18 14:58:15 UTC (rev 
22753)
@@ -328,14 +328,21 @@
     /**
      * How many messages are in the queue.
      */
-   unsigned int queue_n;
+  unsigned int queue_n;
 
     /**
      * How many messages do we accept in the queue.
      */
-   unsigned int queue_max;
+  unsigned int queue_max;
 
     /**
+     * Flag to signal the destruction of the tunnel.
+     * If this is set GNUNET_YES the tunnel will be destroyed
+     * when the queue is empty.
+     */
+   int destroy;
+
+    /**
      * Last time the tunnel was used
      */
   struct GNUNET_TIME_Absolute timestamp;
@@ -3428,6 +3435,7 @@
 {
     struct MeshPeerInfo *peer = cls;
     struct MeshPeerQueue *queue;
+    struct MeshTunnel *t;
     size_t data_size;
 
     peer->core_transmit = NULL;
@@ -3486,11 +3494,19 @@
             GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "*********   type unknown\n");
             data_size = 0;
     }
-    queue->tunnel->queue_n--;
 
+    t = queue->tunnel;
+    t->queue_n--;
+
     /* Free queue, but cls was freed by send_core_* */
     queue_destroy(queue, GNUNET_NO);
 
+    if (GNUNET_YES == t->destroy && 0 == t->queue_n)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "*********  destroying tunnel!\n");
+      tunnel_destroy (t);
+    }
+
     /* If more data in queue, send next */
     if (NULL != peer->queue_head)
     {
@@ -3911,7 +3927,8 @@
     send_clients_tunnel_destroy (t);
   }
   tunnel_send_destroy (t);
-  tunnel_destroy (t);
+  t->destroy = GNUNET_YES;
+  // TODO: add timeout to destroy the tunnel anyway
   return GNUNET_OK;
 }
 
@@ -5010,7 +5027,8 @@
   /* Don't try to ACK the client about the tunnel_destroy multicast packet */
   t->owner = NULL;
   tunnel_send_destroy (t);
-  tunnel_destroy (t);
+  t->destroy = GNUNET_YES;
+  // The tunnel will be destroyed when the last message is transmitted.
   GNUNET_SERVER_receive_done (client, GNUNET_OK);
   return;
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]