Changeset 5303

Show
Ignore:
Timestamp:
02/22/08 10:56:44 (5 months ago)
Author:
morris
Message:

Decay transfers by individual timers after 10 seconds instead of on a shared timer

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • wired/trunk/wired/main.c

    r5301 r5303  
    271271        wd_users_schedule(); 
    272272        wd_trackers_schedule(); 
    273         wd_transfers_schedule(); 
    274273        wd_server_create_threads(); 
    275274        wd_write_pid(); 
  • wired/trunk/wired/server.c

    r5196 r5303  
    414414                        transfer->socket = wi_retain(socket); 
    415415                         
     416                        wi_timer_invalidate(transfer->timer); 
     417                         
    416418                        /* spawn a transfer thread */ 
    417419                        if(!wi_thread_create_thread(wd_transfer_thread, transfer)) 
  • wired/trunk/wired/transfers.c

    r4806 r5303  
    4444 
    4545#define WD_TRANSFERS_TIMER_INTERVAL             60.0 
    46 #define WD_TRANSFERS_WAITING_INTERVAL   20.0 
     46#define WD_TRANSFERS_WAITING_INTERVAL   10.0 
    4747 
    4848#define WD_TRANSFER_BUFFER_SIZE                 8192 
    4949 
    50  
    51 static void                                                             wd_transfers_update_waiting(wi_timer_t *); 
    5250 
    5351static void                                                             wd_transfers_update_queue(void); 
     
    6159static wi_string_t *                                    wd_transfer_description(wi_runtime_instance_t *); 
    6260 
     61static void                                                             wd_transfer_expire_timer(wi_timer_t *); 
    6362static void                                                             wd_transfer_set_state(wd_transfer_t *, wd_transfer_state_t); 
    6463 
     
    9291        wd_transfers = wi_array_init(wi_array_alloc()); 
    9392 
    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          
    9993        wd_transfers_status_lock = wi_lock_init(wi_lock_alloc()); 
    10094        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(); 
    15595} 
    15696 
     
    402342                                        wd_user_unlock_socket(transfer->user); 
    403343                                         
     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                                         
    404351                                        if(transfer->type == WD_TRANSFER_DOWNLOAD) { 
    405352                                                wd_transfers_active_downloads++; 
     
    493440        wi_release(transfer->user); 
    494441        wi_release(transfer->hash); 
     442        wi_release(transfer->timer); 
    495443 
    496444        wi_release(transfer->path); 
     
    515463 
    516464#pragma mark - 
     465 
     466static 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 
    517491 
    518492static void wd_transfer_set_state(wd_transfer_t *transfer, wd_transfer_state_t state) { 
  • wired/trunk/wired/transfers.h

    r4750 r5303  
    6161        wd_user_t                                                       *user; 
    6262        wi_string_t                                                     *hash; 
     63        wi_timer_t                                                      *timer; 
    6364 
    6465        wi_string_t                                                     *path; 
     
    8283 
    8384void                                                                    wd_transfers_init(void); 
    84 void                                                                    wd_transfers_schedule(void); 
    8585 
    8686void                                                                    wd_transfers_queue_download(wi_string_t *, wi_file_offset_t);