[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r13675 - gnunet/src/core
From: |
gnunet |
Subject: |
[GNUnet-SVN] r13675 - gnunet/src/core |
Date: |
Sun, 14 Nov 2010 07:59:21 +0100 |
Author: grothoff
Date: 2010-11-14 07:59:21 +0100 (Sun, 14 Nov 2010)
New Revision: 13675
Modified:
gnunet/src/core/core_api.c
gnunet/src/core/test_core_api_start_only.c
Log:
fix
Modified: gnunet/src/core/core_api.c
===================================================================
--- gnunet/src/core/core_api.c 2010-11-14 06:08:56 UTC (rev 13674)
+++ gnunet/src/core/core_api.c 2010-11-14 06:59:21 UTC (rev 13675)
@@ -133,7 +133,8 @@
/**
* Function to run after successful transmission (or call with
- * reason 'TIMEOUT' on error).
+ * reason 'TIMEOUT' on error); called with scheduler context 'NULL'
+ * on disconnect.
*/
GNUNET_SCHEDULER_Task cont;
@@ -452,6 +453,8 @@
static void
reconnect_later (struct GNUNET_CORE_Handle *h)
{
+ struct ControlMessage *cm;
+
if (h->client != NULL)
{
GNUNET_CLIENT_disconnect (h->client, GNUNET_NO);
@@ -461,6 +464,14 @@
h);
}
h->currently_down = GNUNET_YES;
+ while (NULL != (cm = h->pending_head))
+ {
+ GNUNET_CONTAINER_DLL_remove (h->pending_head,
+ h->pending_tail,
+ cm);
+ cm->cont (cm->cont_cls, NULL);
+ GNUNET_free (cm);
+ }
GNUNET_assert (h->reconnect_task == GNUNET_SCHEDULER_NO_TASK);
h->retry_backoff = GNUNET_TIME_relative_min (GNUNET_TIME_UNIT_SECONDS,
h->retry_backoff);
@@ -798,7 +809,7 @@
if (ntohs (msg->size) != sizeof (struct InitReplyMessage))
{
GNUNET_break (0);
- reconnect (h);
+ reconnect_later (h);
return;
}
m = (const struct InitReplyMessage *) msg;
@@ -829,7 +840,8 @@
if (msize != sizeof (struct ConnectNotifyMessage))
{
GNUNET_break (0);
- break;
+ reconnect_later (h);
+ return;
}
cnm = (const struct ConnectNotifyMessage *) msg;
#if DEBUG_CORE
@@ -842,7 +854,7 @@
if (pr != NULL)
{
GNUNET_break (0);
- reconnect (h);
+ reconnect_later (h);
return;
}
pr = GNUNET_malloc (sizeof (struct PeerRecord));
@@ -862,7 +874,8 @@
if (msize != sizeof (struct DisconnectNotifyMessage))
{
GNUNET_break (0);
- break;
+ reconnect_later (h);
+ return;
}
dnm = (const struct DisconnectNotifyMessage *) msg;
#if DEBUG_CORE
@@ -875,7 +888,7 @@
if (pr == NULL)
{
GNUNET_break (0);
- reconnect (h);
+ reconnect_later (h);
return;
}
trigger = ( (pr->prev != NULL) ||
@@ -894,7 +907,8 @@
if (msize != sizeof (struct PeerStatusNotifyMessage))
{
GNUNET_break (0);
- break;
+ reconnect_later (h);
+ return;
}
psnm = (const struct PeerStatusNotifyMessage *) msg;
#if DEBUG_CORE
@@ -907,7 +921,7 @@
if (pr == NULL)
{
GNUNET_break (0);
- reconnect (h);
+ reconnect_later (h);
return;
}
h->status_events (h->cls,
@@ -923,7 +937,8 @@
sizeof (struct GNUNET_MessageHeader))
{
GNUNET_break (0);
- break;
+ reconnect_later (h);
+ return;
}
ntm = (const struct NotifyTrafficMessage *) msg;
em = (const struct GNUNET_MessageHeader *) &ntm[1];
@@ -939,14 +954,15 @@
if (pr == NULL)
{
GNUNET_break (0);
- reconnect (h);
+ reconnect_later (h);
return;
}
if ((GNUNET_NO == h->inbound_hdr_only) &&
(msize != ntohs (em->size) + sizeof (struct NotifyTrafficMessage)))
{
GNUNET_break (0);
- break;
+ reconnect_later (h);
+ return;
}
et = ntohs (em->type);
for (hpos = 0; hpos < h->hcnt; hpos++)
@@ -978,7 +994,8 @@
sizeof (struct GNUNET_MessageHeader))
{
GNUNET_break (0);
- break;
+ reconnect_later (h);
+ return;
}
ntm = (const struct NotifyTrafficMessage *) msg;
em = (const struct GNUNET_MessageHeader *) &ntm[1];
@@ -987,7 +1004,7 @@
if (pr == NULL)
{
GNUNET_break (0);
- reconnect (h);
+ reconnect_later (h);
return;
}
#if DEBUG_CORE
@@ -999,7 +1016,8 @@
(msize != ntohs (em->size) + sizeof (struct NotifyTrafficMessage)))
{
GNUNET_break (0);
- break;
+ reconnect_later (h);
+ return;
}
if (NULL == h->outbound_notify)
{
@@ -1013,7 +1031,8 @@
if (msize != sizeof (struct SendMessageReady))
{
GNUNET_break (0);
- break;
+ reconnect_later (h);
+ return;
}
smr = (const struct SendMessageReady *) msg;
pr = GNUNET_CONTAINER_multihashmap_get (h->peers,
@@ -1021,7 +1040,7 @@
if (pr == NULL)
{
GNUNET_break (0);
- reconnect (h);
+ reconnect_later (h);
return;
}
#if DEBUG_CORE
@@ -1042,7 +1061,7 @@
{
/* we should not already be on the ready list... */
GNUNET_break (0);
- reconnect (h);
+ reconnect_later (h);
return;
}
GNUNET_CONTAINER_DLL_insert (h->ready_peer_head,
@@ -1054,7 +1073,8 @@
if (ntohs (msg->size) != sizeof (struct ConfigurationInfoMessage))
{
GNUNET_break (0);
- break;
+ reconnect_later (h);
+ return;
}
cim = (const struct ConfigurationInfoMessage*) msg;
#if DEBUG_CORE
@@ -1067,7 +1087,7 @@
if (pr == NULL)
{
GNUNET_break (0);
- reconnect (h);
+ reconnect_later (h);
return;
}
if (pr->rim_id != ntohl (cim->rim_id))
@@ -1082,11 +1102,11 @@
GNUNET_ntohll (cim->preference));
break;
default:
- GNUNET_break (0);
- break;
+ reconnect_later (h);
+ return;
}
GNUNET_CLIENT_receive (h->client,
- &main_notify_handler, h,
+ &main_notify_handler, h,
GNUNET_TIME_UNIT_FOREVER_REL);
}
@@ -1104,6 +1124,8 @@
{
struct GNUNET_CORE_Handle *h = cls;
+ if (tc == NULL)
+ return; /* error */
if (0 == (tc->reason & GNUNET_SCHEDULER_REASON_PREREQ_DONE))
{
#if DEBUG_CORE
@@ -1140,15 +1162,8 @@
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Reconnecting to CORE service\n");
#endif
- if (h->client != NULL)
- {
- GNUNET_CLIENT_disconnect (h->client, GNUNET_NO);
- h->client = NULL;
- GNUNET_CONTAINER_multihashmap_iterate (h->peers,
- &disconnect_and_free_peer_entry,
- h);
- }
- h->currently_down = GNUNET_YES;
+ GNUNET_assert (h->client == NULL);
+ GNUNET_assert (h->currently_down == GNUNET_YES);
h->client = GNUNET_CLIENT_connect ("core", h->cfg);
if (h->client == NULL)
{
@@ -1246,6 +1261,7 @@
h->outbound_hdr_only = outbound_hdr_only;
h->handlers = handlers;
h->hcnt = 0;
+ h->currently_down = GNUNET_YES;
h->peers = GNUNET_CONTAINER_multihashmap_create (128);
h->retry_backoff = GNUNET_TIME_UNIT_MILLISECONDS;
while (handlers[h->hcnt].callback != NULL)
@@ -1298,6 +1314,7 @@
GNUNET_CONTAINER_DLL_remove (handle->pending_head,
handle->pending_tail,
cm);
+ cm->cont (cm->cont_cls, NULL);
GNUNET_free (cm);
}
GNUNET_CONTAINER_multihashmap_iterate (handle->peers,
@@ -1497,7 +1514,6 @@
};
-
/**
* Continuation called when the control message was transmitted.
* Calls the original continuation and frees the remaining
@@ -1513,7 +1529,13 @@
struct GNUNET_CORE_PeerRequestHandle *ret = cls;
if (ret->cont != NULL)
- ret->cont (ret->cont_cls, tc);
+ {
+ if (tc == NULL)
+ GNUNET_SCHEDULER_add_now (ret->cont,
+ ret->cont_cls);
+ else
+ ret->cont (ret->cont_cls, tc);
+ }
GNUNET_free (ret);
}
Modified: gnunet/src/core/test_core_api_start_only.c
===================================================================
--- gnunet/src/core/test_core_api_start_only.c 2010-11-14 06:08:56 UTC (rev
13674)
+++ gnunet/src/core/test_core_api_start_only.c 2010-11-14 06:59:21 UTC (rev
13675)
@@ -103,7 +103,20 @@
};
+static void
+shutdown_task (void *cls,
+ const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ GNUNET_CORE_disconnect (p1.ch);
+ p1.ch = NULL;
+ GNUNET_CORE_disconnect (p2.ch);
+ p2.ch = NULL;
+ ok = 0;
+}
+
+
+
static void
init_notify (void *cls,
struct GNUNET_CORE_Handle *server,
@@ -130,10 +143,8 @@
else
{
GNUNET_assert (cls == &p2);
- GNUNET_CORE_disconnect (p1.ch);
- GNUNET_CORE_disconnect (p2.ch);
GNUNET_SCHEDULER_cancel (timeout_task_id);
- ok = 0;
+ GNUNET_SCHEDULER_add_now (&shutdown_task, NULL);
}
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r13675 - gnunet/src/core,
gnunet <=