mh,
&mh->target,
GNUNET_APPLICATION_TYPE_FS_BLOCK_TRANSFER,
- GNUNET_NO,
- GNUNET_YES);
+ GNUNET_MESH_OPTION_RELIABLE);
transmit_pending (mh);
}
/**
- * Closure for 'handle_reply'.
+ * Closure for handle_reply().
*/
struct HandleReplyClosure
{
mh,
&mh->target,
GNUNET_APPLICATION_TYPE_FS_BLOCK_TRANSFER,
- GNUNET_NO,
- GNUNET_YES);
+ GNUNET_MESH_OPTION_RELIABLE);
GNUNET_assert (mh ==
GNUNET_CONTAINER_multipeermap_get (mesh_map,
target));
mh->channel = NULL;
while (NULL != (sr = mh->pending_head))
GSF_mesh_query_cancel (sr);
+ /* first remove `mh` from the `mesh_map`, so that if the
+ callback from `free_waiting_entry()` happens to re-issue
+ the request, we don't immediately have it back in the
+ `waiting_map`. */
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_CONTAINER_multipeermap_remove (mesh_map,
+ &mh->target,
+ mh));
GNUNET_CONTAINER_multihashmap_iterate (mh->waiting_map,
&free_waiting_entry,
mh);
GNUNET_SCHEDULER_cancel (mh->timeout_task);
if (GNUNET_SCHEDULER_NO_TASK != mh->reset_task)
GNUNET_SCHEDULER_cancel (mh->reset_task);
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_remove (mesh_map,
- &mh->target,
- mh));
+ GNUNET_assert (0 ==
+ GNUNET_CONTAINER_multihashmap_size (mh->waiting_map));
GNUNET_CONTAINER_multihashmap_destroy (mh->waiting_map);
GNUNET_free (mh);
}