* Unused entries are also NULL.
*/
struct Session **session_array;
+
+ /**
+ * Task to trigger reconnect.
+ */
+ GNUNET_SCHEDULER_TaskIdentifier task;
/**
* Size of the session array.
reconnect (struct GNUNET_ATS_SchedulingHandle *sh);
+
+/**
+ * Re-establish the connection to the ATS service.
+ *
+ * @param cls handle to use to re-connect.
+ * @param tc scheduler context
+ */
+static void
+reconnect_task (void *cls,
+ const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ struct GNUNET_ATS_SchedulingHandle *sh = cls;
+
+ sh->task = GNUNET_SCHEDULER_NO_TASK;
+ reconnect (sh);
+}
+
+
/**
* Transmit messages from the message queue to the service
* (if there are any, and if we are not already trying).
{
GNUNET_CLIENT_disconnect (sh->client, GNUNET_NO);
sh->client = NULL;
- reconnect (sh);
+ sh->task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
+ &reconnect_task, sh);
return;
}
if ( (ntohs (msg->type) != GNUNET_MESSAGE_TYPE_ATS_ADDRESS_SUGGESTION) ||
GNUNET_break (0);
GNUNET_CLIENT_disconnect (sh->client, GNUNET_NO);
sh->client = NULL;
- reconnect (sh);
+ sh->task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
+ &reconnect_task, sh);
return;
}
m = (const struct AddressSuggestionMessage*) msg;
GNUNET_break (0);
GNUNET_CLIENT_disconnect (sh->client, GNUNET_NO);
sh->client = NULL;
- reconnect (sh);
+ sh->task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
+ &reconnect_task, sh);
return;
}
sh->suggest_cb (sh->suggest_cb_cls,
p);
GNUNET_free (p);
}
- GNUNET_CLIENT_disconnect (sh->client, GNUNET_NO);
+ if (NULL != sh->client)
+ {
+ GNUNET_CLIENT_disconnect (sh->client, GNUNET_NO);
+ sh->client = NULL;
+ }
+ if (GNUNET_SCHEDULER_NO_TASK != sh->task)
+ {
+ GNUNET_SCHEDULER_cancel (sh->task);
+ sh->task = GNUNET_SCHEDULER_NO_TASK;
+ }
GNUNET_array_grow (sh->session_array,
sh->session_array_size,
0);