Changeset 5303
- Timestamp:
- 02/22/08 10:56:44 (5 months ago)
- Files:
-
- wired/trunk/wired/main.c (modified) (1 diff)
- wired/trunk/wired/server.c (modified) (1 diff)
- wired/trunk/wired/transfers.c (modified) (6 diffs)
- wired/trunk/wired/transfers.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
wired/trunk/wired/main.c
r5301 r5303 271 271 wd_users_schedule(); 272 272 wd_trackers_schedule(); 273 wd_transfers_schedule();274 273 wd_server_create_threads(); 275 274 wd_write_pid(); wired/trunk/wired/server.c
r5196 r5303 414 414 transfer->socket = wi_retain(socket); 415 415 416 wi_timer_invalidate(transfer->timer); 417 416 418 /* spawn a transfer thread */ 417 419 if(!wi_thread_create_thread(wd_transfer_thread, transfer)) wired/trunk/wired/transfers.c
r4806 r5303 44 44 45 45 #define WD_TRANSFERS_TIMER_INTERVAL 60.0 46 #define WD_TRANSFERS_WAITING_INTERVAL 20.046 #define WD_TRANSFERS_WAITING_INTERVAL 10.0 47 47 48 48 #define WD_TRANSFER_BUFFER_SIZE 8192 49 49 50 51 static void wd_transfers_update_waiting(wi_timer_t *);52 50 53 51 static void wd_transfers_update_queue(void); … … 61 59 static wi_string_t * wd_transfer_description(wi_runtime_instance_t *); 62 60 61 static void wd_transfer_expire_timer(wi_timer_t *); 63 62 static void wd_transfer_set_state(wd_transfer_t *, wd_transfer_state_t); 64 63 … … 92 91 wd_transfers = wi_array_init(wi_array_alloc()); 93 92 94 wd_transfers_timer = wi_timer_init_with_function(wi_timer_alloc(),95 wd_transfers_update_waiting,96 WD_TRANSFERS_TIMER_INTERVAL,97 true);98 99 93 wd_transfers_status_lock = wi_lock_init(wi_lock_alloc()); 100 94 wd_transfers_update_queue_lock = wi_lock_init(wi_lock_alloc()); 101 }102 103 104 105 void wd_transfers_schedule(void) {106 wi_timer_schedule(wd_transfers_timer);107 }108 109 110 111 static void wd_transfers_update_waiting(wi_timer_t *timer) {112 wd_transfer_t *transfer;113 wi_time_interval_t interval;114 wi_boolean_t update = false;115 wi_uinteger_t i, count;116 117 wi_array_wrlock(wd_transfers);118 119 count = wi_array_count(wd_transfers);120 121 if(count > 0) {122 interval = wi_time_interval();123 124 for(i = 0; i < count; i++) {125 transfer = WI_ARRAY(wd_transfers, i);126 127 if(transfer->state == WD_TRANSFER_WAITING) {128 if(transfer->waiting_time + WD_TRANSFERS_WAITING_INTERVAL < interval) {129 wi_lock_lock(wd_transfers_status_lock);130 131 if(transfer->type == WD_TRANSFER_DOWNLOAD) {132 wd_transfers_active_downloads--;133 wd_user_decrease_downloads(transfer->user);134 } else {135 wd_transfers_active_uploads--;136 wd_user_decrease_uploads(transfer->user);137 }138 139 wi_lock_unlock(wd_transfers_status_lock);140 141 wi_array_remove_data_at_index(wd_transfers, i);142 143 count--;144 i--;145 update = true;146 }147 }148 }149 }150 151 wi_array_unlock(wd_transfers);152 153 if(update)154 wd_transfers_update_queue();155 95 } 156 96 … … 402 342 wd_user_unlock_socket(transfer->user); 403 343 344 transfer->timer = wi_timer_init_with_function(wi_timer_alloc(), 345 wd_transfer_expire_timer, 346 WD_TRANSFERS_WAITING_INTERVAL, 347 false); 348 wi_timer_set_data(transfer->timer, transfer); 349 wi_timer_schedule(transfer->timer); 350 404 351 if(transfer->type == WD_TRANSFER_DOWNLOAD) { 405 352 wd_transfers_active_downloads++; … … 493 440 wi_release(transfer->user); 494 441 wi_release(transfer->hash); 442 wi_release(transfer->timer); 495 443 496 444 wi_release(transfer->path); … … 515 463 516 464 #pragma mark - 465 466 static void wd_transfer_expire_timer(wi_timer_t *timer) { 467 wd_transfer_t *transfer; 468 469 transfer = wi_timer_data(timer); 470 471 wi_lock_lock(wd_transfers_status_lock); 472 473 if(transfer->type == WD_TRANSFER_DOWNLOAD) { 474 wd_transfers_active_downloads--; 475 wd_user_decrease_downloads(transfer->user); 476 } else { 477 wd_transfers_active_uploads--; 478 wd_user_decrease_uploads(transfer->user); 479 } 480 481 wi_lock_unlock(wd_transfers_status_lock); 482 483 wi_array_wrlock(wd_transfers); 484 wi_array_remove_data(wd_transfers, transfer); 485 wi_array_unlock(wd_transfers); 486 487 wd_transfers_update_queue(); 488 } 489 490 517 491 518 492 static void wd_transfer_set_state(wd_transfer_t *transfer, wd_transfer_state_t state) { wired/trunk/wired/transfers.h
r4750 r5303 61 61 wd_user_t *user; 62 62 wi_string_t *hash; 63 wi_timer_t *timer; 63 64 64 65 wi_string_t *path; … … 82 83 83 84 void wd_transfers_init(void); 84 void wd_transfers_schedule(void);85 85 86 86 void wd_transfers_queue_download(wi_string_t *, wi_file_offset_t);
