aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBart Polot <bart@net.in.tum.de>2013-08-13 17:17:57 +0000
committerBart Polot <bart@net.in.tum.de>2013-08-13 17:17:57 +0000
commitf76eea97484af4869b1c3aa96459bc7860634444 (patch)
tree7792c4189a4d1470ae967994a214d0f98416ab35
parentbfbbb1e8700093783da55c84221fc688eee4c9a0 (diff)
downloadgnunet-f76eea97484af4869b1c3aa96459bc7860634444.tar.gz
gnunet-f76eea97484af4869b1c3aa96459bc7860634444.zip
- fix core cancel on shutdown
-rw-r--r--src/mesh/gnunet-service-mesh-enc.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/mesh/gnunet-service-mesh-enc.c b/src/mesh/gnunet-service-mesh-enc.c
index 920d5ad14..7c6f8725c 100644
--- a/src/mesh/gnunet-service-mesh-enc.c
+++ b/src/mesh/gnunet-service-mesh-enc.c
@@ -54,7 +54,7 @@
54#define MESH_BLOOM_SIZE 128 54#define MESH_BLOOM_SIZE 128
55 55
56#define MESH_DEBUG_DHT GNUNET_NO 56#define MESH_DEBUG_DHT GNUNET_NO
57#define MESH_DEBUG_CONNECTION GNUNET_NO 57#define MESH_DEBUG_CONNECTION GNUNET_YES
58#define MESH_DEBUG_TIMING __LINUX__ && GNUNET_NO 58#define MESH_DEBUG_TIMING __LINUX__ && GNUNET_NO
59 59
60#define MESH_MAX_POLL_TIME GNUNET_TIME_relative_multiply (\ 60#define MESH_MAX_POLL_TIME GNUNET_TIME_relative_multiply (\
@@ -2903,6 +2903,7 @@ static struct MeshConnection *
2903tunnel_use_path (struct MeshTunnel2 *t, struct MeshPeerPath *p) 2903tunnel_use_path (struct MeshTunnel2 *t, struct MeshPeerPath *p)
2904{ 2904{
2905 struct MeshConnection *c; 2905 struct MeshConnection *c;
2906 struct MeshPeer *peer;
2906 unsigned int own_pos; 2907 unsigned int own_pos;
2907 2908
2908 c = connection_new (&t->id, t->next_cid++); 2909 c = connection_new (&t->id, t->next_cid++);
@@ -2926,6 +2927,13 @@ tunnel_use_path (struct MeshTunnel2 *t, struct MeshPeerPath *p)
2926 GNUNET_SCHEDULER_add_delayed (refresh_connection_time, 2927 GNUNET_SCHEDULER_add_delayed (refresh_connection_time,
2927 &connection_fwd_keepalive, c); 2928 &connection_fwd_keepalive, c);
2928 } 2929 }
2930
2931 peer = connection_get_next_hop (c);
2932 GNUNET_CONTAINER_multihashmap_put (peer->connections, &c->t->id, c,
2933 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
2934 peer = connection_get_prev_hop (c);
2935 GNUNET_CONTAINER_multihashmap_put (peer->connections, &c->t->id, c,
2936 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
2929 return c; 2937 return c;
2930} 2938}
2931 2939
@@ -3816,6 +3824,8 @@ connection_get (const struct GNUNET_HashCode *tid, uint32_t cid)
3816static void 3824static void
3817connection_destroy (struct MeshConnection *c) 3825connection_destroy (struct MeshConnection *c)
3818{ 3826{
3827 struct MeshPeer *peer;
3828
3819 if (NULL == c) 3829 if (NULL == c)
3820 return; 3830 return;
3821 3831
@@ -3823,17 +3833,27 @@ connection_destroy (struct MeshConnection *c)
3823 peer2s (c->t->peer), 3833 peer2s (c->t->peer),
3824 c->id); 3834 c->id);
3825 3835
3836 /* Cancel all traffic */
3826 connection_cancel_queues (c, GNUNET_YES); 3837 connection_cancel_queues (c, GNUNET_YES);
3827 connection_cancel_queues (c, GNUNET_NO); 3838 connection_cancel_queues (c, GNUNET_NO);
3828 3839
3840 /* Cancel maintainance task (keepalive/timeout) */
3829 if (GNUNET_SCHEDULER_NO_TASK != c->fwd_maintenance_task) 3841 if (GNUNET_SCHEDULER_NO_TASK != c->fwd_maintenance_task)
3830 GNUNET_SCHEDULER_cancel (c->fwd_maintenance_task); 3842 GNUNET_SCHEDULER_cancel (c->fwd_maintenance_task);
3831 if (GNUNET_SCHEDULER_NO_TASK != c->bck_maintenance_task) 3843 if (GNUNET_SCHEDULER_NO_TASK != c->bck_maintenance_task)
3832 GNUNET_SCHEDULER_cancel (c->bck_maintenance_task); 3844 GNUNET_SCHEDULER_cancel (c->bck_maintenance_task);
3833 3845
3834 GNUNET_CONTAINER_DLL_remove (c->t->connection_head, c->t->connection_tail, c); 3846 /* Deregister from neighbors */
3847 peer = connection_get_next_hop (c);
3848 if (NULL != peer)
3849 GNUNET_CONTAINER_multihashmap_remove (peer->connections, &c->t->id, c);
3850 peer = connection_get_prev_hop (c);
3851 if (NULL != peer)
3852 GNUNET_CONTAINER_multihashmap_remove (peer->connections, &c->t->id, c);
3835 3853
3854 /* Delete */
3836 GNUNET_STATISTICS_update (stats, "# connections", -1, GNUNET_NO); 3855 GNUNET_STATISTICS_update (stats, "# connections", -1, GNUNET_NO);
3856 GNUNET_CONTAINER_DLL_remove (c->t->connection_head, c->t->connection_tail, c);
3837 GNUNET_free (c); 3857 GNUNET_free (c);
3838} 3858}
3839 3859