Changeset 6290

Show
Ignore:
Timestamp:
10/31/08 00:50:22 (2 months ago)
Author:
morris
Message:

Disconnect all transfers matching our key when the user is disconnected

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/P7/wired/wired/transfers.c

    r6150 r6290  
    7777static wi_timer_t                                               *wd_transfers_timer; 
    7878 
     79static wi_integer_t                                             wd_transfers_total_download_speed, wd_transfers_total_upload_speed; 
     80 
    7981static wi_lock_t                                                *wd_transfers_status_lock; 
    80 static wi_integer_t                                             wd_transfers_total_download_speed, wd_transfers_total_upload_speed; 
    8182static wi_dictionary_t                                  *wd_transfers_user_downloads, *wd_transfers_user_uploads; 
    8283static wi_uinteger_t                                    wd_transfers_active_downloads, wd_transfers_active_uploads; 
     
    241242                transfer->transaction = 0; 
    242243         
    243         wi_lock_lock(wd_transfers_update_queue_lock); 
     244        wd_user_set_transfer(user, transfer); 
    244245         
    245246        wi_array_wrlock(wd_transfers); 
     
    247248        wi_array_unlock(wd_transfers); 
    248249         
    249         wd_user_set_transfer(user, transfer); 
    250          
    251250        wd_transfers_update_queue(); 
    252  
    253         wi_lock_unlock(wd_transfers_update_queue_lock); 
    254251} 
    255252 
     
    296293                transfer->transaction = 0; 
    297294 
    298         wi_lock_lock(wd_transfers_update_queue_lock); 
    299  
     295        wd_user_set_transfer(user, transfer); 
     296         
    300297        wi_array_wrlock(wd_transfers); 
    301298        wi_array_add_data(wd_transfers, transfer); 
    302299        wi_array_unlock(wd_transfers); 
    303300         
    304         wd_user_set_transfer(user, transfer); 
    305          
    306301        wd_transfers_update_queue(); 
    307  
    308         wi_lock_unlock(wd_transfers_update_queue_lock); 
    309302} 
    310303 
     
    312305 
    313306void wd_transfers_remove_user(wd_user_t *user) { 
     307        wi_string_t             *key; 
    314308        wd_transfer_t   *transfer; 
     309        wi_uinteger_t   i, count; 
    315310        wi_boolean_t    update = false; 
    316  
    317         transfer = wd_user_transfer(user); 
    318          
    319         if(transfer) { 
    320                 wi_lock_lock(wd_transfers_update_queue_lock); 
    321                 wi_array_wrlock(wd_transfers); 
    322          
    323                 if(transfer->state == WD_TRANSFER_RUNNING) { 
    324                         wi_array_unlock(wd_transfers); 
    325                          
    326                         wd_transfer_set_state(transfer, WD_TRANSFER_STOP); 
    327                          
    328                         wi_condition_lock_lock_when_condition(transfer->state_lock, WD_TRANSFER_STOPPED, 1.0); 
    329                         wi_condition_lock_unlock(transfer->state_lock); 
    330                          
    331                         wi_array_wrlock(wd_transfers); 
    332                 } 
    333                 else if(transfer->state != WD_TRANSFER_STOP) { 
    334                         wi_array_remove_data(wd_transfers, transfer); 
    335  
    336                         update = true; 
    337                 } 
    338                  
    339                 wi_array_unlock(wd_transfers); 
    340                  
    341                 if(update) 
    342                         wd_transfers_update_queue(); 
    343                  
    344                 wi_lock_unlock(wd_transfers_update_queue_lock); 
    345         } 
    346  
    347         wd_user_set_transfer(user, NULL); 
     311         
     312        key = wd_transfers_transfer_key_for_user(user); 
     313         
     314        wi_array_wrlock(wd_transfers); 
     315         
     316        count = wi_array_count(wd_transfers); 
     317         
     318        for(i = 0; i < count; i++) { 
     319                transfer = wi_autorelease(wi_retain(WI_ARRAY(wd_transfers, i))); 
     320                 
     321                if(wi_is_equal(key, transfer->key)) { 
     322                        if(transfer->state == WD_TRANSFER_RUNNING || transfer->state == WD_TRANSFER_STOP) { 
     323                                wi_array_unlock(wd_transfers); 
     324                                 
     325                                wd_transfer_set_state(transfer, WD_TRANSFER_STOP); 
     326                                 
     327                                transfer->disconnected = true; 
     328                                 
     329                                wi_condition_lock_lock_when_condition(transfer->state_lock, WD_TRANSFER_STOPPED, 1.0); 
     330                                wi_condition_lock_unlock(transfer->state_lock); 
     331                                 
     332                                wi_array_wrlock(wd_transfers); 
     333                        } else { 
     334                                wi_array_remove_data(wd_transfers, transfer); 
     335                                wd_user_set_state(transfer->user, WD_USER_DISCONNECTED); 
     336 
     337                                update = true; 
     338                        } 
     339                } 
     340        } 
     341         
     342        wi_array_unlock(wd_transfers); 
     343         
     344        if(update) 
     345                wd_transfers_update_queue(); 
    348346} 
    349347 
     
    392390        wi_array_rdlock(wd_transfers); 
    393391        wi_lock_lock(wd_transfers_status_lock); 
     392        wi_lock_lock(wd_transfers_update_queue_lock); 
    394393         
    395394        total_downloads = wi_config_integer_for_name(wd_config, WI_STR("total downloads")); 
     
    494493        wi_release(users); 
    495494         
     495        wi_lock_unlock(wd_transfers_update_queue_lock); 
    496496        wi_lock_unlock(wd_transfers_status_lock); 
    497497        wi_array_unlock(wd_transfers); 
     
    654654        wd_user_set_transfer(transfer->user, NULL); 
    655655        wd_user_set_state(transfer->user, WD_USER_LOGGED_IN); 
    656  
    657         wi_lock_lock(wd_transfers_update_queue_lock); 
     656         
     657        if(transfer->disconnected) 
     658                wd_user_set_state(transfer->user, WD_USER_DISCONNECTED); 
    658659 
    659660        wi_array_wrlock(wd_transfers); 
     
    662663 
    663664        wd_transfers_update_queue(); 
    664  
    665         wi_lock_unlock(wd_transfers_update_queue_lock); 
    666665         
    667666        wi_release(pool); 
  • branches/P7/wired/wired/transfers.h

    r5627 r6290  
    6161        wi_p7_uint32_t                                          transaction; 
    6262        wi_string_t                                                     *key; 
     63        wi_boolean_t                                            disconnected; 
    6364 
    6465        wi_string_t                                                     *path;