}
}
+int
+delegpt_addr_on_result_list(struct delegpt* dp, struct delegpt_addr* find)
+{
+ struct delegpt_addr* a = dp->result_list;
+ while(a) {
+ if(a == find)
+ return 1;
+ a = a->next_result;
+ }
+ return 0;
+}
+
+void
+delegpt_usable_list_remove_addr(struct delegpt* dp, struct delegpt_addr* del)
+{
+ struct delegpt_addr* usa = dp->usable_list, *prev = NULL;
+ while(usa) {
+ if(usa == del) {
+ /* snip off the usable list */
+ if(prev)
+ prev->next_usable = usa->next_usable;
+ else dp->usable_list = usa->next_usable;
+ return;
+ }
+ prev = usa;
+ usa = usa->next_usable;
+ }
+}
+
+void
+delegpt_add_to_result_list(struct delegpt* dp, struct delegpt_addr* a)
+{
+ if(delegpt_addr_on_result_list(dp, a))
+ return;
+ delegpt_usable_list_remove_addr(dp, a);
+ a->next_result = dp->result_list;
+ dp->result_list = a;
+}
+
void
delegpt_add_unused_targets(struct delegpt* dp)
{
/** get memory in use by dp */
size_t delegpt_get_mem(struct delegpt* dp);
+/**
+ * See if the addr is on the result list.
+ * @param dp: delegation point.
+ * @param find: the pointer is searched for on the result list.
+ * @return 1 if found, 0 if not found.
+ */
+int delegpt_addr_on_result_list(struct delegpt* dp, struct delegpt_addr* find);
+
+/**
+ * Remove the addr from the usable list.
+ * @param dp: the delegation point.
+ * @param del: the addr to remove from the list, the pointer is searched for.
+ */
+void delegpt_usable_list_remove_addr(struct delegpt* dp,
+ struct delegpt_addr* del);
+
+/**
+ * Add the delegpt_addr back to the result list, if it is not already on
+ * the result list. Also removes it from the usable list.
+ * @param dp: delegation point.
+ * @param a: addr to add, nothing happens if it is already on the result list.
+ * It is removed from the usable list.
+ */
+void delegpt_add_to_result_list(struct delegpt* dp, struct delegpt_addr* a);
+
#endif /* ITERATOR_ITER_DELEGPT_H */
for(a=dp->target_list; a; a = a->next_target) {
if(a->attempts >= outbound_msg_retry) {
/* add back to result list */
- a->next_result = dp->result_list;
- dp->result_list = a;
+ delegpt_add_to_result_list(dp, a);
}
if(a->attempts > d)
a->attempts -= d;