{
struct RPS_SamplerRequestHandle *req_handle = cls;
(void) id;
+ RPS_sampler_n_rand_peers_ready_cb tmp_cb;
+ struct GNUNET_PeerIdentity *peers;
+ uint32_t num_peers;
+ void *cb_cls;
req_handle->cur_num_peers++;
LOG (GNUNET_ERROR_TYPE_DEBUG,
LOG (GNUNET_ERROR_TYPE_DEBUG,
"returning %" PRIX32 " peers to the client\n",
req_handle->num_peers);
- req_handle->callback (req_handle->ids, req_handle->num_peers, req_handle->cls);
+ /* Copy pointers and peers temporarily as they
+ * might be deleted from within the callback */
+ tmp_cb = req_handle->callback;
+ num_peers = req_handle->num_peers;
+ peers = GNUNET_new_array (num_peers, struct GNUNET_PeerIdentity);
+ GNUNET_memcpy (peers,
+ req_handle->ids,
+ num_peers * sizeof (struct GNUNET_PeerIdentity));
+ cb_cls = req_handle->cls;
RPS_sampler_request_cancel (req_handle);
+ req_handle = NULL;
+ tmp_cb (peers, num_peers, cb_cls);
+ GNUNET_free (peers);
}
}
req_handle->sampler->notify_ctx_tail,
i->notify_ctx);
GNUNET_free (i->notify_ctx);
+ i->notify_ctx = NULL;
}
GNUNET_free (i);
}
GNUNET_free (req_handle->ids);
+ req_handle->ids = NULL;
GNUNET_CONTAINER_DLL_remove (req_handle->sampler->req_handle_head,
req_handle->sampler->req_handle_tail,
req_handle);
{
struct GNUNET_RPS_Request_Handle *rh = cls;
+ rh->sampler_rh = NULL;
rh->ready_cb (rh->ready_cb_cls,
num_peers,
peers);
- // TODO cleanup, sampler, rh, cancel stuff
- // TODO screw this function. We can give the cb,cls directly to the sampler.
+ GNUNET_RPS_stream_cancel (rh->srh);
+ rh->srh = NULL;
+ RPS_sampler_destroy (rh->sampler);
+ rh->sampler = NULL;
}
GNUNET_RPS_stream_cancel (struct GNUNET_RPS_StreamRequestHandle *srh)
{
struct GNUNET_RPS_Handle *rps_handle;
- struct GNUNET_RPS_StreamRequestHandle *srh_iter;
+ GNUNET_assert (NULL != srh);
rps_handle = srh->rps_handle;
- srh_iter = rps_handle->stream_requests_head;
- while (NULL != srh_iter && srh_iter != srh) srh_iter = srh_iter->next;
- if (NULL != srh_iter)
- {
- GNUNET_CONTAINER_DLL_remove (rps_handle->stream_requests_head,
- rps_handle->stream_requests_tail,
- srh);
- GNUNET_free (srh);
- }
+ GNUNET_CONTAINER_DLL_remove (rps_handle->stream_requests_head,
+ rps_handle->stream_requests_tail,
+ srh);
+ GNUNET_free (srh);
if (NULL == rps_handle->stream_requests_head) cancel_stream (rps_handle);
}
struct GNUNET_RPS_Handle *h = cls;
const struct GNUNET_PeerIdentity *peers;
uint64_t num_peers;
+ struct GNUNET_RPS_StreamRequestHandle *srh_iter;
+ struct GNUNET_RPS_StreamRequestHandle *srh_next;
peers = (struct GNUNET_PeerIdentity *) &msg[1];
num_peers = ntohl (msg->num_peers);
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Received %" PRIu64 " peer(s) from stream input.\n",
num_peers);
- for (struct GNUNET_RPS_StreamRequestHandle *srh_iter = h->stream_requests_head;
- NULL != srh_iter;
- srh_iter = srh_iter->next)
+ srh_iter = h->stream_requests_head;
+ while (NULL != srh_iter)
{
LOG (GNUNET_ERROR_TYPE_DEBUG, "Calling srh \n");
+ /* Store next pointer - srh might be removed/freed in callback */
+ srh_next = srh_iter->next;
srh_iter->ready_cb (srh_iter->ready_cb_cls,
num_peers,
peers);
+ srh_iter = srh_next;
}
if (NULL == h->stream_requests_head)