gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r13675 - gnunet/src/core


From: gnunet
Subject: [GNUnet-SVN] r13675 - gnunet/src/core
Date: Sun, 14 Nov 2010 07:59:21 +0100

Author: grothoff
Date: 2010-11-14 07:59:21 +0100 (Sun, 14 Nov 2010)
New Revision: 13675

Modified:
   gnunet/src/core/core_api.c
   gnunet/src/core/test_core_api_start_only.c
Log:
fix

Modified: gnunet/src/core/core_api.c
===================================================================
--- gnunet/src/core/core_api.c  2010-11-14 06:08:56 UTC (rev 13674)
+++ gnunet/src/core/core_api.c  2010-11-14 06:59:21 UTC (rev 13675)
@@ -133,7 +133,8 @@
 
   /**
    * Function to run after successful transmission (or call with
-   * reason 'TIMEOUT' on error).
+   * reason 'TIMEOUT' on error); called with scheduler context 'NULL'
+   * on disconnect.
    */
   GNUNET_SCHEDULER_Task cont;
 
@@ -452,6 +453,8 @@
 static void
 reconnect_later (struct GNUNET_CORE_Handle *h)
 {
+  struct ControlMessage *cm;
+
   if (h->client != NULL)
     {
       GNUNET_CLIENT_disconnect (h->client, GNUNET_NO);
@@ -461,6 +464,14 @@
                                             h);
     }
   h->currently_down = GNUNET_YES;
+  while (NULL != (cm = h->pending_head))
+    {
+      GNUNET_CONTAINER_DLL_remove (h->pending_head,
+                                  h->pending_tail,
+                                  cm);
+      cm->cont (cm->cont_cls, NULL);
+      GNUNET_free (cm);
+    }
   GNUNET_assert (h->reconnect_task == GNUNET_SCHEDULER_NO_TASK);
   h->retry_backoff = GNUNET_TIME_relative_min (GNUNET_TIME_UNIT_SECONDS,
                                               h->retry_backoff);
@@ -798,7 +809,7 @@
       if (ntohs (msg->size) != sizeof (struct InitReplyMessage))
        {
          GNUNET_break (0);
-         reconnect (h);
+         reconnect_later (h);
          return;
        }
       m = (const struct InitReplyMessage *) msg;
@@ -829,7 +840,8 @@
       if (msize != sizeof (struct ConnectNotifyMessage))
         {
           GNUNET_break (0);
-          break;
+         reconnect_later (h);
+         return;
         }
       cnm = (const struct ConnectNotifyMessage *) msg;
 #if DEBUG_CORE
@@ -842,7 +854,7 @@
       if (pr != NULL)
        {
          GNUNET_break (0);
-         reconnect (h);
+         reconnect_later (h);
          return;
        }
       pr = GNUNET_malloc (sizeof (struct PeerRecord));
@@ -862,7 +874,8 @@
       if (msize != sizeof (struct DisconnectNotifyMessage))
         {
           GNUNET_break (0);
-          break;
+         reconnect_later (h);
+         return;
         }
       dnm = (const struct DisconnectNotifyMessage *) msg;
 #if DEBUG_CORE
@@ -875,7 +888,7 @@
       if (pr == NULL)
        {
          GNUNET_break (0);
-         reconnect (h);
+         reconnect_later (h);
          return;
        }
       trigger = ( (pr->prev != NULL) ||
@@ -894,7 +907,8 @@
       if (msize != sizeof (struct PeerStatusNotifyMessage))
         {
           GNUNET_break (0);
-          break;
+         reconnect_later (h);
+         return;
         }
       psnm = (const struct PeerStatusNotifyMessage *) msg;
 #if DEBUG_CORE
@@ -907,7 +921,7 @@
       if (pr == NULL)
        {
          GNUNET_break (0);
-         reconnect (h);
+         reconnect_later (h);
          return;
        }
       h->status_events (h->cls,
@@ -923,7 +937,8 @@
           sizeof (struct GNUNET_MessageHeader))
         {
           GNUNET_break (0);
-          break;
+         reconnect_later (h);
+         return;
         }
       ntm = (const struct NotifyTrafficMessage *) msg;
       em = (const struct GNUNET_MessageHeader *) &ntm[1];
@@ -939,14 +954,15 @@
       if (pr == NULL)
        {
          GNUNET_break (0);
-         reconnect (h);
+         reconnect_later (h);
          return;
        }
       if ((GNUNET_NO == h->inbound_hdr_only) &&
           (msize != ntohs (em->size) + sizeof (struct NotifyTrafficMessage)))
         {
           GNUNET_break (0);
-          break;
+         reconnect_later (h);
+         return;
         }
       et = ntohs (em->type);
       for (hpos = 0; hpos < h->hcnt; hpos++)
@@ -978,7 +994,8 @@
           sizeof (struct GNUNET_MessageHeader))
         {
           GNUNET_break (0);
-          break;
+         reconnect_later (h);
+         return;
         }
       ntm = (const struct NotifyTrafficMessage *) msg;
       em = (const struct GNUNET_MessageHeader *) &ntm[1];
@@ -987,7 +1004,7 @@
       if (pr == NULL)
        {
          GNUNET_break (0);
-         reconnect (h);
+         reconnect_later (h);
          return;
        }
 #if DEBUG_CORE
@@ -999,7 +1016,8 @@
           (msize != ntohs (em->size) + sizeof (struct NotifyTrafficMessage)))
         {
           GNUNET_break (0);
-          break;
+         reconnect_later (h);
+         return;
         }
       if (NULL == h->outbound_notify)
         {
@@ -1013,7 +1031,8 @@
       if (msize != sizeof (struct SendMessageReady))
         {
           GNUNET_break (0);
-          break;
+         reconnect_later (h);
+         return;
         }
       smr = (const struct SendMessageReady *) msg;
       pr = GNUNET_CONTAINER_multihashmap_get (h->peers,
@@ -1021,7 +1040,7 @@
       if (pr == NULL)
        {
          GNUNET_break (0);
-         reconnect (h);
+         reconnect_later (h);
          return;
        }
 #if DEBUG_CORE
@@ -1042,7 +1061,7 @@
        {
          /* we should not already be on the ready list... */
          GNUNET_break (0);
-         reconnect (h);
+         reconnect_later (h);
          return;
        }
       GNUNET_CONTAINER_DLL_insert (h->ready_peer_head,
@@ -1054,7 +1073,8 @@
       if (ntohs (msg->size) != sizeof (struct ConfigurationInfoMessage))
        {
          GNUNET_break (0);
-         break;
+         reconnect_later (h);
+         return;
        }
       cim = (const struct ConfigurationInfoMessage*) msg;
 #if DEBUG_CORE
@@ -1067,7 +1087,7 @@
       if (pr == NULL)
        {
          GNUNET_break (0);
-         reconnect (h);
+         reconnect_later (h);
          return;
        }
       if (pr->rim_id != ntohl (cim->rim_id))
@@ -1082,11 +1102,11 @@
              GNUNET_ntohll (cim->preference));
       break;
     default:
-      GNUNET_break (0);
-      break;
+      reconnect_later (h);
+      return;
     }
   GNUNET_CLIENT_receive (h->client,
-                         &main_notify_handler, h, 
+                        &main_notify_handler, h, 
                         GNUNET_TIME_UNIT_FOREVER_REL);
 }
 
@@ -1104,6 +1124,8 @@
 {
   struct GNUNET_CORE_Handle *h = cls;
 
+  if (tc == NULL)
+    return; /* error */
   if (0 == (tc->reason & GNUNET_SCHEDULER_REASON_PREREQ_DONE))
     {
 #if DEBUG_CORE
@@ -1140,15 +1162,8 @@
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Reconnecting to CORE service\n");
 #endif
-  if (h->client != NULL)
-    {
-      GNUNET_CLIENT_disconnect (h->client, GNUNET_NO);
-      h->client = NULL;
-      GNUNET_CONTAINER_multihashmap_iterate (h->peers,
-                                            &disconnect_and_free_peer_entry,
-                                            h);
-    }
-  h->currently_down = GNUNET_YES;
+  GNUNET_assert (h->client == NULL);
+  GNUNET_assert (h->currently_down == GNUNET_YES);
   h->client = GNUNET_CLIENT_connect ("core", h->cfg);
   if (h->client == NULL)
     {
@@ -1246,6 +1261,7 @@
   h->outbound_hdr_only = outbound_hdr_only;
   h->handlers = handlers;
   h->hcnt = 0;
+  h->currently_down = GNUNET_YES;
   h->peers = GNUNET_CONTAINER_multihashmap_create (128);
   h->retry_backoff = GNUNET_TIME_UNIT_MILLISECONDS;
   while (handlers[h->hcnt].callback != NULL)
@@ -1298,6 +1314,7 @@
       GNUNET_CONTAINER_DLL_remove (handle->pending_head,
                                   handle->pending_tail,
                                   cm);
+      cm->cont (cm->cont_cls, NULL);
       GNUNET_free (cm);
     }
   GNUNET_CONTAINER_multihashmap_iterate (handle->peers,
@@ -1497,7 +1514,6 @@
 };
 
 
-
 /**
  * Continuation called when the control message was transmitted.
  * Calls the original continuation and frees the remaining
@@ -1513,7 +1529,13 @@
   struct GNUNET_CORE_PeerRequestHandle *ret = cls;
   
   if (ret->cont != NULL)
-    ret->cont (ret->cont_cls, tc);
+    {
+      if (tc == NULL)
+       GNUNET_SCHEDULER_add_now (ret->cont,
+                                 ret->cont_cls);
+      else
+       ret->cont (ret->cont_cls, tc);
+    }
   GNUNET_free (ret);
 }
 

Modified: gnunet/src/core/test_core_api_start_only.c
===================================================================
--- gnunet/src/core/test_core_api_start_only.c  2010-11-14 06:08:56 UTC (rev 
13674)
+++ gnunet/src/core/test_core_api_start_only.c  2010-11-14 06:59:21 UTC (rev 
13675)
@@ -103,7 +103,20 @@
 };
 
 
+static void
+shutdown_task (void *cls, 
+              const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  GNUNET_CORE_disconnect (p1.ch);
+  p1.ch = NULL;
+  GNUNET_CORE_disconnect (p2.ch);
+  p2.ch = NULL;
+  ok = 0;
+}
 
+
+
+
 static void
 init_notify (void *cls,
              struct GNUNET_CORE_Handle *server,
@@ -130,10 +143,8 @@
   else
     {
       GNUNET_assert (cls == &p2);
-      GNUNET_CORE_disconnect (p1.ch);
-      GNUNET_CORE_disconnect (p2.ch);
       GNUNET_SCHEDULER_cancel (timeout_task_id);
-      ok = 0;
+      GNUNET_SCHEDULER_add_now (&shutdown_task, NULL);
     }
 }
 




reply via email to

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