aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2010-04-26 09:45:35 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2010-04-26 09:45:35 +0000
commit4de943d80f5ad59ac39e22381106a72c5f7d1cc0 (patch)
tree9e7e54d67ee2403826d90fe588a0b28f944a9793 /src
parent780d3b3b3e7eb3dc10aac17dd3ff307e22df552e (diff)
downloadgnunet-4de943d80f5ad59ac39e22381106a72c5f7d1cc0.tar.gz
gnunet-4de943d80f5ad59ac39e22381106a72c5f7d1cc0.zip
- Cleaning up and restructuring
- Fixing download tasks to shutdown cleanly
Diffstat (limited to 'src')
-rw-r--r--src/hostlist/hostlist-client.c104
1 files changed, 72 insertions, 32 deletions
diff --git a/src/hostlist/hostlist-client.c b/src/hostlist/hostlist-client.c
index 81e85a54a..084277af4 100644
--- a/src/hostlist/hostlist-client.c
+++ b/src/hostlist/hostlist-client.c
@@ -151,17 +151,28 @@ static CURLM *multi;
151/** 151/**
152 * ID of the current task scheduled. 152 * ID of the current task scheduled.
153 */ 153 */
154static GNUNET_SCHEDULER_TaskIdentifier current_task; 154static GNUNET_SCHEDULER_TaskIdentifier ti_check_download;
155
156/**
157 * ID of the current task scheduled.
158 */
159static GNUNET_SCHEDULER_TaskIdentifier ti_download;
155 160
156/** 161/**
157 * ID of the current hostlist saving task scheduled. 162 * ID of the current hostlist saving task scheduled.
158 */ 163 */
159static GNUNET_SCHEDULER_TaskIdentifier saving_task; 164static GNUNET_SCHEDULER_TaskIdentifier ti_saving_task;
165
166/**
167 * ID of the current hostlist saving task scheduled.
168 */
169static GNUNET_SCHEDULER_TaskIdentifier ti_download_dispatcher_task;
170
160 171
161/** 172/**
162 * ID of the task checking the intervall between to hostlist tests 173 * ID of the task checking the intervall between to hostlist tests
163 */ 174 */
164static GNUNET_SCHEDULER_TaskIdentifier testing_intervall_task; 175static GNUNET_SCHEDULER_TaskIdentifier ti_testing_intervall_task;
165 176
166/** 177/**
167 * Amount of time we wait between hostlist downloads. 178 * Amount of time we wait between hostlist downloads.
@@ -748,7 +759,7 @@ run_multi ()
748 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 759 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
749 "Scheduling task for hostlist download using cURL\n"); 760 "Scheduling task for hostlist download using cURL\n");
750#endif 761#endif
751 current_task 762 ti_download
752 = GNUNET_SCHEDULER_add_select (sched, 763 = GNUNET_SCHEDULER_add_select (sched,
753 GNUNET_SCHEDULER_PRIORITY_DEFAULT, 764 GNUNET_SCHEDULER_PRIORITY_DEFAULT,
754 GNUNET_SCHEDULER_NO_TASK, 765 GNUNET_SCHEDULER_NO_TASK,
@@ -778,6 +789,8 @@ multi_ready (void *cls,
778 struct CURLMsg *msg; 789 struct CURLMsg *msg;
779 CURLMcode mret; 790 CURLMcode mret;
780 791
792
793 ti_download = GNUNET_SCHEDULER_NO_TASK;
781 if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) 794 if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
782 { 795 {
783#if DEBUG_HOSTLIST_CLIENT 796#if DEBUG_HOSTLIST_CLIENT
@@ -991,6 +1004,9 @@ static void
991download_dispatcher (void *cls, 1004download_dispatcher (void *cls,
992 const struct GNUNET_SCHEDULER_TaskContext *tc) 1005 const struct GNUNET_SCHEDULER_TaskContext *tc)
993{ 1006{
1007 ti_download_dispatcher_task = GNUNET_SCHEDULER_NO_TASK;
1008 if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
1009 return;
994 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1010 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
995 "Download is initiated...\n"); 1011 "Download is initiated...\n");
996 if ( GNUNET_NO == download_in_progress ) 1012 if ( GNUNET_NO == download_in_progress )
@@ -1003,10 +1019,10 @@ download_dispatcher (void *cls,
1003 { 1019 {
1004 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1020 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1005 "Download in progess, have to wait...\n"); 1021 "Download in progess, have to wait...\n");
1006 GNUNET_SCHEDULER_add_delayed (sched, 1022 ti_download_dispatcher_task = GNUNET_SCHEDULER_add_delayed (sched,
1007 WAITING_INTERVALL, 1023 WAITING_INTERVALL,
1008 &download_dispatcher, 1024 &download_dispatcher,
1009 NULL); 1025 NULL);
1010 } 1026 }
1011} 1027}
1012 1028
@@ -1019,15 +1035,15 @@ static void
1019check_task (void *cls, 1035check_task (void *cls,
1020 const struct GNUNET_SCHEDULER_TaskContext *tc) 1036 const struct GNUNET_SCHEDULER_TaskContext *tc)
1021{ 1037{
1022 current_task = GNUNET_SCHEDULER_NO_TASK; 1038 ti_check_download = GNUNET_SCHEDULER_NO_TASK;
1023 if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) 1039 if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
1024 return; 1040 return;
1025 1041
1026 if (connection_count < MIN_CONNECTIONS) 1042 if (connection_count < MIN_CONNECTIONS)
1027 { 1043 {
1028 GNUNET_SCHEDULER_add_now (sched, 1044 ti_download_dispatcher_task = GNUNET_SCHEDULER_add_now ( sched,
1029 &download_dispatcher, 1045 &download_dispatcher,
1030 NULL); 1046 NULL);
1031 } 1047 }
1032 1048
1033 static int once; 1049 static int once;
@@ -1060,7 +1076,7 @@ check_task (void *cls,
1060 connection_count, 1076 connection_count,
1061 MIN_CONNECTIONS, 1077 MIN_CONNECTIONS,
1062 (unsigned long long) delay.value); 1078 (unsigned long long) delay.value);
1063 current_task = GNUNET_SCHEDULER_add_delayed (sched, 1079 ti_check_download = GNUNET_SCHEDULER_add_delayed (sched,
1064 delay, 1080 delay,
1065 &check_task, 1081 &check_task,
1066 NULL); 1082 NULL);
@@ -1072,9 +1088,12 @@ check_task (void *cls,
1072 * tc TaskContext 1088 * tc TaskContext
1073 */ 1089 */
1074static void 1090static void
1075testing_intervall_reset (void *cls, 1091task_testing_intervall_reset (void *cls,
1076 const struct GNUNET_SCHEDULER_TaskContext *tc) 1092 const struct GNUNET_SCHEDULER_TaskContext *tc)
1077{ 1093{
1094 ti_testing_intervall_task = GNUNET_SCHEDULER_NO_TASK;
1095 if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
1096 return;
1078 testing_allowed = GNUNET_OK; 1097 testing_allowed = GNUNET_OK;
1079 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1098 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1080 "Testing new hostlist advertisements is allowed again\n"); 1099 "Testing new hostlist advertisements is allowed again\n");
@@ -1087,10 +1106,10 @@ testing_intervall_reset (void *cls,
1087 * tc TaskContext 1106 * tc TaskContext
1088 */ 1107 */
1089static void 1108static void
1090hostlist_saving_task (void *cls, 1109task_hostlist_saving (void *cls,
1091 const struct GNUNET_SCHEDULER_TaskContext *tc) 1110 const struct GNUNET_SCHEDULER_TaskContext *tc)
1092{ 1111{
1093 saving_task = GNUNET_SCHEDULER_NO_TASK; 1112 ti_saving_task = GNUNET_SCHEDULER_NO_TASK;
1094 if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) 1113 if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
1095 return; 1114 return;
1096 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 1115 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
@@ -1100,9 +1119,9 @@ hostlist_saving_task (void *cls,
1100 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 1119 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1101 _("Hostlists will be saved to file again in %llums\n"), 1120 _("Hostlists will be saved to file again in %llums\n"),
1102 (unsigned long long) SAVING_INTERVALL.value); 1121 (unsigned long long) SAVING_INTERVALL.value);
1103 saving_task = GNUNET_SCHEDULER_add_delayed (sched, 1122 ti_saving_task = GNUNET_SCHEDULER_add_delayed (sched,
1104 SAVING_INTERVALL, 1123 SAVING_INTERVALL,
1105 &hostlist_saving_task, 1124 &task_hostlist_saving,
1106 NULL); 1125 NULL);
1107} 1126}
1108 1127
@@ -1115,7 +1134,7 @@ hostlist_saving_task (void *cls,
1115 * @param distance reported distance (DV) to 'other' 1134 * @param distance reported distance (DV) to 'other'
1116 */ 1135 */
1117static void 1136static void
1118connect_handler (void *cls, 1137handler_connect (void *cls,
1119 const struct 1138 const struct
1120 GNUNET_PeerIdentity * peer, 1139 GNUNET_PeerIdentity * peer,
1121 struct GNUNET_TIME_Relative latency, 1140 struct GNUNET_TIME_Relative latency,
@@ -1136,7 +1155,7 @@ connect_handler (void *cls,
1136 * @param peer peer identity this notification is about 1155 * @param peer peer identity this notification is about
1137 */ 1156 */
1138static void 1157static void
1139disconnect_handler (void *cls, 1158handler_disconnect (void *cls,
1140 const struct 1159 const struct
1141 GNUNET_PeerIdentity * peer) 1160 GNUNET_PeerIdentity * peer)
1142{ 1161{
@@ -1159,7 +1178,7 @@ disconnect_handler (void *cls,
1159 * GNUNET_SYSERR to close it (signal serious error) 1178 * GNUNET_SYSERR to close it (signal serious error)
1160 */ 1179 */
1161static int 1180static int
1162advertisement_handler (void *cls, 1181handler_advertisement (void *cls,
1163 const struct GNUNET_PeerIdentity * peer, 1182 const struct GNUNET_PeerIdentity * peer,
1164 const struct GNUNET_MessageHeader * message, 1183 const struct GNUNET_MessageHeader * message,
1165 struct GNUNET_TIME_Relative latency, 1184 struct GNUNET_TIME_Relative latency,
@@ -1221,16 +1240,16 @@ advertisement_handler (void *cls,
1221 1240
1222 testing_hostlist = GNUNET_YES; 1241 testing_hostlist = GNUNET_YES;
1223 testing_allowed = GNUNET_NO; 1242 testing_allowed = GNUNET_NO;
1224 testing_intervall_task = GNUNET_SCHEDULER_add_delayed (sched, 1243 ti_testing_intervall_task = GNUNET_SCHEDULER_add_delayed (sched,
1225 TESTING_INTERVALL, 1244 TESTING_INTERVALL,
1226 &testing_intervall_reset, 1245 &task_testing_intervall_reset,
1227 NULL); 1246 NULL);
1228 1247
1229 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1248 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1230 "Testing new hostlist advertisements is locked for the next %u ms\n", 1249 "Testing new hostlist advertisements is locked for the next %u ms\n",
1231 TESTING_INTERVALL); 1250 TESTING_INTERVALL);
1232 1251
1233 testing_intervall_task = GNUNET_SCHEDULER_add_now (sched, 1252 ti_download_dispatcher_task = GNUNET_SCHEDULER_add_now (sched,
1234 &download_dispatcher, 1253 &download_dispatcher,
1235 NULL); 1254 NULL);
1236 1255
@@ -1256,7 +1275,7 @@ primary_task (void *cls, int success)
1256 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1275 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1257 "Statistics request done, scheduling hostlist download\n"); 1276 "Statistics request done, scheduling hostlist download\n");
1258#endif 1277#endif
1259 current_task = GNUNET_SCHEDULER_add_now (sched, 1278 ti_check_download = GNUNET_SCHEDULER_add_now (sched,
1260 &check_task, 1279 &check_task,
1261 NULL); 1280 NULL);
1262} 1281}
@@ -1494,8 +1513,8 @@ GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c,
1494 &proxy)) 1513 &proxy))
1495 proxy = NULL; 1514 proxy = NULL;
1496 learning = learn; 1515 learning = learn;
1497 *ch = &connect_handler; 1516 *ch = &handler_connect;
1498 *dh = &disconnect_handler; 1517 *dh = &handler_disconnect;
1499 linked_list_head = NULL; 1518 linked_list_head = NULL;
1500 linked_list_tail = NULL; 1519 linked_list_tail = NULL;
1501 use_preconfigured_list = GNUNET_YES; 1520 use_preconfigured_list = GNUNET_YES;
@@ -1504,16 +1523,16 @@ GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c,
1504 1523
1505 if ( GNUNET_YES == learning ) 1524 if ( GNUNET_YES == learning )
1506 { 1525 {
1507 *msgh = &advertisement_handler; 1526 *msgh = &handler_advertisement;
1508 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 1527 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1509 _("Learning is enabled on this peer\n")); 1528 _("Learning is enabled on this peer\n"));
1510 load_hostlist_file (); 1529 load_hostlist_file ();
1511 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 1530 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1512 _("Hostlists will be saved to file again in %llums\n"), 1531 _("Hostlists will be saved to file again in %llums\n"),
1513 (unsigned long long) SAVING_INTERVALL.value); 1532 (unsigned long long) SAVING_INTERVALL.value);
1514 saving_task = GNUNET_SCHEDULER_add_delayed (sched, 1533 ti_saving_task = GNUNET_SCHEDULER_add_delayed (sched,
1515 SAVING_INTERVALL, 1534 SAVING_INTERVALL,
1516 &hostlist_saving_task, 1535 &task_hostlist_saving,
1517 NULL); 1536 NULL);
1518 } 1537 }
1519 else 1538 else
@@ -1563,10 +1582,31 @@ GNUNET_HOSTLIST_client_stop ()
1563 if ( GNUNET_YES == learning ) 1582 if ( GNUNET_YES == learning )
1564 save_hostlist_file ( GNUNET_YES ); 1583 save_hostlist_file ( GNUNET_YES );
1565 1584
1566 if (current_task != GNUNET_SCHEDULER_NO_TASK) 1585 if (ti_saving_task != GNUNET_SCHEDULER_NO_TASK)
1586 {
1587 GNUNET_SCHEDULER_cancel (sched,
1588 ti_saving_task);
1589 }
1590
1591 if (ti_download_dispatcher_task != GNUNET_SCHEDULER_NO_TASK)
1592 {
1593 GNUNET_SCHEDULER_cancel (sched,
1594 ti_download_dispatcher_task);
1595 }
1596 if (ti_testing_intervall_task != GNUNET_SCHEDULER_NO_TASK)
1597 {
1598 GNUNET_SCHEDULER_cancel (sched,
1599 ti_testing_intervall_task);
1600 }
1601 if (ti_download != GNUNET_SCHEDULER_NO_TASK)
1602 {
1603 GNUNET_SCHEDULER_cancel (sched,
1604 ti_download);
1605 }
1606 if (ti_check_download != GNUNET_SCHEDULER_NO_TASK)
1567 { 1607 {
1568 GNUNET_SCHEDULER_cancel (sched, 1608 GNUNET_SCHEDULER_cancel (sched,
1569 current_task); 1609 ti_check_download);
1570 curl_global_cleanup (); 1610 curl_global_cleanup ();
1571 } 1611 }
1572 if (transport != NULL) 1612 if (transport != NULL)