aboutsummaryrefslogtreecommitdiff
path: root/src/transport/gnunet-service-tng.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/transport/gnunet-service-tng.c')
-rw-r--r--src/transport/gnunet-service-tng.c124
1 files changed, 61 insertions, 63 deletions
diff --git a/src/transport/gnunet-service-tng.c b/src/transport/gnunet-service-tng.c
index 64cb53ad8..aaa9f129b 100644
--- a/src/transport/gnunet-service-tng.c
+++ b/src/transport/gnunet-service-tng.c
@@ -2772,6 +2772,11 @@ static unsigned int pa_count;
2772 */ 2772 */
2773static struct GNUNET_TIME_Absolute hello_mono_time; 2773static struct GNUNET_TIME_Absolute hello_mono_time;
2774 2774
2775/**
2776 * Indication if we have received a shutdown signal
2777 * and are in the process of cleaning up.
2778 */
2779static int in_shutdown;
2775 2780
2776/** 2781/**
2777 * Get an offset into the transmission history buffer for `struct 2782 * Get an offset into the transmission history buffer for `struct
@@ -2805,6 +2810,7 @@ free_incoming_request (struct IncomingRequest *ir)
2805 GNUNET_assert (ir_total > 0); 2810 GNUNET_assert (ir_total > 0);
2806 ir_total--; 2811 ir_total--;
2807 GNUNET_PEERSTORE_watch_cancel (ir->wc); 2812 GNUNET_PEERSTORE_watch_cancel (ir->wc);
2813 ir->wc = NULL;
2808 GNUNET_free (ir); 2814 GNUNET_free (ir);
2809} 2815}
2810 2816
@@ -3333,6 +3339,8 @@ free_neighbour (struct Neighbour *neighbour)
3333 GNUNET_CONTAINER_multipeermap_remove (neighbours, 3339 GNUNET_CONTAINER_multipeermap_remove (neighbours,
3334 &neighbour->pid, 3340 &neighbour->pid,
3335 neighbour)); 3341 neighbour));
3342 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3343 "Freeing neighbour\n");
3336 if (NULL != neighbour->reassembly_map) 3344 if (NULL != neighbour->reassembly_map)
3337 { 3345 {
3338 GNUNET_CONTAINER_multihashmap32_iterate (neighbour->reassembly_map, 3346 GNUNET_CONTAINER_multihashmap32_iterate (neighbour->reassembly_map,
@@ -3499,6 +3507,8 @@ check_link_down (void *cls)
3499 struct GNUNET_TIME_Absolute dvh_timeout; 3507 struct GNUNET_TIME_Absolute dvh_timeout;
3500 struct GNUNET_TIME_Absolute q_timeout; 3508 struct GNUNET_TIME_Absolute q_timeout;
3501 3509
3510 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3511 "Checking if link is down\n");
3502 vl->visibility_task = NULL; 3512 vl->visibility_task = NULL;
3503 dvh_timeout = GNUNET_TIME_UNIT_ZERO_ABS; 3513 dvh_timeout = GNUNET_TIME_UNIT_ZERO_ABS;
3504 if (NULL != dv) 3514 if (NULL != dv)
@@ -3660,6 +3670,7 @@ stop_peer_request (void *cls,
3660 struct PeerRequest *pr = value; 3670 struct PeerRequest *pr = value;
3661 3671
3662 GNUNET_PEERSTORE_watch_cancel (pr->wc); 3672 GNUNET_PEERSTORE_watch_cancel (pr->wc);
3673 pr->wc = NULL;
3663 GNUNET_assert ( 3674 GNUNET_assert (
3664 GNUNET_YES == 3675 GNUNET_YES ==
3665 GNUNET_CONTAINER_multipeermap_remove (tc->details.application.requests, 3676 GNUNET_CONTAINER_multipeermap_remove (tc->details.application.requests,
@@ -3670,6 +3681,8 @@ stop_peer_request (void *cls,
3670 return GNUNET_OK; 3681 return GNUNET_OK;
3671} 3682}
3672 3683
3684static void
3685do_shutdown (void *cls);
3673 3686
3674/** 3687/**
3675 * Called whenever a client is disconnected. Frees our 3688 * Called whenever a client is disconnected. Frees our
@@ -3688,16 +3701,20 @@ client_disconnect_cb (void *cls,
3688 3701
3689 (void) cls; 3702 (void) cls;
3690 (void) client; 3703 (void) client;
3691 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3692 "Client %p disconnected, cleaning up.\n",
3693 tc);
3694 GNUNET_CONTAINER_DLL_remove (clients_head, clients_tail, tc); 3704 GNUNET_CONTAINER_DLL_remove (clients_head, clients_tail, tc);
3695 switch (tc->type) 3705 switch (tc->type)
3696 { 3706 {
3697 case CT_NONE: 3707 case CT_NONE:
3708 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3709 "Unknown Client %p disconnected, cleaning up.\n",
3710 tc);
3698 break; 3711 break;
3699 3712
3700 case CT_CORE: { 3713 case CT_CORE: {
3714 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3715 "CORE Client %p disconnected, cleaning up.\n",
3716 tc);
3717
3701 struct PendingMessage *pm; 3718 struct PendingMessage *pm;
3702 3719
3703 while (NULL != (pm = tc->details.core.pending_msg_head)) 3720 while (NULL != (pm = tc->details.core.pending_msg_head))
@@ -3712,9 +3729,17 @@ client_disconnect_cb (void *cls,
3712 break; 3729 break;
3713 3730
3714 case CT_MONITOR: 3731 case CT_MONITOR:
3732 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3733 "MONITOR Client %p disconnected, cleaning up.\n",
3734 tc);
3735
3715 break; 3736 break;
3716 3737
3717 case CT_COMMUNICATOR: { 3738 case CT_COMMUNICATOR: {
3739 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3740 "COMMUNICATOR Client %p disconnected, cleaning up.\n",
3741 tc);
3742
3718 struct Queue *q; 3743 struct Queue *q;
3719 struct AddressListEntry *ale; 3744 struct AddressListEntry *ale;
3720 3745
@@ -3727,6 +3752,10 @@ client_disconnect_cb (void *cls,
3727 break; 3752 break;
3728 3753
3729 case CT_APPLICATION: 3754 case CT_APPLICATION:
3755 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3756 "APPLICATION Client %p disconnected, cleaning up.\n",
3757 tc);
3758
3730 GNUNET_CONTAINER_multipeermap_iterate (tc->details.application.requests, 3759 GNUNET_CONTAINER_multipeermap_iterate (tc->details.application.requests,
3731 &stop_peer_request, 3760 &stop_peer_request,
3732 tc); 3761 tc);
@@ -3734,6 +3763,12 @@ client_disconnect_cb (void *cls,
3734 break; 3763 break;
3735 } 3764 }
3736 GNUNET_free (tc); 3765 GNUNET_free (tc);
3766 if ((GNUNET_YES == in_shutdown) && (NULL == clients_head))
3767 {
3768 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
3769 "Our last client disconnected\n");
3770 do_shutdown (cls);
3771 }
3737} 3772}
3738 3773
3739 3774
@@ -5166,7 +5201,9 @@ handle_del_address (void *cls,
5166 GNUNET_SERVICE_client_continue (tc->client); 5201 GNUNET_SERVICE_client_continue (tc->client);
5167 return; 5202 return;
5168 } 5203 }
5169 GNUNET_break (0); 5204 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
5205 "Communicator removed address we did not even have.\n");
5206 GNUNET_SERVICE_client_continue (tc->client);
5170 //GNUNET_SERVICE_client_drop (tc->client); 5207 //GNUNET_SERVICE_client_drop (tc->client);
5171} 5208}
5172 5209
@@ -10046,52 +10083,6 @@ free_ack_cummulator_cb (void *cls,
10046 return GNUNET_OK; 10083 return GNUNET_OK;
10047} 10084}
10048 10085
10049void
10050cleanup_client (struct TransportClient *tc)
10051{
10052 switch (tc->type)
10053 {
10054 case CT_NONE:
10055 break;
10056
10057 case CT_CORE: {
10058 struct PendingMessage *pm;
10059
10060 while (NULL != (pm = tc->details.core.pending_msg_head))
10061 {
10062 GNUNET_CONTAINER_MDLL_remove (client,
10063 tc->details.core.pending_msg_head,
10064 tc->details.core.pending_msg_tail,
10065 pm);
10066 pm->client = NULL;
10067 }
10068 }
10069 break;
10070
10071 case CT_MONITOR:
10072 break;
10073
10074 case CT_COMMUNICATOR: {
10075 struct Queue *q;
10076 struct AddressListEntry *ale;
10077
10078 while (NULL != (q = tc->details.communicator.queue_head))
10079 free_queue (q);
10080 while (NULL != (ale = tc->details.communicator.addr_head))
10081 free_address_list_entry (ale);
10082 GNUNET_free (tc->details.communicator.address_prefix);
10083 }
10084 break;
10085
10086 case CT_APPLICATION:
10087 GNUNET_CONTAINER_multipeermap_iterate (tc->details.application.requests,
10088 &stop_peer_request,
10089 tc);
10090 GNUNET_CONTAINER_multipeermap_destroy (tc->details.application.requests);
10091 break;
10092 }
10093
10094}
10095 10086
10096/** 10087/**
10097 * Function called when the service shuts down. Unloads our plugins 10088 * Function called when the service shuts down. Unloads our plugins
@@ -10103,20 +10094,10 @@ static void
10103do_shutdown (void *cls) 10094do_shutdown (void *cls)
10104{ 10095{
10105 struct LearnLaunchEntry *lle; 10096 struct LearnLaunchEntry *lle;
10106 struct TransportClient *client;
10107 10097
10108 (void) cls; 10098 (void) cls;
10109 for (client = clients_head; NULL != client; client = client->next) 10099 GNUNET_CONTAINER_multipeermap_iterate (neighbours,
10110 { 10100 &free_neighbour_cb, NULL);
10111 cleanup_client (client);
10112 }
10113 //GNUNET_CONTAINER_multipeermap_iterate (neighbours,
10114 //&free_neighbour_cb, NULL);
10115 if (NULL != peerstore)
10116 {
10117 GNUNET_PEERSTORE_disconnect (peerstore, GNUNET_NO);
10118 peerstore = NULL;
10119 }
10120 if (NULL != validation_task) 10101 if (NULL != validation_task)
10121 { 10102 {
10122 GNUNET_SCHEDULER_cancel (validation_task); 10103 GNUNET_SCHEDULER_cancel (validation_task);
@@ -10171,6 +10152,13 @@ do_shutdown (void *cls)
10171 GNUNET_CONTAINER_DLL_remove (lle_head, lle_tail, lle); 10152 GNUNET_CONTAINER_DLL_remove (lle_head, lle_tail, lle);
10172 GNUNET_free (lle); 10153 GNUNET_free (lle);
10173 } 10154 }
10155 if (NULL != peerstore)
10156 {
10157 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
10158 "Disconnecting from PEERSTORE service\n");
10159 GNUNET_PEERSTORE_disconnect (peerstore, GNUNET_NO);
10160 peerstore = NULL;
10161 }
10174 GNUNET_CONTAINER_multishortmap_destroy (dvlearn_map); 10162 GNUNET_CONTAINER_multishortmap_destroy (dvlearn_map);
10175 dvlearn_map = NULL; 10163 dvlearn_map = NULL;
10176 GNUNET_CONTAINER_heap_destroy (validation_heap); 10164 GNUNET_CONTAINER_heap_destroy (validation_heap);
@@ -10178,6 +10166,15 @@ do_shutdown (void *cls)
10178 GNUNET_CONTAINER_multipeermap_iterate (dv_routes, &free_dv_routes_cb, NULL); 10166 GNUNET_CONTAINER_multipeermap_iterate (dv_routes, &free_dv_routes_cb, NULL);
10179 GNUNET_CONTAINER_multipeermap_destroy (dv_routes); 10167 GNUNET_CONTAINER_multipeermap_destroy (dv_routes);
10180 dv_routes = NULL; 10168 dv_routes = NULL;
10169 GNUNET_SCHEDULER_shutdown ();
10170}
10171
10172static void
10173shutdown_task (void *cls)
10174{
10175 in_shutdown = GNUNET_YES;
10176 if (NULL == clients_head)
10177 do_shutdown (cls);
10181} 10178}
10182 10179
10183 10180
@@ -10197,6 +10194,7 @@ run (void *cls,
10197 (void) service; 10194 (void) service;
10198 /* setup globals */ 10195 /* setup globals */
10199 hello_mono_time = GNUNET_TIME_absolute_get_monotonic (c); 10196 hello_mono_time = GNUNET_TIME_absolute_get_monotonic (c);
10197 in_shutdown = GNUNET_NO;
10200 GST_cfg = c; 10198 GST_cfg = c;
10201 backtalkers = GNUNET_CONTAINER_multipeermap_create (16, GNUNET_YES); 10199 backtalkers = GNUNET_CONTAINER_multipeermap_create (16, GNUNET_YES);
10202 pending_acks = GNUNET_CONTAINER_multiuuidmap_create (32768, GNUNET_YES); 10200 pending_acks = GNUNET_CONTAINER_multiuuidmap_create (32768, GNUNET_YES);
@@ -10226,7 +10224,7 @@ run (void *cls,
10226 "My identity is `%s'\n", 10224 "My identity is `%s'\n",
10227 GNUNET_i2s_full (&GST_my_identity)); 10225 GNUNET_i2s_full (&GST_my_identity));
10228 GST_stats = GNUNET_STATISTICS_create ("transport", GST_cfg); 10226 GST_stats = GNUNET_STATISTICS_create ("transport", GST_cfg);
10229 GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL); 10227 GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL);
10230 peerstore = GNUNET_PEERSTORE_connect (GST_cfg); 10228 peerstore = GNUNET_PEERSTORE_connect (GST_cfg);
10231 if (NULL == peerstore) 10229 if (NULL == peerstore)
10232 { 10230 {