*/
static struct GNUNET_TRANSPORT_Blacklist *blacklist;
+/**
+ * Task scheduled to try to add peers.
+ */
+static GNUNET_SCHEDULER_TaskIdentifier add_task;
+
/**
* Flag to disallow non-friend connections (pure F2F mode).
*/
pos);
}
if ( (GNUNET_NO == pos->is_friend) &&
- (GNUNET_NO == pos->is_connected) )
+ (GNUNET_NO == pos->is_connected) &&
+ (NULL == pos->hello) )
{
free_peer (NULL, &pos->pid.hashPubKey, pos);
return;
void *buf);
-
-
/**
* Closure for 'find_advertisable_hello'.
*/
}
+/**
+ * Last task run during shutdown. Disconnects us from
+ * the transport and core.
+ *
+ * @param cls unused, NULL
+ * @param tc scheduler context
+ */
+static void
+add_peer_task (void *cls,
+ const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ add_task = GNUNET_SCHEDULER_NO_TASK;
+
+ GNUNET_CONTAINER_multihashmap_iterate (peers,
+ &try_add_peers,
+ NULL);
+}
+
/**
* Method called whenever a peer disconnects.
*
friend_count,
GNUNET_NO);
}
- if ( (connection_count < target_connection_count) ||
- (friend_count < minimum_friend_count) )
- GNUNET_CONTAINER_multihashmap_iterate (peers,
- &try_add_peers,
- NULL);
+ if ( ( (connection_count < target_connection_count) ||
+ (friend_count < minimum_friend_count) ) &&
+ (GNUNET_SCHEDULER_NO_TASK == add_task) )
+ add_task = GNUNET_SCHEDULER_add_now (&add_peer_task, NULL);
if ( (friend_count < minimum_friend_count) &&
(blacklist == NULL) )
blacklist = GNUNET_TRANSPORT_blacklist (cfg,
struct Peer *pos;
if (err_msg != NULL)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Error in communication with PEERINFO service\n"));
- /* return; */
- }
-
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ _("Error in communication with PEERINFO service: %s\n"),
+ err_msg);
+ GNUNET_PEERINFO_notify_cancel (peerinfo_notify);
+ peerinfo_notify = GNUNET_PEERINFO_notify (cfg, &process_peer,
+ NULL);
+ return;
+ }
GNUNET_assert (peer != NULL);
if (0 == memcmp (&my_identity,
peer, sizeof (struct GNUNET_PeerIdentity)))
GNUNET_PEERINFO_notify_cancel (peerinfo_notify);
peerinfo_notify = NULL;
}
+ if (GNUNET_SCHEDULER_NO_TASK != add_task)
+ {
+ GNUNET_SCHEDULER_cancel (add_task);
+ add_task = GNUNET_SCHEDULER_NO_TASK;
+ }
GNUNET_TRANSPORT_disconnect (transport);
transport = NULL;
GNUNET_CONTAINER_multihashmap_iterate (peers,