Changeset 4467

Show
Ignore:
Timestamp:
02/01/07 13:28:58 (2 years ago)
Author:
morris
Message:

Prevent potential deadlocks

Files:

Legend:

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

    r4426 r4467  
    295295                                wd_transfer_set_state(transfer, WD_TRANSFER_STOP); 
    296296                                 
    297                                 wi_condition_lock_lock_when_condition(transfer->state_lock, WD_TRANSFER_STOPPED, 5.0); 
     297                                wi_condition_lock_lock_when_condition(transfer->state_lock, WD_TRANSFER_STOPPED, wi_time_interval() + 5.0); 
    298298                                wi_condition_lock_unlock(transfer->state_lock); 
    299299                                 
    300300                                wi_array_wrlock(wd_transfers); 
    301                         } else { 
     301                         
     302                                count--; 
     303                                i--; 
     304                        } 
     305                        else if(transfer->state != WD_TRANSFER_STOP) { 
    302306                                wi_array_remove_data_at_index(wd_transfers, i); 
    303307                                 
     
    354358        wi_uinteger_t           i, count; 
    355359 
     360        wi_hash_rdlock(wd_clients); 
    356361        wi_array_rdlock(wd_transfers); 
    357362         
     
    373378        } 
    374379 
    375         wi_hash_rdlock(wd_clients); 
    376          
    377380        enumerator = wi_hash_data_enumerator(wd_clients); 
    378381         
     
    459462        } 
    460463 
     464        wi_array_unlock(wd_transfers); 
    461465        wi_hash_unlock(wd_clients); 
    462         wi_array_unlock(wd_transfers); 
    463466} 
    464467 
     
    536539        wi_condition_lock_unlock_with_condition(transfer->state_lock, transfer->state); 
    537540} 
    538  
    539541 
    540542 
     
    733735        } 
    734736 
     737        wi_log_l(WI_STR("Sent %llu/%llu bytes of \"%@\" to %@/%@/%@"), 
     738                transfer->transferred - transfer->offset, 
     739                transfer->size, 
     740                transfer->path, 
     741                transfer->client->nick, transfer->client->login, transfer->client->ip); 
     742         
    735743        /* update status */ 
    736744        wd_transfer_set_state(transfer, WD_TRANSFER_STOPPED); 
     
    740748        wd_write_status(true); 
    741749        wi_lock_unlock(wd_status_lock); 
    742  
    743         wi_log_l(WI_STR("Sent %llu/%llu bytes of \"%@\" to %@/%@/%@"), 
    744                 transfer->transferred - transfer->offset, 
    745                 transfer->size, 
    746                 transfer->path, 
    747                 transfer->client->nick, transfer->client->login, transfer->client->ip); 
    748750 
    749751end: 
     
    868870        } 
    869871 
     872        wi_log_l(WI_STR("Received %llu/%llu bytes of \"%@\" from %@/%@/%@"), 
     873                transfer->transferred - transfer->offset, 
     874                transfer->size, 
     875                transfer->path, 
     876                transfer->client->nick, transfer->client->login, transfer->client->ip); 
     877 
    870878        /* update status */ 
    871879        wd_transfer_set_state(transfer, WD_TRANSFER_STOPPED); 
     
    889897        } 
    890898 
    891         wi_log_l(WI_STR("Received %llu/%llu bytes of \"%@\" from %@/%@/%@"), 
    892                 transfer->transferred - transfer->offset, 
    893                 transfer->size, 
    894                 transfer->path, 
    895                 transfer->client->nick, transfer->client->login, transfer->client->ip); 
    896  
    897899end: 
    898900        wi_socket_close(transfer->socket);