#include "gnunet_transport_service.h"
#include "gnunet_statistics_service.h"
+
+#define CHECK_DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
+
/**
* Final status code.
*/
static int ret;
+static int retry;
struct GNUNET_TRANSPORT_Handle *th;
struct GNUNET_CORE_Handle *ch;
static unsigned int transport_connections;
static unsigned int core_connections;
+static GNUNET_SCHEDULER_TaskIdentifier check_task;
static struct GNUNET_CONTAINER_MultiHashMap *peers;
const GNUNET_HashCode * key,
void *value)
{
+ int *fail = cls;
struct PeerContainer *pc = value;
if (pc->core_connected != pc->transport_connected)
{
GNUNET_i2s (&pc->id),
(GNUNET_YES == pc->transport_connected) ? "YES" : "NO",
(GNUNET_YES == pc->core_connected) ? "YES" : "NO");
+ (*fail) ++;
}
return GNUNET_OK;
return GNUNET_OK;
}
-static void map_check (void)
+static void
+map_cleanup (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
+ GNUNET_CONTAINER_multihashmap_iterate (peers, &map_cleanup_it, NULL);
+ GNUNET_CONTAINER_multihashmap_destroy(peers);
+}
- GNUNET_CONTAINER_multihashmap_iterate (peers, &map_check_it, NULL);
+static void
+map_check (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ int fail = 0;
+ check_task = GNUNET_SCHEDULER_NO_TASK;
+ GNUNET_CONTAINER_multihashmap_iterate (peers, &map_check_it, &fail);
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Inconsistent peers after connection consistency check: %u\n", fail);
+
+ if (NULL != cls)
+ {
+ GNUNET_SCHEDULER_add_now (cls, NULL);
+ }
}
static void
if (GNUNET_NO == pc->transport_connected)
{
pc->transport_connected = GNUNET_YES;
- return;
}
else
{
if (GNUNET_NO == pc->core_connected)
{
pc->core_connected = GNUNET_YES;
- return;
}
else
{
GNUNET_i2s (&pc->id),
"TRANSPORT", (pc->transport_connected == GNUNET_YES) ? "yes" : "no");
GNUNET_break (0);
- return;
}
}
+ if (GNUNET_SCHEDULER_NO_TASK != check_task)
+ GNUNET_SCHEDULER_cancel(check_task);
+ check_task = GNUNET_SCHEDULER_add_delayed(CHECK_DELAY, &map_check, NULL);
}
GNUNET_free (pc);
}
+ if (GNUNET_SCHEDULER_NO_TASK != check_task)
+ GNUNET_SCHEDULER_cancel(check_task);
+ check_task = GNUNET_SCHEDULER_add_delayed(CHECK_DELAY, &map_check, NULL);
+
}
ch = NULL;
}
- map_check();
-
- GNUNET_CONTAINER_multihashmap_iterate (peers, &map_cleanup_it, NULL);
- GNUNET_CONTAINER_multihashmap_destroy(peers);
+ if (GNUNET_SCHEDULER_NO_TASK != check_task)
+ {
+ GNUNET_SCHEDULER_cancel(check_task);
+ check_task = GNUNET_SCHEDULER_NO_TASK;
+ }
+ check_task = GNUNET_SCHEDULER_add_now (&map_check, &map_cleanup);
}
void
GNUNET_assert (ch != NULL);
GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &cleanup_task, NULL);
-
}