Changeset 78192cc7 in mainline for uspace/lib/c/generic/fibril_synch.c
- Timestamp:
- 2014-07-13T14:06:23Z (11 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- af2a76c, f303f2cf
- Parents:
- c1b979a
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/fibril_synch.c
rc1b979a r78192cc7 448 448 int rc; 449 449 450 fibril_mutex_lock( &timer->lock);450 fibril_mutex_lock(timer->lockp); 451 451 452 452 while (timer->state != fts_cleanup) { … … 454 454 case fts_not_set: 455 455 case fts_fired: 456 fibril_condvar_wait(&timer->cv, &timer->lock);456 fibril_condvar_wait(&timer->cv, timer->lockp); 457 457 break; 458 458 case fts_active: 459 459 rc = fibril_condvar_wait_timeout(&timer->cv, 460 &timer->lock, timer->delay);460 timer->lockp, timer->delay); 461 461 if (rc == ETIMEOUT && timer->state == fts_active) { 462 462 timer->state = fts_fired; 463 fibril_mutex_unlock(&timer->lock); 463 timer->handler_running = true; 464 fibril_mutex_unlock(timer->lockp); 464 465 timer->fun(timer->arg); 465 fibril_mutex_lock(&timer->lock); 466 fibril_mutex_lock(timer->lockp); 467 timer->handler_running = false; 466 468 } 467 469 break; … … 475 477 /* Acknowledge timer fibril has finished cleanup. */ 476 478 timer->state = fts_clean; 477 fibril_ condvar_broadcast(&timer->cv);478 f ibril_mutex_unlock(&timer->lock);479 fibril_mutex_unlock(timer->lockp); 480 free(timer); 479 481 480 482 return 0; … … 485 487 * @return New timer on success, @c NULL if out of memory. 486 488 */ 487 fibril_timer_t *fibril_timer_create( void)489 fibril_timer_t *fibril_timer_create(fibril_mutex_t *lock) 488 490 { 489 491 fid_t fid; … … 505 507 timer->fibril = fid; 506 508 timer->state = fts_not_set; 509 timer->lockp = (lock != NULL) ? lock : &timer->lock; 507 510 508 511 fibril_add_ready(fid); 509 510 512 return timer; 511 513 } … … 517 519 void fibril_timer_destroy(fibril_timer_t *timer) 518 520 { 519 fibril_mutex_lock( &timer->lock);521 fibril_mutex_lock(timer->lockp); 520 522 assert(timer->state == fts_not_set || timer->state == fts_fired); 521 523 … … 523 525 timer->state = fts_cleanup; 524 526 fibril_condvar_broadcast(&timer->cv); 525 526 /* Wait for timer fibril to acknowledge. */ 527 while (timer->state != fts_clean) 528 fibril_condvar_wait(&timer->cv, &timer->lock); 529 530 fibril_mutex_unlock(&timer->lock); 527 fibril_mutex_unlock(timer->lockp); 531 528 } 532 529 … … 544 541 fibril_timer_fun_t fun, void *arg) 545 542 { 546 fibril_mutex_lock(&timer->lock); 543 fibril_mutex_lock(timer->lockp); 544 fibril_timer_set_locked(timer, delay, fun, arg); 545 fibril_mutex_unlock(timer->lockp); 546 } 547 548 /** Set locked timer. 549 * 550 * Set timer to execute a callback function after the specified 551 * interval. Must be called when the timer is locked. 552 * 553 * @param timer Timer 554 * @param delay Delay in microseconds 555 * @param fun Callback function 556 * @param arg Argument for @a fun 557 */ 558 void fibril_timer_set_locked(fibril_timer_t *timer, suseconds_t delay, 559 fibril_timer_fun_t fun, void *arg) 560 { 561 assert(fibril_mutex_is_locked(timer->lockp)); 547 562 assert(timer->state == fts_not_set || timer->state == fts_fired); 548 563 timer->state = fts_active; … … 551 566 timer->arg = arg; 552 567 fibril_condvar_broadcast(&timer->cv); 553 fibril_mutex_unlock(&timer->lock);554 568 } 555 569 … … 569 583 fibril_timer_state_t old_state; 570 584 571 fibril_mutex_lock(&timer->lock); 585 fibril_mutex_lock(timer->lockp); 586 old_state = fibril_timer_clear_locked(timer); 587 fibril_mutex_unlock(timer->lockp); 588 589 return old_state; 590 } 591 592 /** Clear locked timer. 593 * 594 * Clears (cancels) timer and returns last state of the timer. 595 * This can be one of: 596 * - fts_not_set If the timer has not been set or has been cleared 597 * - fts_active Timer was set but did not fire 598 * - fts_fired Timer fired 599 * Must be called when the timer is locked. 600 * 601 * @param timer Timer 602 * @return Last timer state 603 */ 604 fibril_timer_state_t fibril_timer_clear_locked(fibril_timer_t *timer) 605 { 606 fibril_timer_state_t old_state; 607 608 assert(fibril_mutex_is_locked(timer->lockp)); 609 610 while (timer->handler_running) 611 fibril_condvar_wait(&timer->cv, timer->lockp); 612 572 613 old_state = timer->state; 573 614 timer->state = fts_not_set; … … 577 618 timer->arg = NULL; 578 619 fibril_condvar_broadcast(&timer->cv); 579 fibril_mutex_unlock(&timer->lock);580 620 581 621 return old_state;
Note:
See TracChangeset
for help on using the changeset viewer.