* Current back-off value.
*/
struct GNUNET_TIME_Relative back_off;
+
+ /**
+ * Task that tries to initiate forwarding.
+ */
+ GNUNET_SCHEDULER_TaskIdentifier start_task;
/**
*
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Closing forwarding connection (done with both directions)\n");
#endif
+ if (fc->start_task != GNUNET_SCHEDULER_NO_TASK)
+ GNUNET_SCHEDULER_cancel (scheduler,
+ fc->start_task);
if ( (NULL != fc->armClientSocket) &&
(GNUNET_SYSERR ==
GNUNET_NETWORK_socket_close (fc->armClientSocket)) )
rem).value);
#endif
rem = GNUNET_TIME_absolute_get_remaining (fc->timeout);
- GNUNET_SCHEDULER_add_delayed (scheduler,
- GNUNET_TIME_relative_min (fc->back_off,
- rem),
- &start_forwarding,
- fc);
+ GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == fc->start_task);
+ fc->start_task
+ = GNUNET_SCHEDULER_add_delayed (scheduler,
+ GNUNET_TIME_relative_min (fc->back_off,
+ rem),
+ &start_forwarding,
+ fc);
}
else
{
rem).value);
#endif
rem = GNUNET_TIME_absolute_get_remaining (fc->timeout);
- GNUNET_SCHEDULER_add_delayed (scheduler,
- GNUNET_TIME_relative_min (fc->back_off,
- rem),
- &start_forwarding,
- fc);
+ GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == fc->start_task);
+ fc->start_task
+ = GNUNET_SCHEDULER_add_delayed (scheduler,
+ GNUNET_TIME_relative_min (fc->back_off,
+ rem),
+ &start_forwarding,
+ fc);
}
else
{
struct ForwardedConnection *fc = cls;
struct GNUNET_TIME_Relative rem;
+ fc->start_task = GNUNET_SCHEDULER_NO_TASK;
if ( (NULL != tc) &&
(0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) )
{
(unsigned long long) GNUNET_TIME_relative_min (fc->back_off,
rem).value);
#endif
- GNUNET_SCHEDULER_add_delayed (scheduler,
- GNUNET_TIME_relative_min (fc->back_off,
- rem),
- &start_forwarding,
- fc);
+ GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == fc->start_task);
+ fc->start_task
+ = GNUNET_SCHEDULER_add_delayed (scheduler,
+ GNUNET_TIME_relative_min (fc->back_off,
+ rem),
+ &start_forwarding,
+ fc);
return;
}
#if DEBUG_SERVICE_MANAGER
GNUNET_TIME_UNIT_FOREVER_REL,
fc->armClientSocket,
&receiveFromClient, fc);
- start_forwarding (fc, NULL);
+ GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == fc->start_task);
+ fc->start_task
+ = GNUNET_SCHEDULER_add_now (scheduler,
+ &start_forwarding,
+ fc);
}