Changeset 4394
- Timestamp:
- 10/01/06 13:14:34 (2 years ago)
- Files:
-
- trackerd/trunk/trackerd/commands.c (modified) (2 diffs)
- trackerd/trunk/trackerd/servers.c (modified) (13 diffs)
- trackerd/trunk/trackerd/servers.h (modified) (1 diff)
- trackerd/trunk/trackerd/settings.c (modified) (1 diff)
- trackerd/trunk/trackerd/settings.h (modified) (1 diff)
- trackerd/trunk/trackerd/tracker.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trackerd/trunk/trackerd/commands.c
r3991 r4394 283 283 static void wt_cmd_register(wi_array_t *arguments) { 284 284 wt_client_t *client = wt_client(); 285 wi_ list_t *list;286 wi_ list_node_t *node;285 wi_enumerator_t *enumerator; 286 wi_array_t *array; 287 287 wi_address_t *address, *hostaddress; 288 288 wi_url_t *url; … … 332 332 /* look up and compare with source address */ 333 333 passed = false; 334 list= wi_host_addresses(wi_host_with_string(hostname));334 array = wi_host_addresses(wi_host_with_string(hostname)); 335 335 336 if(list) { 337 WI_LIST_FOREACH(list, node, hostaddress) { 336 if(array) { 337 enumerator = wi_array_data_enumerator(array); 338 339 while((hostaddress = wi_enumerator_next_data(enumerator))) { 338 340 if(wi_is_equal(hostaddress, address)) { 339 341 passed = true; trackerd/trunk/trackerd/servers.c
r4024 r4394 82 82 static wi_timer_t *wt_servers_timer; 83 83 84 wi_list_t *wt_servers; 85 84 wi_array_t *wt_servers; 86 85 87 86 static wi_runtime_id_t wt_server_runtime_id = WI_RUNTIME_ID_NULL; … … 99 98 wt_server_runtime_id = wi_runtime_register_class(&wt_server_runtime_class); 100 99 101 wt_servers = wi_ list_init(wi_list_alloc());100 wt_servers = wi_array_init(wi_array_alloc()); 102 101 103 102 wt_servers_lock = wi_lock_init(wi_lock_alloc()); … … 160 159 interval = wi_time_interval(); 161 160 162 wi_ list_wrlock(wt_servers);161 wi_array_wrlock(wt_servers); 163 162 while((fread(&server_packed, sizeof(wt_server_packed_t), 1, fp)) > 0) { 164 163 update = server_packed.update_time > 0 ? server_packed.update_time : server_packed.register_time; … … 174 173 wi_lock_unlock(wt_status_lock); 175 174 176 wi_ list_append_data(wt_servers, server);175 wi_array_add_data(wt_servers, server); 177 176 wi_release(server); 178 177 … … 180 179 } 181 180 } 182 wi_ list_unlock(wt_servers);181 wi_array_unlock(wt_servers); 183 182 184 183 if(count > 0) { … … 205 204 static uint32_t version = WT_SERVER_VERSION; 206 205 FILE *fp; 207 wi_ list_node_t *node;206 wi_enumerator_t *enumerator; 208 207 wt_server_t *server; 209 208 wt_server_packed_t server_packed; … … 222 221 fwrite(&version, 4, 1, fp); 223 222 224 wi_list_rdlock(wt_servers); 225 WI_LIST_FOREACH(wt_servers, node, server) { 223 wi_array_rdlock(wt_servers); 224 225 enumerator = wi_array_data_enumerator(wt_servers); 226 227 while((server = wi_enumerator_next_data(enumerator))) { 226 228 server_packed = wt_server_packed(server); 227 229 fwrite(&server_packed, sizeof(wt_server_packed_t), 1, fp); 228 230 } 229 wi_list_unlock(wt_servers); 231 232 wi_array_unlock(wt_servers); 230 233 231 234 fclose(fp); … … 238 241 239 242 static void wt_update_servers(wi_timer_t *timer) { 240 wi_list_node_t *node, *next_node;241 243 wt_server_t *server; 242 244 wi_time_interval_t interval, update; 243 unsigned int count = 0; 244 245 if(wi_list_count(wt_servers) > 0) { 246 interval = wi_time_interval(); 247 248 wi_list_rdlock(wt_servers); 249 for(node = wi_list_first_node(wt_servers); node; node = next_node) { 250 next_node = wi_list_node_next_node(node); 251 server = wi_list_node_data(node); 252 update = server->update_time > 0.0 ? server->update_time : server->register_time; 253 254 if(interval - update > wt_settings.minupdatetime) { 255 wi_log_warn(WI_STR("Deleting \"%@\" with URL %@: Last update %.0f seconds ago considered too slow"), 256 server->name, server->url, interval - update); 257 258 wt_server_stats_remove(server); 259 wi_list_remove_node(wt_servers, node); 260 261 count++; 262 } 263 } 264 wi_list_unlock(wt_servers); 265 266 if(count > 0) { 267 wi_lock_lock(wt_status_lock); 268 wt_write_status(true); 269 wi_lock_unlock(wt_status_lock); 270 271 wt_write_servers(); 272 } 245 wi_boolean_t changed = false; 246 uint32_t i, count; 247 248 wi_array_rdlock(wt_servers); 249 250 count = wi_array_count(wt_servers); 251 interval = wi_time_interval(); 252 253 for(i = 0; i < count; i++) { 254 server = WI_ARRAY(wt_servers, i); 255 update = server->update_time > 0.0 ? server->update_time : server->register_time; 256 257 if(interval - update > wt_settings.minupdatetime) { 258 wi_log_warn(WI_STR("Deleting \"%@\" with URL %@: Last update %.0f seconds ago considered too slow"), 259 server->name, server->url, interval - update); 260 261 wt_server_stats_remove(server); 262 263 wi_array_remove_data_at_index(wt_servers, i); 264 265 count--; 266 i--; 267 changed = true; 268 } 269 } 270 271 wi_array_unlock(wt_servers); 272 273 if(changed) { 274 wi_lock_lock(wt_status_lock); 275 wt_write_status(true); 276 wi_lock_unlock(wt_status_lock); 277 278 wt_write_servers(); 273 279 } 274 280 } … … 285 291 286 292 wt_server_t * wt_server_init(wt_server_t *server) { 287 wi_ list_wrlock(wt_servers);288 wi_ list_append_data(wt_servers, server);289 wi_ list_unlock(wt_servers);293 wi_array_wrlock(wt_servers); 294 wi_array_add_data(wt_servers, server); 295 wi_array_unlock(wt_servers); 290 296 291 297 wi_lock_lock(wt_status_lock); … … 375 381 376 382 wt_server_t * wt_server_with_ip(wi_string_t *ip) { 377 wi_ list_node_t *node;383 wi_enumerator_t *enumerator; 378 384 wt_server_t *server, *value = NULL; 379 385 380 wi_list_rdlock(wt_servers); 381 WI_LIST_FOREACH(wt_servers, node, server) { 386 wi_array_rdlock(wt_servers); 387 388 enumerator = wi_array_data_enumerator(wt_servers); 389 390 while((server = wi_enumerator_next_data(enumerator))) { 382 391 if(wi_is_equal(server->ip, ip)) { 383 392 value = server; … … 386 395 } 387 396 } 388 wi_list_unlock(wt_servers); 397 398 wi_array_unlock(wt_servers); 389 399 390 400 return value; … … 394 404 395 405 wt_server_t * wt_server_with_key(wi_string_t *key) { 396 wi_ list_node_t *node;406 wi_enumerator_t *enumerator; 397 407 wt_server_t *server, *value = NULL; 398 408 399 wi_list_rdlock(wt_servers); 400 WI_LIST_FOREACH(wt_servers, node, server) { 409 wi_array_rdlock(wt_servers); 410 411 enumerator = wi_array_data_enumerator(wt_servers); 412 413 while((server = wi_enumerator_next_data(enumerator))) { 401 414 if(wi_is_equal(server->key, key)) { 402 415 value = server; … … 405 418 } 406 419 } 407 wi_list_unlock(wt_servers); 420 421 wi_array_unlock(wt_servers); 408 422 409 423 return value; trackerd/trunk/trackerd/servers.h
r4024 r4394 76 76 77 77 78 extern wi_ list_t *wt_servers;78 extern wi_array_t *wt_servers; 79 79 80 80 #endif /* WT_SERVERS_H */ trackerd/trunk/trackerd/settings.c
r3947 r4394 42 42 43 43 static wi_settings_spec_t wt_wi_settings_spec[] = { 44 { "address", WI_SETTINGS_STRING_ LIST, &wt_settings.address },44 { "address", WI_SETTINGS_STRING_ARRAY, &wt_settings.address }, 45 45 { "allow multiple", WI_SETTINGS_BOOL, &wt_settings.allowmultiple }, 46 46 { "banlist", WI_SETTINGS_PATH, &wt_settings.banlist }, trackerd/trunk/trackerd/settings.h
r3947 r4394 40 40 wi_string_t *name; 41 41 wi_string_t *description; 42 wi_ list_t *address;42 wi_array_t *address; 43 43 unsigned int port; 44 44 trackerd/trunk/trackerd/tracker.c
r3947 r4394 44 44 45 45 46 static wi_ list_t *wt_tcp_sockets;47 static wi_ list_t *wt_udp_sockets;46 static wi_array_t *wt_tcp_sockets; 47 static wi_array_t *wt_udp_sockets; 48 48 49 49 static wi_socket_context_t *wt_socket_context; … … 51 51 52 52 void wt_init_tracker(void) { 53 wi_ list_t *list, *addresses;54 wi_ list_node_t *node, *next_node;53 wi_enumerator_t *enumerator; 54 wi_array_t *array, *addresses; 55 55 wi_address_t *address; 56 56 wi_socket_t *tcp_socket, *udp_socket; … … 58 58 wi_address_family_t family; 59 59 60 wt_tcp_sockets = wi_ list_init(wi_list_alloc());61 wt_udp_sockets = wi_ list_init(wi_list_alloc());62 addresses = wi_ list_init(wi_list_alloc());63 64 if(wi_ list_count(wt_settings.address) > 0) {60 wt_tcp_sockets = wi_array_init(wi_array_alloc()); 61 wt_udp_sockets = wi_array_init(wi_array_alloc()); 62 addresses = wi_array_init(wi_array_alloc()); 63 64 if(wi_array_count(wt_settings.address) > 0) { 65 65 /* listen on configured addresses */ 66 wi_list_rdlock(wt_settings.address); 67 WI_LIST_FOREACH(wt_settings.address, node, string) { 68 list = wi_host_addresses(wi_host_with_string(string)); 69 70 if(list) 71 wi_list_append_data_from_list(addresses, list); 66 wi_array_rdlock(wt_settings.address); 67 68 enumerator = wi_array_data_enumerator(wt_settings.address); 69 70 while((string = wi_enumerator_next_data(enumerator))) { 71 array = wi_host_addresses(wi_host_with_string(string)); 72 73 if(array) 74 wi_array_add_data_from_array(addresses, array); 72 75 else 73 76 wi_log_err(WI_STR("Could not resolve \"%@\": %m"), string); 74 77 } 75 wi_list_unlock(wt_settings.address); 78 79 wi_array_unlock(wt_settings.address); 76 80 } else { 77 81 /* add wildcard addresses */ 78 wi_ list_append_data(addresses, wi_address_wildcard_for_family(WI_ADDRESS_IPV4));79 wi_ list_append_data(addresses, wi_address_wildcard_for_family(WI_ADDRESS_IPV6));80 } 81 82 for(node = wi_list_first_node(addresses); node; node = next_node) {83 next_node = wi_list_node_next_node(node);84 address = wi_list_node_data(node);82 wi_array_add_data(addresses, wi_address_wildcard_for_family(WI_ADDRESS_IPV4)); 83 wi_array_add_data(addresses, wi_address_wildcard_for_family(WI_ADDRESS_IPV6)); 84 } 85 86 enumerator = wi_array_data_enumerator(addresses); 87 88 while((address = wi_enumerator_next_data(enumerator))) { 85 89 ip = wi_address_string(address); 86 90 family = wi_address_family(address); 87 tcp_socket = NULL;88 udp_socket = NULL;89 91 90 92 /* force address family? */ 91 93 if(wt_address_family != WI_ADDRESS_NULL && family != wt_address_family) 92 goto next;94 continue; 93 95 94 96 /* create sockets */ 95 97 wi_address_set_port(address, wt_settings.port); 96 98 97 tcp_socket = wi_ socket_init_with_address(wi_socket_alloc(), address, WI_SOCKET_TCP);98 udp_socket = wi_ socket_init_with_address(wi_socket_alloc(), address, WI_SOCKET_UDP);99 tcp_socket = wi_autorelease(wi_socket_init_with_address(wi_socket_alloc(), address, WI_SOCKET_TCP)); 100 udp_socket = wi_autorelease(wi_socket_init_with_address(wi_socket_alloc(), address, WI_SOCKET_UDP)); 99 101 100 102 if(!tcp_socket || !udp_socket) { 101 103 wi_log_warn(WI_STR("Could not create socket for %@: %m"), ip); 102 104 103 goto next;105 continue; 104 106 } 105 107 … … 111 113 ip, wi_address_port(wi_socket_address(tcp_socket))); 112 114 113 goto next;115 continue; 114 116 } 115 117 … … 118 120 ip, wi_address_port(wi_socket_address(udp_socket))); 119 121 120 goto next;122 continue; 121 123 } 122 124 123 125 /* add to list of sockets */ 124 wi_ list_append_data(wt_tcp_sockets, tcp_socket);125 wi_ list_append_data(wt_udp_sockets, udp_socket);126 wi_array_add_data(wt_tcp_sockets, tcp_socket); 127 wi_array_add_data(wt_udp_sockets, udp_socket); 126 128 127 129 wi_log_info(WI_STR("Listening on %@ port %d"), 128 130 ip, wt_settings.port); 129 130 next: 131 wi_release(tcp_socket); 132 wi_release(udp_socket); 133 } 134 135 if(wi_list_count(wt_tcp_sockets) == 0 || wi_list_count(wt_udp_sockets) == 0) 131 } 132 133 if(wi_array_count(wt_tcp_sockets) == 0 || wi_array_count(wt_udp_sockets) == 0) 136 134 wi_log_err(WI_STR("No addresses available for listening")); 137 135
