diff options
author | Bart Polot <bart@net.in.tum.de> | 2013-08-13 17:17:57 +0000 |
---|---|---|
committer | Bart Polot <bart@net.in.tum.de> | 2013-08-13 17:17:57 +0000 |
commit | f76eea97484af4869b1c3aa96459bc7860634444 (patch) | |
tree | 7792c4189a4d1470ae967994a214d0f98416ab35 | |
parent | bfbbb1e8700093783da55c84221fc688eee4c9a0 (diff) | |
download | gnunet-f76eea97484af4869b1c3aa96459bc7860634444.tar.gz gnunet-f76eea97484af4869b1c3aa96459bc7860634444.zip |
- fix core cancel on shutdown
-rw-r--r-- | src/mesh/gnunet-service-mesh-enc.c | 24 |
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 * | |||
2903 | tunnel_use_path (struct MeshTunnel2 *t, struct MeshPeerPath *p) | 2903 | tunnel_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) | |||
3816 | static void | 3824 | static void |
3817 | connection_destroy (struct MeshConnection *c) | 3825 | connection_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 | ||