diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2010-04-26 09:45:35 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2010-04-26 09:45:35 +0000 |
commit | 4de943d80f5ad59ac39e22381106a72c5f7d1cc0 (patch) | |
tree | 9e7e54d67ee2403826d90fe588a0b28f944a9793 /src | |
parent | 780d3b3b3e7eb3dc10aac17dd3ff307e22df552e (diff) | |
download | gnunet-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.c | 104 |
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 | */ |
154 | static GNUNET_SCHEDULER_TaskIdentifier current_task; | 154 | static GNUNET_SCHEDULER_TaskIdentifier ti_check_download; |
155 | |||
156 | /** | ||
157 | * ID of the current task scheduled. | ||
158 | */ | ||
159 | static 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 | */ |
159 | static GNUNET_SCHEDULER_TaskIdentifier saving_task; | 164 | static GNUNET_SCHEDULER_TaskIdentifier ti_saving_task; |
165 | |||
166 | /** | ||
167 | * ID of the current hostlist saving task scheduled. | ||
168 | */ | ||
169 | static 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 | */ |
164 | static GNUNET_SCHEDULER_TaskIdentifier testing_intervall_task; | 175 | static 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 | |||
991 | download_dispatcher (void *cls, | 1004 | download_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 | |||
1019 | check_task (void *cls, | 1035 | check_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 | */ |
1074 | static void | 1090 | static void |
1075 | testing_intervall_reset (void *cls, | 1091 | task_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 | */ |
1089 | static void | 1108 | static void |
1090 | hostlist_saving_task (void *cls, | 1109 | task_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 | */ |
1117 | static void | 1136 | static void |
1118 | connect_handler (void *cls, | 1137 | handler_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 | */ |
1138 | static void | 1157 | static void |
1139 | disconnect_handler (void *cls, | 1158 | handler_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 | */ |
1161 | static int | 1180 | static int |
1162 | advertisement_handler (void *cls, | 1181 | handler_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) |