[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r21237 - in gnunet/src: hostlist peerinfo
From: |
gnunet |
Subject: |
[GNUnet-SVN] r21237 - in gnunet/src: hostlist peerinfo |
Date: |
Thu, 3 May 2012 11:24:06 +0200 |
Author: grothoff
Date: 2012-05-03 11:24:06 +0200 (Thu, 03 May 2012)
New Revision: 21237
Modified:
gnunet/src/hostlist/hostlist-server.c
gnunet/src/peerinfo/peerinfo_api.c
Log:
-fixing #2298
Modified: gnunet/src/hostlist/hostlist-server.c
===================================================================
--- gnunet/src/hostlist/hostlist-server.c 2012-05-03 08:23:35 UTC (rev
21236)
+++ gnunet/src/hostlist/hostlist-server.c 2012-05-03 09:24:06 UTC (rev
21237)
@@ -89,6 +89,18 @@
static struct GNUNET_PEERINFO_Handle *peerinfo;
/**
+ * Set if we are allowed to advertise our hostlist to others.
+ */
+static int advertising;
+
+/**
+ * Buffer for the hostlist address
+ */
+static char *hostlist_uri;
+
+
+
+/**
* Context for host processor.
*/
struct HostSet
@@ -98,24 +110,15 @@
char *data;
};
-/**
- * Set if we are allowed to advertise our hostlist to others.
- */
-static int advertising;
-/**
- * Buffer for the hostlist address
- */
-static char *hostlist_uri;
-
/**
* Function that assembles our response.
*/
static void
finish_response (struct HostSet *results)
{
- if (response != NULL)
+ if (NULL != response)
MHD_destroy_response (response);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Creating hostlist response with %u bytes\n",
@@ -123,7 +126,7 @@
response =
MHD_create_response_from_data (results->size, results->data, MHD_YES,
MHD_NO);
- if ((daemon_handle_v4 == NULL) && (daemon_handle_v6 == NULL))
+ if ((NULL == daemon_handle_v4) && (NULL == daemon_handle_v6))
{
MHD_destroy_response (response);
response = NULL;
@@ -173,7 +176,7 @@
size_t s;
int has_addr;
- if (err_msg != NULL)
+ if (NULL != err_msg)
{
GNUNET_assert (NULL == peer);
pitr = NULL;
@@ -182,13 +185,13 @@
err_msg);
return;
}
- if (peer == NULL)
+ if (NULL == peer)
{
pitr = NULL;
finish_response (results);
return;
}
- if (hello == NULL)
+ if (NULL == hello)
return;
has_addr = GNUNET_NO;
GNUNET_HELLO_iterate_addresses (hello, GNUNET_NO, &check_has_addr,
&has_addr);
@@ -270,7 +273,7 @@
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, _("Sending 100 CONTINUE reply\n"));
return MHD_YES; /* send 100 continue */
}
- if (*upload_data_size != 0)
+ if (0 != *upload_data_size)
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
_("Refusing `%s' request with %llu bytes of upload data\n"),
@@ -281,7 +284,7 @@
GNUNET_YES);
return MHD_NO; /* do not support upload data */
}
- if (response == NULL)
+ if (NULL == response)
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
_
@@ -309,13 +312,12 @@
adv_transmit_ready (void *cls, size_t size, void *buf)
{
static uint64_t hostlist_adv_count;
-
size_t transmission_size;
size_t uri_size; /* Including \0 termination! */
struct GNUNET_MessageHeader header;
char *cbuf;
- if (buf == NULL)
+ if (NULL == buf)
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Transmission failed, buffer invalid!\n");
@@ -359,7 +361,7 @@
if (!advertising)
return;
- if (hostlist_uri == NULL)
+ if (NULL == hostlist_uri)
return;
size = strlen (hostlist_uri) + 1;
if (size + sizeof (struct GNUNET_MessageHeader) >=
@@ -400,6 +402,7 @@
/* nothing to do */
}
+
/**
* PEERINFO calls this function to let us know about a possible peer
* that we might want to connect to.
@@ -417,19 +420,20 @@
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Peerinfo is notifying us to rebuild our hostlist\n");
- if (err_msg != NULL)
- {
+ if (NULL != err_msg)
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Error in communication with PEERINFO service\n"));
- /* return; */
- }
+ _("Error in communication with PEERINFO service: %s\n"),
+ err_msg);
+ if (NULL != pitr)
+ return; /* re-build already in progress ... */
results = GNUNET_malloc (sizeof (struct HostSet));
- GNUNET_assert (peerinfo != NULL);
+ GNUNET_assert (NULL != peerinfo);
pitr =
GNUNET_PEERINFO_iterate (peerinfo, NULL, GNUNET_TIME_UNIT_MINUTES,
&host_processor, results);
}
+
/**
* Function that queries MHD's select sets and
* starts the task waiting for them.
@@ -541,7 +545,7 @@
cfg = c;
stats = st;
peerinfo = GNUNET_PEERINFO_connect (cfg);
- if (peerinfo == NULL)
+ if (NULL == peerinfo)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
_("Could not access PEERINFO service. Exiting.\n"));
@@ -551,7 +555,7 @@
GNUNET_CONFIGURATION_get_value_number (cfg, "HOSTLIST", "HTTPPORT",
&port))
return GNUNET_SYSERR;
- if ((port == 0) || (port > UINT16_MAX))
+ if ((0 == port) || (port > UINT16_MAX))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
_("Invalid port number %llu. Exiting.\n"), port);
@@ -590,7 +594,7 @@
}
else
ip = NULL;
- if (ip != NULL)
+ if (NULL != ip)
{
if (1 == inet_pton (AF_INET, ip, &i4))
{
@@ -656,7 +660,7 @@
sa,
MHD_OPTION_END);
- if ((daemon_handle_v6 == NULL) && (daemon_handle_v4 == NULL))
+ if ((NULL == daemon_handle_v6) && (NULL == daemon_handle_v4))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
_("Could not start hostlist HTTP server on port %u\n"),
@@ -672,7 +676,7 @@
if (daemon_handle_v6 != NULL)
hostlist_task_v6 = prepare_daemon (daemon_handle_v6);
- notify = GNUNET_PEERINFO_notify (cfg, process_notify, NULL);
+ notify = GNUNET_PEERINFO_notify (cfg, &process_notify, NULL);
return GNUNET_OK;
}
@@ -685,11 +689,6 @@
GNUNET_HOSTLIST_server_stop ()
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Hostlist server shutdown\n");
- if (NULL != notify)
- {
- GNUNET_PEERINFO_notify_cancel (notify);
- notify = NULL;
- }
if (GNUNET_SCHEDULER_NO_TASK != hostlist_task_v6)
{
GNUNET_SCHEDULER_cancel (hostlist_task_v6);
@@ -700,11 +699,6 @@
GNUNET_SCHEDULER_cancel (hostlist_task_v4);
hostlist_task_v4 = GNUNET_SCHEDULER_NO_TASK;
}
- if (pitr != NULL)
- {
- GNUNET_PEERINFO_iterate_cancel (pitr);
- pitr = NULL;
- }
if (NULL != daemon_handle_v4)
{
MHD_stop_daemon (daemon_handle_v4);
@@ -715,13 +709,23 @@
MHD_stop_daemon (daemon_handle_v6);
daemon_handle_v6 = NULL;
}
- if (response != NULL)
+ if (NULL != response)
{
MHD_destroy_response (response);
response = NULL;
}
- if (peerinfo != NULL)
+ if (NULL != notify)
{
+ GNUNET_PEERINFO_notify_cancel (notify);
+ notify = NULL;
+ }
+ if (NULL != pitr)
+ {
+ GNUNET_PEERINFO_iterate_cancel (pitr);
+ pitr = NULL;
+ }
+ if (NULL != peerinfo)
+ {
GNUNET_PEERINFO_disconnect (peerinfo);
peerinfo = NULL;
}
Modified: gnunet/src/peerinfo/peerinfo_api.c
===================================================================
--- gnunet/src/peerinfo/peerinfo_api.c 2012-05-03 08:23:35 UTC (rev 21236)
+++ gnunet/src/peerinfo/peerinfo_api.c 2012-05-03 09:24:06 UTC (rev 21237)
@@ -1,6 +1,6 @@
/*
This file is part of GNUnet.
- (C) 2001, 2002, 2004, 2005, 2007, 2009, 2010 Christian Grothoff (and
other contributing authors)
+ (C) 2001, 2002, 2004, 2005, 2007, 2009, 2010, 2012 Christian Grothoff
(and other contributing authors)
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
@@ -31,7 +31,7 @@
#include "gnunet_time_lib.h"
#include "peerinfo.h"
-#define LOG(kind,...) GNUNET_log_from (kind, "nse-api",__VA_ARGS__)
+#define LOG(kind,...) GNUNET_log_from (kind, "peerinfo-api",__VA_ARGS__)
/**
* Function to call after transmission has succeeded.
@@ -69,15 +69,63 @@
void *cont_cls;
/**
+ * Number of bytes of the request message (follows after this struct).
+ */
+ size_t size;
+
+};
+
+
+/**
+ * Context for an iteration request.
+ */
+struct GNUNET_PEERINFO_IteratorContext
+{
+
+ /**
+ * Kept in a DLL.
+ */
+ struct GNUNET_PEERINFO_IteratorContext *next;
+
+ /**
+ * Kept in a DLL.
+ */
+ struct GNUNET_PEERINFO_IteratorContext *prev;
+
+ /**
+ * Handle to the PEERINFO service.
+ */
+ struct GNUNET_PEERINFO_Handle *h;
+
+ /**
+ * Function to call with the results.
+ */
+ GNUNET_PEERINFO_Processor callback;
+
+ /**
+ * Closure for 'callback'.
+ */
+ void *callback_cls;
+
+ /**
+ * Our entry in the transmission queue.
+ */
+ struct TransmissionQueueEntry *tqe;
+
+ /**
+ * Task responsible for timeout.
+ */
+ GNUNET_SCHEDULER_TaskIdentifier timeout_task;
+
+ /**
* Timeout for the operation.
*/
struct GNUNET_TIME_Absolute timeout;
/**
- * Number of bytes of the request message (follows after this struct).
+ * Are we now receiving?
*/
- size_t size;
-
+ int in_receive;
};
@@ -112,6 +160,16 @@
struct GNUNET_CLIENT_TransmitHandle *th;
/**
+ * Head of iterator DLL.
+ */
+ struct GNUNET_PEERINFO_IteratorContext *ic_head;
+
+ /**
+ * Tail of iterator DLL.
+ */
+ struct GNUNET_PEERINFO_IteratorContext *ic_tail;
+
+ /**
* ID for a reconnect task.
*/
GNUNET_SCHEDULER_TaskIdentifier r_task;
@@ -135,12 +193,12 @@
struct GNUNET_PEERINFO_Handle *
GNUNET_PEERINFO_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
{
- struct GNUNET_PEERINFO_Handle *ret;
+ struct GNUNET_PEERINFO_Handle *h;
- ret = GNUNET_malloc (sizeof (struct GNUNET_PEERINFO_Handle));
- ret->client = GNUNET_CLIENT_connect ("peerinfo", cfg);
- ret->cfg = cfg;
- return ret;
+ h = GNUNET_malloc (sizeof (struct GNUNET_PEERINFO_Handle));
+ h->client = GNUNET_CLIENT_connect ("peerinfo", cfg);
+ h->cfg = cfg;
+ return h;
}
@@ -157,7 +215,14 @@
GNUNET_PEERINFO_disconnect (struct GNUNET_PEERINFO_Handle *h)
{
struct TransmissionQueueEntry *tqe;
+ struct GNUNET_PEERINFO_IteratorContext *ic;
+ while (NULL != (ic = h->ic_head))
+ {
+ GNUNET_break (GNUNET_YES == ic->in_receive);
+ ic->in_receive = GNUNET_NO;
+ GNUNET_PEERINFO_iterate_cancel (ic);
+ }
while (NULL != (tqe = h->tq_head))
{
GNUNET_CONTAINER_DLL_remove (h->tq_head, h->tq_tail, tqe);
@@ -165,7 +230,7 @@
tqe->cont (tqe->cont_cls, GNUNET_SYSERR);
GNUNET_free (tqe);
}
- if (h->th != NULL)
+ if (NULL != h->th)
{
GNUNET_CLIENT_notify_transmit_ready_cancel (h->th);
h->th = NULL;
@@ -202,6 +267,7 @@
static void
reconnect (struct GNUNET_PEERINFO_Handle *h);
+
/**
* Task scheduled to re-try connecting to the peerinfo service.
*
@@ -226,7 +292,7 @@
static void
reconnect (struct GNUNET_PEERINFO_Handle *h)
{
- if (h->r_task != GNUNET_SCHEDULER_NO_TASK)
+ if (GNUNET_SCHEDULER_NO_TASK != h->r_task)
{
GNUNET_SCHEDULER_cancel (h->r_task);
h->r_task = GNUNET_SCHEDULER_NO_TASK;
@@ -241,6 +307,7 @@
GNUNET_CLIENT_disconnect (h->client);
h->client = NULL;
}
+ h->in_receive = GNUNET_NO;
h->client = GNUNET_CLIENT_connect ("peerinfo", h->cfg);
if (NULL == h->client)
{
@@ -270,26 +337,32 @@
size_t ret;
h->th = NULL;
- if (tqe == NULL)
- return 0;
- if (buf == NULL)
+ if (NULL == tqe)
+ return 0; /* request was cancelled in the meantime */
+ if (NULL == buf)
{
+ /* peerinfo service died */
LOG (GNUNET_ERROR_TYPE_DEBUG | GNUNET_ERROR_TYPE_BULK,
- _("Failed to transmit message to `%s' service.\n"), "PEERINFO");
+ "Failed to transmit message to `%s' service.\n", "PEERINFO");
GNUNET_CONTAINER_DLL_remove (h->tq_head, h->tq_tail, tqe);
reconnect (h);
- if (tqe->cont != NULL)
+ if (NULL != tqe->cont)
tqe->cont (tqe->cont_cls, GNUNET_SYSERR);
GNUNET_free (tqe);
return 0;
}
ret = tqe->size;
- GNUNET_assert (size >= ret);
- memcpy (buf, &tqe[1], ret);
+ if (size < ret)
+ {
+ /* change in head of queue (i.e. cancel + add), try again */
+ trigger_transmit (h);
+ return 0;
+ }
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Transmitting request of size %u to `%s' service.\n", ret, "PEERINFO");
+ memcpy (buf, &tqe[1], ret);
GNUNET_CONTAINER_DLL_remove (h->tq_head, h->tq_tail, tqe);
- if (tqe->cont != NULL)
+ if (NULL != tqe->cont)
tqe->cont (tqe->cont_cls, GNUNET_OK);
else
trigger_transmit (h);
@@ -310,21 +383,22 @@
struct TransmissionQueueEntry *tqe;
if (NULL == (tqe = h->tq_head))
- return;
- if (h->th != NULL)
- return;
- if (h->in_receive == GNUNET_YES)
- return;
+ return; /* no requests queued */
+ if (NULL != h->th)
+ return; /* request already pending */
+ if (GNUNET_YES == h->in_receive)
+ return; /* still reading replies from last request */
if (NULL == h->client)
{
+ /* disconnected, try to reconnect */
reconnect (h);
return;
}
h->th =
- GNUNET_CLIENT_notify_transmit_ready (h->client, tqe->size,
- GNUNET_TIME_absolute_get_remaining
- (tqe->timeout), GNUNET_YES,
- &do_transmit, h);
+ GNUNET_CLIENT_notify_transmit_ready (h->client, tqe->size,
+ GNUNET_TIME_UNIT_FOREVER_REL,
+ GNUNET_YES,
+ &do_transmit, h);
}
@@ -353,7 +427,6 @@
GNUNET_i2s (&peer), hs, "HELLO");
tqe = GNUNET_malloc (sizeof (struct TransmissionQueueEntry) + hs);
tqe->size = hs;
- tqe->timeout = GNUNET_TIME_UNIT_FOREVER_ABS;
memcpy (&tqe[1], hello, hs);
GNUNET_CONTAINER_DLL_insert_after (h->tq_head, h->tq_tail, h->tq_tail, tqe);
trigger_transmit (h);
@@ -361,50 +434,10 @@
/**
- * Context for an iteration request.
- */
-struct GNUNET_PEERINFO_IteratorContext
-{
- /**
- * Handle to the PEERINFO service.
- */
- struct GNUNET_PEERINFO_Handle *h;
-
- /**
- * Function to call with the results.
- */
- GNUNET_PEERINFO_Processor callback;
-
- /**
- * Closure for 'callback'.
- */
- void *callback_cls;
-
- /**
- * Our entry in the transmission queue.
- */
- struct TransmissionQueueEntry *tqe;
-
- /**
- * Task responsible for timeout.
- */
- GNUNET_SCHEDULER_TaskIdentifier timeout_task;
-
- /**
- * Timeout for the operation.
- */
- struct GNUNET_TIME_Absolute timeout;
-
- /**
- * Are we now receiving?
- */
- int in_receive;
-};
-
-
-/**
- * Type of a function to call when we receive a message
- * from the service.
+ * Type of a function to call when we receive a message from the
+ * service. Call the iterator with the result and (if applicable)
+ * continue to receive more messages or trigger processing the next
+ * event (if applicable).
*
* @param cls closure
* @param msg message received, NULL on timeout or fatal error
@@ -413,46 +446,49 @@
peerinfo_handler (void *cls, const struct GNUNET_MessageHeader *msg)
{
struct GNUNET_PEERINFO_IteratorContext *ic = cls;
+ struct GNUNET_PEERINFO_Handle *h = ic->h;
const struct InfoMessage *im;
const struct GNUNET_HELLO_Message *hello;
+ GNUNET_PEERINFO_Processor cb;
+ void *cb_cls;
uint16_t ms;
- ic->h->in_receive = GNUNET_NO;
- if (msg == NULL)
+ h->in_receive = GNUNET_NO;
+ ic->in_receive = GNUNET_NO;
+ cb = ic->callback;
+ cb_cls = ic->callback_cls;
+ if (NULL == msg)
{
- reconnect (ic->h);
- if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK)
- GNUNET_SCHEDULER_cancel (ic->timeout_task);
- if (ic->callback != NULL)
- ic->callback (ic->callback_cls, NULL, NULL,
- _("Failed to receive response from `PEERINFO' service."));
- GNUNET_free (ic);
+ /* peerinfo service died, signal error */
+ GNUNET_PEERINFO_iterate_cancel (ic);
+ reconnect (h);
+ if (NULL != cb)
+ cb (cb_cls, NULL, NULL,
+ _("Failed to receive response from `PEERINFO' service."));
return;
}
- if (ntohs (msg->type) == GNUNET_MESSAGE_TYPE_PEERINFO_INFO_END)
+ if (GNUNET_MESSAGE_TYPE_PEERINFO_INFO_END == ntohs (msg->type))
{
+ /* normal end of list of peers, signal end, process next pending request */
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Received end of list of peers from `%s' service\n", "PEERINFO");
- trigger_transmit (ic->h);
- if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK)
- GNUNET_SCHEDULER_cancel (ic->timeout_task);
- if (ic->callback != NULL)
- ic->callback (ic->callback_cls, NULL, NULL, NULL);
- GNUNET_free (ic);
+ GNUNET_PEERINFO_iterate_cancel (ic);
+ trigger_transmit (h);
+ if (NULL != cb)
+ cb (cb_cls, NULL, NULL, NULL);
return;
}
ms = ntohs (msg->size);
if ((ms < sizeof (struct InfoMessage)) ||
(ntohs (msg->type) != GNUNET_MESSAGE_TYPE_PEERINFO_INFO))
{
+ /* malformed message */
GNUNET_break (0);
- reconnect (ic->h);
- if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK)
- GNUNET_SCHEDULER_cancel (ic->timeout_task);
- if (ic->callback != NULL)
- ic->callback (ic->callback_cls, NULL, NULL,
- _("Received invalid message from `PEERINFO' service."));
- GNUNET_free (ic);
+ GNUNET_PEERINFO_iterate_cancel (ic);
+ reconnect (h);
+ if (NULL != cb)
+ cb (cb_cls, NULL, NULL,
+ _("Received invalid message from `PEERINFO' service."));
return;
}
im = (const struct InfoMessage *) msg;
@@ -463,26 +499,27 @@
hello = (const struct GNUNET_HELLO_Message *) &im[1];
if (ms != sizeof (struct InfoMessage) + GNUNET_HELLO_size (hello))
{
+ /* malformed message */
GNUNET_break (0);
- reconnect (ic->h);
- if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK)
- GNUNET_SCHEDULER_cancel (ic->timeout_task);
- if (ic->callback != NULL)
- ic->callback (ic->callback_cls, NULL, NULL,
- _("Received invalid message from `PEERINFO' service."));
- GNUNET_free (ic);
+ GNUNET_PEERINFO_iterate_cancel (ic);
+ reconnect (h);
+ if (NULL != cb)
+ cb (cb_cls, NULL, NULL,
+ _("Received invalid message from `PEERINFO' service."));
return;
}
}
+ /* normal data message */
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Received %u bytes of `%s' information about peer `%s' from `%s'
service\n",
(hello == NULL) ? 0 : (unsigned int) GNUNET_HELLO_size (hello), "HELLO",
GNUNET_i2s (&im->peer), "PEERINFO");
- ic->h->in_receive = GNUNET_YES;
- if (ic->callback != NULL)
- ic->callback (ic->callback_cls, &im->peer, hello, NULL);
- GNUNET_CLIENT_receive (ic->h->client, &peerinfo_handler, ic,
+ h->in_receive = GNUNET_YES;
+ ic->in_receive = GNUNET_YES;
+ GNUNET_CLIENT_receive (h->client, &peerinfo_handler, ic,
GNUNET_TIME_absolute_get_remaining (ic->timeout));
+ if (NULL != cb)
+ cb (cb_cls, &im->peer, hello, NULL);
}
@@ -497,28 +534,27 @@
iterator_start_receive (void *cls, int transmit_success)
{
struct GNUNET_PEERINFO_IteratorContext *ic = cls;
+ struct GNUNET_PEERINFO_Handle *h = ic->h;
+ GNUNET_PEERINFO_Processor cb;
+ void *cb_cls;
+ ic->tqe = NULL;
if (GNUNET_OK != transmit_success)
{
- if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK)
- {
- GNUNET_SCHEDULER_cancel (ic->timeout_task);
- ic->timeout_task = GNUNET_SCHEDULER_NO_TASK;
- }
- reconnect (ic->h);
- if (ic->callback != NULL)
- ic->callback (ic->callback_cls, NULL, NULL,
- _
- ("Failed to transmit iteration request to `PEERINFO'
service"));
- GNUNET_free (ic);
+ cb = ic->callback;
+ cb_cls = ic->callback_cls;
+ GNUNET_PEERINFO_iterate_cancel (ic);
+ reconnect (h);
+ if (NULL != cb)
+ cb (cb_cls, NULL, NULL,
+ _("Failed to transmit iteration request to `PEERINFO' service"));
return;
}
LOG (GNUNET_ERROR_TYPE_DEBUG, "Waiting for response from `%s' service.\n",
"PEERINFO");
- ic->h->in_receive = GNUNET_YES;
+ h->in_receive = GNUNET_YES;
ic->in_receive = GNUNET_YES;
- ic->tqe = NULL;
- GNUNET_CLIENT_receive (ic->h->client, &peerinfo_handler, ic,
+ GNUNET_CLIENT_receive (h->client, &peerinfo_handler, ic,
GNUNET_TIME_absolute_get_remaining (ic->timeout));
}
@@ -533,18 +569,16 @@
signal_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
struct GNUNET_PEERINFO_IteratorContext *ic = cls;
+ GNUNET_PEERINFO_Processor cb;
+ void *cb_cls;
ic->timeout_task = GNUNET_SCHEDULER_NO_TASK;
- if (!ic->in_receive)
- GNUNET_CONTAINER_DLL_remove (ic->h->tq_head, ic->h->tq_tail, ic->tqe);
- else
- reconnect (ic->h);
- ic->callback (ic->callback_cls, NULL, NULL,
- _
- ("Timeout transmitting iteration request to `PEERINFO'
service."));
- ic->callback = NULL;
- GNUNET_free_non_null (ic->tqe);
- GNUNET_free (ic);
+ cb = ic->callback;
+ cb_cls = ic->callback_cls;
+ GNUNET_PEERINFO_iterate_cancel (ic);
+ if (NULL != cb)
+ cb (cb_cls, NULL, NULL,
+ _("Timeout transmitting iteration request to `PEERINFO' service."));
}
@@ -575,7 +609,7 @@
struct GNUNET_PEERINFO_IteratorContext *ic;
struct TransmissionQueueEntry *tqe;
- if (peer == NULL)
+ if (NULL == peer)
{
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Requesting list of peers from PEERINFO service\n");
@@ -609,10 +643,12 @@
ic->timeout = GNUNET_TIME_relative_to_absolute (timeout);
ic->timeout_task =
GNUNET_SCHEDULER_add_delayed (timeout, &signal_timeout, ic);
- tqe->timeout = GNUNET_TIME_UNIT_FOREVER_ABS;
tqe->cont = &iterator_start_receive;
tqe->cont_cls = ic;
GNUNET_CONTAINER_DLL_insert_after (h->tq_head, h->tq_tail, h->tq_tail, tqe);
+ GNUNET_CONTAINER_DLL_insert (h->ic_head,
+ h->ic_tail,
+ ic);
trigger_transmit (h);
return ic;
}
@@ -626,7 +662,13 @@
void
GNUNET_PEERINFO_iterate_cancel (struct GNUNET_PEERINFO_IteratorContext *ic)
{
- if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK)
+ struct GNUNET_PEERINFO_Handle *h;
+
+ h = ic->h;
+ GNUNET_CONTAINER_DLL_remove (h->ic_head,
+ h->ic_tail,
+ ic);
+ if (GNUNET_SCHEDULER_NO_TASK != ic->timeout_task)
{
GNUNET_SCHEDULER_cancel (ic->timeout_task);
ic->timeout_task = GNUNET_SCHEDULER_NO_TASK;
@@ -634,8 +676,11 @@
ic->callback = NULL;
if (GNUNET_YES == ic->in_receive)
return; /* need to finish processing */
- GNUNET_CONTAINER_DLL_remove (ic->h->tq_head, ic->h->tq_tail, ic->tqe);
- GNUNET_free (ic->tqe);
+ if (NULL != ic->tqe)
+ {
+ GNUNET_CONTAINER_DLL_remove (h->tq_head, h->tq_tail, ic->tqe);
+ GNUNET_free (ic->tqe);
+ }
GNUNET_free (ic);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r21237 - in gnunet/src: hostlist peerinfo,
gnunet <=