/*
This file is part of GNUnet.
- (C) 2009, 2010, 2011 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2009, 2010, 2011 GNUnet e.V.
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
You should have received a copy of the GNU General Public License
along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
*/
/**
*/
struct GNUNET_TIME_Absolute timeout;
+ /**
+ * Task run on timeout.
+ */
+ struct GNUNET_SCHEDULER_Task * timeout_task;
+
/**
* Associated value.
*/
/**
* Task doing exponential back-off trying to reconnect.
*/
- GNUNET_SCHEDULER_TaskIdentifier backoff_task;
+ struct GNUNET_SCHEDULER_Task * backoff_task;
/**
* Time for next connect retry.
static void
free_action_item (struct GNUNET_STATISTICS_GetHandle *gh)
{
+ if (NULL != gh->timeout_task)
+ {
+ GNUNET_SCHEDULER_cancel (gh->timeout_task);
+ gh->timeout_task = NULL;
+ }
GNUNET_free_non_null (gh->subsystem);
GNUNET_free_non_null (gh->name);
GNUNET_free (gh);
h->current = NULL;
if ( (NULL != c->cont) &&
(GNUNET_YES != c->aborted) )
+ {
c->cont (c->cls, GNUNET_SYSERR);
+ c->cont = NULL;
+ }
free_action_item (c);
}
if (NULL != h->client)
struct GNUNET_STATISTICS_GetHandle *gn;
unsigned int i;
- if (GNUNET_SCHEDULER_NO_TASK != h->backoff_task)
+ if (NULL != h->backoff_task)
return GNUNET_NO;
if (NULL != h->client)
return GNUNET_YES;
* We've waited long enough, reconnect now.
*
* @param cls the `struct GNUNET_STATISTICS_Handle` to reconnect
- * @param tc scheduler context (unused)
*/
static void
-reconnect_task (void *cls,
- const struct GNUNET_SCHEDULER_TaskContext *tc)
+reconnect_task (void *cls)
{
struct GNUNET_STATISTICS_Handle *h = cls;
- h->backoff_task = GNUNET_SCHEDULER_NO_TASK;
+ h->backoff_task = NULL;
schedule_action (h);
}
* Task used by 'reconnect_later' to shutdown the handle
*
* @param cls the statistics handle
- * @param tc scheduler context
*/
static void
-do_destroy (void *cls,
- const struct GNUNET_SCHEDULER_TaskContext *tc)
+do_destroy (void *cls)
{
struct GNUNET_STATISTICS_Handle *h = cls;
int loss;
struct GNUNET_STATISTICS_GetHandle *gh;
- GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == h->backoff_task);
+ GNUNET_assert (NULL == h->backoff_task);
if (GNUNET_YES == h->do_destroy)
{
/* So we are shutting down and the service is not reachable.
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
_("Could not save some persistent statistics\n"));
h->do_destroy = GNUNET_NO;
- GNUNET_SCHEDULER_add_continuation (&do_destroy, h,
- GNUNET_SCHEDULER_REASON_PREREQ_DONE);
+ GNUNET_SCHEDULER_add_now (&do_destroy, h);
return;
}
h->backoff_task =
* Task used to destroy the statistics handle.
*
* @param cls the `struct GNUNET_STATISTICS_Handle`
- * @param tc the scheduler context
*/
static void
-destroy_task (void *cls,
- const struct GNUNET_SCHEDULER_TaskContext *tc)
+destroy_task (void *cls)
{
struct GNUNET_STATISTICS_Handle *h = cls;
return;
}
h->do_destroy = GNUNET_NO;
- GNUNET_SCHEDULER_add_continuation (&destroy_task, h,
- GNUNET_SCHEDULER_REASON_PREREQ_DONE);
+ GNUNET_SCHEDULER_add_now (&destroy_task, h);
break;
case GNUNET_MESSAGE_TYPE_STATISTICS_END:
LOG (GNUNET_ERROR_TYPE_DEBUG,
h->current = NULL;
schedule_action (h);
if (NULL != c->cont)
+ {
c->cont (c->cls, GNUNET_OK);
+ c->cont = NULL;
+ }
free_action_item (c);
return;
case GNUNET_MESSAGE_TYPE_STATISTICS_VALUE:
if (NULL == h)
return;
GNUNET_assert (GNUNET_NO == h->do_destroy); // Don't call twice.
- if (GNUNET_SCHEDULER_NO_TASK != h->backoff_task)
+ if (NULL != h->backoff_task)
{
GNUNET_SCHEDULER_cancel (h->backoff_task);
- h->backoff_task = GNUNET_SCHEDULER_NO_TASK;
+ h->backoff_task = NULL;
}
if (sync_first)
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
_("Failed to receive acknowledgement from statistics service, some statistics might have been lost!\n"));
h->do_destroy = GNUNET_NO;
- GNUNET_SCHEDULER_add_continuation (&destroy_task, h,
- GNUNET_SCHEDULER_REASON_PREREQ_DONE);
+ GNUNET_SCHEDULER_add_now (&destroy_task, h);
return 0;
}
hdr.type = htons (GNUNET_MESSAGE_TYPE_TEST);
struct GNUNET_TIME_Relative timeout;
if ( (NULL != h->th) ||
- (GNUNET_SCHEDULER_NO_TASK != h->backoff_task) )
+ (NULL != h->backoff_task) )
return; /* action already pending */
if (GNUNET_YES != try_connect (h))
{
}
+/**
+ * We have run into a timeout on a #GNUNET_STATISTICS_get() operation,
+ * call the continuation.
+ *
+ * @param cls the `struct GNUNET_STATISTICS_GetHandle`
+ */
+static void
+run_get_timeout (void *cls)
+{
+ struct GNUNET_STATISTICS_GetHandle *gh = cls;
+ GNUNET_STATISTICS_Callback cont = gh->cont;
+ void *cont_cls = gh->cls;
+
+ gh->timeout_task = NULL;
+ GNUNET_STATISTICS_get_cancel (gh);
+ cont (cont_cls, GNUNET_SYSERR);
+}
+
+
/**
* Get statistic from the peer.
*
ai->timeout = GNUNET_TIME_relative_to_absolute (timeout);
ai->type = ACTION_GET;
ai->msize = slen1 + slen2 + sizeof (struct GNUNET_MessageHeader);
- GNUNET_CONTAINER_DLL_insert_tail (handle->action_head, handle->action_tail,
+ ai->timeout_task = GNUNET_SCHEDULER_add_delayed (timeout,
+ &run_get_timeout,
+ ai);
+ GNUNET_CONTAINER_DLL_insert_tail (handle->action_head,
+ handle->action_tail,
ai);
schedule_action (handle);
return ai;
{
if (NULL == gh)
return;
+ if (NULL != gh->timeout_task)
+ {
+ GNUNET_SCHEDULER_cancel (gh->timeout_task);
+ gh->timeout_task = NULL;
+ }
gh->cont = NULL;
if (gh->sh->current == gh)
{