Changeset 6290
- Timestamp:
- 10/31/08 00:50:22 (2 months ago)
- Files:
-
- branches/P7/wired/wired/transfers.c (modified) (9 diffs)
- branches/P7/wired/wired/transfers.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/P7/wired/wired/transfers.c
r6150 r6290 77 77 static wi_timer_t *wd_transfers_timer; 78 78 79 static wi_integer_t wd_transfers_total_download_speed, wd_transfers_total_upload_speed; 80 79 81 static wi_lock_t *wd_transfers_status_lock; 80 static wi_integer_t wd_transfers_total_download_speed, wd_transfers_total_upload_speed;81 82 static wi_dictionary_t *wd_transfers_user_downloads, *wd_transfers_user_uploads; 82 83 static wi_uinteger_t wd_transfers_active_downloads, wd_transfers_active_uploads; … … 241 242 transfer->transaction = 0; 242 243 243 w i_lock_lock(wd_transfers_update_queue_lock);244 wd_user_set_transfer(user, transfer); 244 245 245 246 wi_array_wrlock(wd_transfers); … … 247 248 wi_array_unlock(wd_transfers); 248 249 249 wd_user_set_transfer(user, transfer);250 251 250 wd_transfers_update_queue(); 252 253 wi_lock_unlock(wd_transfers_update_queue_lock);254 251 } 255 252 … … 296 293 transfer->transaction = 0; 297 294 298 w i_lock_lock(wd_transfers_update_queue_lock);299 295 wd_user_set_transfer(user, transfer); 296 300 297 wi_array_wrlock(wd_transfers); 301 298 wi_array_add_data(wd_transfers, transfer); 302 299 wi_array_unlock(wd_transfers); 303 300 304 wd_user_set_transfer(user, transfer);305 306 301 wd_transfers_update_queue(); 307 308 wi_lock_unlock(wd_transfers_update_queue_lock);309 302 } 310 303 … … 312 305 313 306 void wd_transfers_remove_user(wd_user_t *user) { 307 wi_string_t *key; 314 308 wd_transfer_t *transfer; 309 wi_uinteger_t i, count; 315 310 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(); 348 346 } 349 347 … … 392 390 wi_array_rdlock(wd_transfers); 393 391 wi_lock_lock(wd_transfers_status_lock); 392 wi_lock_lock(wd_transfers_update_queue_lock); 394 393 395 394 total_downloads = wi_config_integer_for_name(wd_config, WI_STR("total downloads")); … … 494 493 wi_release(users); 495 494 495 wi_lock_unlock(wd_transfers_update_queue_lock); 496 496 wi_lock_unlock(wd_transfers_status_lock); 497 497 wi_array_unlock(wd_transfers); … … 654 654 wd_user_set_transfer(transfer->user, NULL); 655 655 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); 658 659 659 660 wi_array_wrlock(wd_transfers); … … 662 663 663 664 wd_transfers_update_queue(); 664 665 wi_lock_unlock(wd_transfers_update_queue_lock);666 665 667 666 wi_release(pool); branches/P7/wired/wired/transfers.h
r5627 r6290 61 61 wi_p7_uint32_t transaction; 62 62 wi_string_t *key; 63 wi_boolean_t disconnected; 63 64 64 65 wi_string_t *path;
