gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r14688 - gnunet/src/peerinfo


From: gnunet
Subject: [GNUnet-SVN] r14688 - gnunet/src/peerinfo
Date: Mon, 21 Mar 2011 15:54:33 +0100

Author: grothoff
Date: 2011-03-21 15:54:33 +0100 (Mon, 21 Mar 2011)
New Revision: 14688

Modified:
   gnunet/src/peerinfo/peerinfo_api_notify.c
Log:
make peerinfo notify api more robust to serious disconnects

Modified: gnunet/src/peerinfo/peerinfo_api_notify.c
===================================================================
--- gnunet/src/peerinfo/peerinfo_api_notify.c   2011-03-21 14:44:50 UTC (rev 
14687)
+++ gnunet/src/peerinfo/peerinfo_api_notify.c   2011-03-21 14:54:33 UTC (rev 
14688)
@@ -62,6 +62,11 @@
    */
   const struct GNUNET_CONFIGURATION_Handle *cfg;
 
+  /**
+   * Tasked used for delayed re-connection attempt.
+   */
+  GNUNET_SCHEDULER_TaskIdentifier task;
+
 };
 
 
@@ -86,6 +91,32 @@
 
 
 /**
+ * Task to re-try connecting to peerinfo.
+ *
+ * @param cls the 'struct GNUNET_PEERINFO_NotifyContext'
+ * @param tc scheduler context
+ */ 
+static void
+reconnect (void *cls,
+          const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  struct GNUNET_PEERINFO_NotifyContext *nc = cls;
+
+  nc->task = GNUNET_SCHEDULER_NO_TASK;
+  nc->client = GNUNET_CLIENT_connect ("peerinfo", nc->cfg);
+  if (NULL == nc->client)
+    {
+      /* ugh */
+      nc->task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
+                                              &reconnect,
+                                              nc);
+      return; 
+    }
+  request_notifications (nc);
+}
+
+
+/**
  * Receive a peerinfo information message, process it and
  * go for more.
  *
@@ -105,8 +136,7 @@
   if (msg == NULL)
     {
       GNUNET_CLIENT_disconnect (nc->client, GNUNET_NO);
-      nc->client = GNUNET_CLIENT_connect ("peerinfo", nc->cfg);
-      request_notifications (nc);
+      reconnect (nc, NULL);
       return;
     }
   ms = ntohs (msg->size);
@@ -259,7 +289,10 @@
       GNUNET_CLIENT_notify_transmit_ready_cancel (nc->init);
       nc->init = NULL;
     }
-  GNUNET_CLIENT_disconnect (nc->client, GNUNET_NO);
+  if (NULL != nc->client)
+    GNUNET_CLIENT_disconnect (nc->client, GNUNET_NO);
+  if (GNUNET_SCHEDULER_NO_TASK != nc->task)
+    GNUNET_SCHEDULER_cancel (nc->task);
   GNUNET_free (nc);
 }
 




reply via email to

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