struct FragmentationContext * frag_ctx;
+ unsigned int rc;
+
int in_destroy;
};
/**
* Task to free resources associated with a session.
*
- * @param cls the 'struct Session' to free
- * @param tc scheduler context (unused)
+ * @param s session to free
*/
static void
-free_session (void *cls,
- const struct GNUNET_SCHEDULER_TaskContext *tc)
+free_session (struct Session *s)
{
- struct Session *s = cls;
-
if (s->frag_ctx != NULL)
{
GNUNET_FRAGMENT_context_destroy(s->frag_ctx->frag);
"# UDP sessions active",
GNUNET_CONTAINER_multihashmap_size(plugin->sessions),
GNUNET_NO);
- GNUNET_SCHEDULER_add_now (&free_session, s);
- s->in_destroy = GNUNET_YES;
+ if (s->rc > 0)
+ s->in_destroy = GNUNET_YES;
+ else
+ free_session (s);
return GNUNET_OK;
}
socklen_t sender_addr_len)
{
struct SourceInformation si;
- struct Session * s = NULL;
+ struct Session * s;
struct IPv4UdpAddress u4;
struct IPv6UdpAddress u6;
const void *arg;
si.sender = msg->sender;
si.arg = arg;
si.args = args;
-
+ s->rc++;
GNUNET_SERVER_mst_receive (plugin->mst, &si, (const char *) &msg[1],
ntohs (msg->header.size) -
sizeof (struct UDPMessage), GNUNET_YES, GNUNET_NO);
+ s->rc--;
+ if ( (0 == s->rc) && (GNUNET_YES == s->in_destroy))
+ free_session (s);
}