gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r15044 - gnunet/src/transport


From: gnunet
Subject: [GNUnet-SVN] r15044 - gnunet/src/transport
Date: Wed, 20 Apr 2011 10:31:54 +0200

Author: grothoff
Date: 2011-04-20 10:31:54 +0200 (Wed, 20 Apr 2011)
New Revision: 15044

Modified:
   gnunet/src/transport/plugin_transport_wlan.c
Log:
fixing shutdown

Modified: gnunet/src/transport/plugin_transport_wlan.c
===================================================================
--- gnunet/src/transport/plugin_transport_wlan.c        2011-04-20 08:29:52 UTC 
(rev 15043)
+++ gnunet/src/transport/plugin_transport_wlan.c        2011-04-20 08:31:54 UTC 
(rev 15044)
@@ -780,7 +780,7 @@
   struct Plugin * plugin = cls;
   plugin->server_write_delay_task = GNUNET_SCHEDULER_NO_TASK;
 
-  if ( (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) != 0)
+  if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
     return;
 
   // GNUNET_TIME_UNIT_FOREVER_REL is needed to clean up old msg
@@ -893,8 +893,9 @@
     }
   else
     {
-      plugin->server_write_delay_task = GNUNET_SCHEDULER_add_delayed(next_send,
-          &delay_fragment_task, plugin);
+      plugin->server_write_delay_task 
+       = GNUNET_SCHEDULER_add_delayed(next_send,
+                                      &delay_fragment_task, plugin);
     }
 }
 
@@ -1353,39 +1354,42 @@
 
 //TODO DOXIGEN
 static void
-finish_sending(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+finish_sending(void *cls, 
+              const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
-  struct Finish_send * finish;
+  struct Finish_send * finish = cls;
   struct Plugin * plugin;
   ssize_t bytes;
 
-  finish = cls;
   plugin = finish->plugin;
-
   plugin->server_write_task = GNUNET_SCHEDULER_NO_TASK;
 
-  bytes = GNUNET_DISK_file_write(plugin->server_stdin_handle,
-      finish->msgheader, finish->size);
-  GNUNET_assert(bytes != GNUNET_SYSERR);
+  if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
+    {
+      GNUNET_free (finish->msgstart);
+      GNUNET_free (finish);
+      return;
+    }
+  bytes = GNUNET_DISK_file_write (plugin->server_stdin_handle,
+                                 finish->msgheader, 
+                                 finish->size);
+  GNUNET_assert (bytes != GNUNET_SYSERR);
 
   if (bytes != finish->size)
     {
-
       finish->msgheader = finish->msgheader + bytes;
       finish->size = finish->size - bytes;
-      plugin->server_write_task = GNUNET_SCHEDULER_add_write_file(
-          GNUNET_TIME_UNIT_FOREVER_REL, plugin->server_stdin_handle,
-          &finish_sending, finish);
+      plugin->server_write_task 
+       = GNUNET_SCHEDULER_add_write_file(GNUNET_TIME_UNIT_FOREVER_REL,
+                                         plugin->server_stdin_handle,
+                                         &finish_sending, finish);
     }
   else
     {
       GNUNET_free(finish->msgstart);
       GNUNET_free(finish);
-
       set_next_send(plugin);
-
     }
-
 }
 
 /**
@@ -1397,11 +1401,10 @@
 static void
 do_transmit(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
-
   struct Plugin * plugin = cls;
-  plugin->server_write_task = GNUNET_SCHEDULER_NO_TASK;
 
-  if (tc->reason == GNUNET_SCHEDULER_REASON_SHUTDOWN)
+  plugin->server_write_task = GNUNET_SCHEDULER_NO_TASK;
+  if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
     return;
 
   struct Session * session;
@@ -1409,7 +1412,6 @@
   struct ieee80211_frame * ieeewlanheader;
   struct Radiotap_Send * radioHeader;
   struct GNUNET_MessageHeader * msgheader;
-
   struct FragmentationHeader fragheader;
   struct FragmentationHeader * fragheaderptr;
   struct Finish_send * finish;
@@ -1435,9 +1437,7 @@
   if (GNUNET_TIME_absolute_get_remaining(plugin->beacon_time).rel_value == 0)
     {
       send_hello_beacon(plugin);
-
       return;
-
     }
 
   fm = GNUNET_CONTAINER_heap_peek(plugin->pending_Fragment_Messages);
@@ -1920,20 +1920,14 @@
         {
           plugin->pendingsessions--;
           GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions_head,
-              plugin->pending_Sessions_tail, pendingsession);
+                                      plugin->pending_Sessions_tail, 
+                                      pendingsession);
           GNUNET_free(pendingsession);
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-      "Remove session %p from pending session queue\n", queue->content
-      );
-
-
-          if (check == 1)
-            {
-              GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
-                  "Session is more then once in pending session\n");
-            }
-
+         GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+                    "Remove session %p from pending session queue\n", 
+                    queue->content);
+          GNUNET_assert (check == 0);
           check = 1;
         }
       pendingsession = pendingsession_tmp;
@@ -1969,13 +1963,13 @@
       GNUNET_free(pm);
     }
 
-  GNUNET_CONTAINER_DLL_remove(plugin->sessions, plugin->sessions_tail, queue);
+  GNUNET_CONTAINER_DLL_remove(plugin->sessions, 
+                             plugin->sessions_tail, 
+                             queue);
   GNUNET_free(queue->content);
   GNUNET_free(queue);
   plugin->session_count--;
-
   check_fragment_queue(plugin);
-
 }
 
 /**
@@ -2046,26 +2040,7 @@
   asc(asc_cls, ret);
 }
 
-/**
- * function to check if bitfield is representation of fragments of the message
- * @param rec_message message to check
- */
 
-void
-check_message_fragment_bitfield(struct Receive_Message_Queue * rx_msg)
-{
-  uint64_t checkfragments = 0;
-  struct Receive_Fragment_Queue * rx_frag = rx_msg->frag_head;
-
-  while (rx_frag != NULL)
-    {
-      setBit((char*) &checkfragments, rx_frag->num);
-      rx_frag = rx_frag->next;
-
-    }
-  GNUNET_assert(checkfragments == rx_msg->received_fragments);
-}
-
 /**
  * Function to test if fragment number already exists in the fragments received
  *
@@ -2073,8 +2048,7 @@
  * @param fh Fragmentheader of the fragment
  * @return GNUNET_YES if fragment exists already, GNUNET_NO if it does not 
exists in the queue of the session
  */
-
-static const int
+static int
 is_double_msg(struct Receive_Message_Queue * rx_msg,
     struct FragmentationHeader * fh)
 {
@@ -2093,7 +2067,6 @@
  * @param session session the fragment belongs to
  * @param rec_queue fragment to add
  */
-
 static void
 insert_fragment_in_queue(struct Receive_Message_Queue * rx_message,
     struct Receive_Fragment_Queue * rx_frag)
@@ -2884,7 +2857,7 @@
   struct Plugin *plugin = cls;
   plugin->server_read_task = GNUNET_SCHEDULER_NO_TASK;
 
-  if ( (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) != 0)
+  if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
     return;
 
   char mybuf[WLAN_MTU + sizeof(struct GNUNET_MessageHeader)];
@@ -2993,8 +2966,32 @@
       "libgnunet_plugin_transport_wlan_done started\n");
 #endif
 
-  GNUNET_assert(cls !=NULL);
+  GNUNET_assert (cls !=NULL);
+  //free sessions
+  while (queue != NULL)
+    {
+      queue_next = queue->next;
+      free_session(plugin, queue);
+      queue = queue_next;
 
+    }
+  if (plugin->server_write_delay_task != GNUNET_SCHEDULER_NO_TASK)
+    {
+      GNUNET_SCHEDULER_cancel(plugin->server_write_delay_task);
+      plugin->server_write_delay_task = GNUNET_SCHEDULER_NO_TASK;
+    }
+  if (plugin->server_write_task != GNUNET_SCHEDULER_NO_TASK)
+    {
+      GNUNET_SCHEDULER_cancel(plugin->server_write_task);
+      plugin->server_write_task = GNUNET_SCHEDULER_NO_TASK;
+    }
+  if (plugin->server_read_task != GNUNET_SCHEDULER_NO_TASK)
+    {
+      GNUNET_SCHEDULER_cancel(plugin->server_read_task);
+      plugin->server_read_task = GNUNET_SCHEDULER_NO_TASK;
+    }
+
+
   if (plugin->suid_tokenizer != NULL)
     GNUNET_SERVER_mst_destroy(plugin->suid_tokenizer);
 
@@ -3014,15 +3011,6 @@
           plugin->pending_Fragment_Messages);
     }
 
-  //free sessions
-  while (queue != NULL)
-    {
-      queue_next = queue->next;
-      free_session(plugin, queue);
-      queue = queue_next;
-
-    }
-
   GNUNET_free_non_null(plugin->interface);
   GNUNET_CONTAINER_heap_destroy(plugin->pending_Fragment_Messages);
   GNUNET_free (plugin);




reply via email to

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