Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/fibril_synch.c

    r5a5b087 r7f9d97f3  
    461461                        if (rc == ETIMEOUT && timer->state == fts_active) {
    462462                                timer->state = fts_fired;
    463                                 timer->handler_fid = fibril_get_id();
     463                                timer->handler_running = true;
    464464                                fibril_mutex_unlock(timer->lockp);
    465465                                timer->fun(timer->arg);
    466466                                fibril_mutex_lock(timer->lockp);
    467                                 timer->handler_fid = 0;
     467                                timer->handler_running = false;
    468468                        }
    469469                        break;
     
    477477        /* Acknowledge timer fibril has finished cleanup. */
    478478        timer->state = fts_clean;
    479         fibril_condvar_broadcast(&timer->cv);
    480479        fibril_mutex_unlock(timer->lockp);
     480        free(timer);
    481481
    482482        return 0;
     
    525525        timer->state = fts_cleanup;
    526526        fibril_condvar_broadcast(&timer->cv);
    527 
    528         /* Wait for timer fibril to terminate */
    529         while (timer->state != fts_clean)
    530                 fibril_condvar_wait(&timer->cv, timer->lockp);
    531527        fibril_mutex_unlock(timer->lockp);
    532 
    533         free(timer);
    534528}
    535529
     
    614608        assert(fibril_mutex_is_locked(timer->lockp));
    615609
    616         while (timer->handler_fid != 0) {
    617                 if (timer->handler_fid == fibril_get_id()) {
    618                         printf("Deadlock detected.\n");
    619                         stacktrace_print();
    620                         printf("Fibril %zx is trying to clear timer %p from "
    621                             "inside its handler %p.\n",
    622                             fibril_get_id(), timer, timer->fun);
    623                         abort();
    624                 }
    625 
     610        while (timer->handler_running)
    626611                fibril_condvar_wait(&timer->cv, timer->lockp);
    627         }
    628612
    629613        old_state = timer->state;
Note: See TracChangeset for help on using the changeset viewer.