Changes in / [a66e2993:f4057f5] in mainline


Ignore:
File:
1 edited

Legend:

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

    ra66e2993 rf4057f5  
    5858}
    5959
     60static bool check_for_deadlock(fibril_owner_info_t *oi)
     61{
     62        while (oi && oi->owned_by) {
     63                if (oi->owned_by == (fibril_t *) fibril_get_id())
     64                        return true;
     65                oi = oi->owned_by->waits_for;
     66        }
     67
     68        return false;
     69}
     70
    6071static void print_deadlock(fibril_owner_info_t *oi)
    6172{
     
    7889                oi = oi->owned_by->waits_for;
    7990        }
    80 }
    81 
    82 
    83 static void check_for_deadlock(fibril_owner_info_t *oi)
    84 {
    85         while (oi && oi->owned_by) {
    86                 if (oi->owned_by == (fibril_t *) fibril_get_id()) {
    87                         print_deadlock(oi);
    88                         abort();
    89                 }
    90                 oi = oi->owned_by->waits_for;
    91         }
    92 }
    93 
     91
     92        abort();
     93}
    9494
    9595void fibril_mutex_initialize(fibril_mutex_t *fm)
     
    113113                link_initialize(&wdata.wu_event.link);
    114114                list_append(&wdata.wu_event.link, &fm->waiters);
    115                 check_for_deadlock(&fm->oi);
     115
     116                if (check_for_deadlock(&fm->oi))
     117                        print_deadlock(&fm->oi);
    116118                f->waits_for = &fm->oi;
     119
    117120                fibril_switch(FIBRIL_TO_MANAGER);
    118121        } else {
     
    191194                f->flags &= ~FIBRIL_WRITER;
    192195                list_append(&wdata.wu_event.link, &frw->waiters);
    193                 check_for_deadlock(&frw->oi);
    194                 f->waits_for = &frw->oi;
    195196                fibril_switch(FIBRIL_TO_MANAGER);
    196197        } else {
     
    202203void fibril_rwlock_write_lock(fibril_rwlock_t *frw)
    203204{
    204         fibril_t *f = (fibril_t *) fibril_get_id();
    205        
    206205        futex_down(&async_futex);
    207206        if (frw->writers || frw->readers) {
     207                fibril_t *f = (fibril_t *) fibril_get_id();
    208208                awaiter_t wdata;
    209209
     
    214214                f->flags |= FIBRIL_WRITER;
    215215                list_append(&wdata.wu_event.link, &frw->waiters);
    216                 check_for_deadlock(&frw->oi);
    217                 f->waits_for = &frw->oi;
    218216                fibril_switch(FIBRIL_TO_MANAGER);
    219217        } else {
    220                 frw->oi.owned_by = f;
    221218                frw->writers++;
    222219                futex_up(&async_futex);
     
    236233       
    237234        assert(!frw->readers && !frw->writers);
    238        
    239         frw->oi.owned_by = NULL;
    240235       
    241236        while (!list_empty(&frw->waiters)) {
     
    246241                wdp = list_get_instance(tmp, awaiter_t, wu_event.link);
    247242                f = (fibril_t *) wdp->fid;
    248                
    249                 f->waits_for = NULL;
    250243               
    251244                if (f->flags & FIBRIL_WRITER) {
     
    257250                        fibril_add_ready(wdp->fid);
    258251                        frw->writers++;
    259                         frw->oi.owned_by = f;
    260252                        optimize_execution_power();
    261253                        break;
Note: See TracChangeset for help on using the changeset viewer.