gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r21085 - gnunet/src/stream


From: gnunet
Subject: [GNUnet-SVN] r21085 - gnunet/src/stream
Date: Mon, 23 Apr 2012 00:16:39 +0200

Author: harsha
Date: 2012-04-23 00:16:39 +0200 (Mon, 23 Apr 2012)
New Revision: 21085

Modified:
   gnunet/src/stream/stream_api.c
Log:
-task cancellations in tunnel cleaner

Modified: gnunet/src/stream/stream_api.c
===================================================================
--- gnunet/src/stream/stream_api.c      2012-04-22 21:50:09 UTC (rev 21084)
+++ gnunet/src/stream/stream_api.c      2012-04-22 22:16:39 UTC (rev 21085)
@@ -212,6 +212,16 @@
   struct GNUNET_MESH_TransmitHandle *transmit_handle;
 
   /**
+   * The current act transmit handle (if a pending ack transmit request exists)
+   */
+  struct GNUNET_MESH_TransmitHandle *ack_transmit_handle;
+
+  /**
+   * Pointer to the current ack message using in ack_task
+   */
+  struct GNUNET_STREAM_AckMessage *ack_msg;
+
+  /**
    * The current message associated with the transmit handle
    */
   struct MessageQueue *queue_head;
@@ -630,7 +640,7 @@
 static size_t
 send_ack_notify (void *cls, size_t size, void *buf)
 {
-  struct GNUNET_STREAM_AckMessage *ack_msg = cls;
+  struct GNUNET_STREAM_Socket *socket = cls;
 
   if (0 == size)
     {
@@ -638,10 +648,14 @@
                   "%s called with size 0\n", __func__);
       return 0;
     }
-  GNUNET_assert (ntohs (ack_msg->header.header.size) <= size);
+  GNUNET_assert (ntohs (socket->ack_msg->header.header.size) <= size);
   
-  size = ntohs (ack_msg->header.header.size);
-  memcpy (buf, ack_msg, size);
+  size = ntohs (socket->ack_msg->header.header.size);
+  memcpy (buf, socket->ack_msg, size);
+  
+  GNUNET_free (socket->ack_msg);
+  socket->ack_msg = NULL;
+  socket->ack_transmit_handle = NULL;
   return size;
 }
 
@@ -708,18 +722,18 @@
   ack_msg->receive_window_remaining = 
     htonl (RECEIVE_BUFFER_SIZE - socket->receive_buffer_size);
 
+  socket->ack_msg = ack_msg;
   GNUNET_PEER_resolve (socket->other_peer, &target);
   /* Request MESH for sending ACK */
-  GNUNET_MESH_notify_transmit_ready (socket->tunnel,
-                                     0, /* Corking */
-                                     1, /* Priority */
-                                     socket->retransmit_timeout,
-                                     &target,
-                                     ntohs (ack_msg->header.header.size),
-                                     &send_ack_notify,
-                                     ack_msg);
-
-  
+  socket->ack_transmit_handle = 
+    GNUNET_MESH_notify_transmit_ready (socket->tunnel,
+                                       0, /* Corking */
+                                       1, /* Priority */
+                                       socket->retransmit_timeout,
+                                       &target,
+                                       ntohs (ack_msg->header.header.size),
+                                       &send_ack_notify,
+                                       socket);
 }
 
 
@@ -1662,7 +1676,7 @@
             }
 
           GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                      "%x: Received TRAMSMIT_CLOSE_ACK from %x\n",
+                      "%x: Received TRANSMIT_CLOSE_ACK from %x\n",
                       socket->our_id,
                       socket->other_peer);
           socket->state = STATE_TRANSMIT_CLOSED;
@@ -2706,7 +2720,11 @@
                 void *tunnel_ctx)
 {
   struct GNUNET_STREAM_Socket *socket = tunnel_ctx;
-  
+
+  if (tunnel != socket->tunnel)
+    return;
+
+  GNUNET_break_op(0);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "%x: Peer %x has terminated connection abruptly\n",
               socket->our_id,
@@ -2720,6 +2738,25 @@
       GNUNET_MESH_notify_transmit_ready_cancel (socket->transmit_handle);
       socket->transmit_handle = NULL;
     }
+  if (NULL != socket->ack_transmit_handle)
+    {
+      GNUNET_MESH_notify_transmit_ready_cancel (socket->ack_transmit_handle);
+      GNUNET_free (socket->ack_msg);
+      socket->ack_msg = NULL;
+      socket->ack_transmit_handle = NULL;
+    }
+  /* Stop Tasks using socket->tunnel */
+  if (GNUNET_SCHEDULER_NO_TASK != socket->ack_task_id)
+    {
+      GNUNET_SCHEDULER_cancel (socket->ack_task_id);
+      socket->ack_task_id = GNUNET_SCHEDULER_NO_TASK;
+    }
+  if (GNUNET_SCHEDULER_NO_TASK != socket->retransmission_timeout_task_id)
+    {
+      GNUNET_SCHEDULER_cancel (socket->retransmission_timeout_task_id);
+      socket->retransmission_timeout_task_id = GNUNET_SCHEDULER_NO_TASK;
+    }
+  /* FIXME: Cancel all other tasks using socket->tunnel */
   socket->tunnel = NULL;
 }
 
@@ -2789,7 +2826,7 @@
                                       10,  /* QUEUE size as parameter? */
                                       socket, /* cls */
                                       NULL, /* No inbound tunnel handler */
-                                      &tunnel_cleaner, /* FIXME: not required? 
*/
+                                      NULL, /* No in-tunnel cleaner */
                                       client_message_handlers,
                                       ports); /* We don't get inbound tunnels 
*/
   if (NULL == socket->mesh)   /* Fail if we cannot connect to mesh */
@@ -2952,6 +2989,13 @@
       GNUNET_MESH_notify_transmit_ready_cancel (socket->transmit_handle);
       socket->transmit_handle = NULL;
     }
+  if (NULL != socket->ack_transmit_handle)
+    {
+      GNUNET_MESH_notify_transmit_ready_cancel (socket->ack_transmit_handle);
+      GNUNET_free (socket->ack_msg);
+      socket->ack_msg = NULL;
+      socket->ack_transmit_handle = NULL;
+    }
 
   /* Clear existing message queue */
   while (NULL != (head = socket->queue_head)) {




reply via email to

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