Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset a66e2993 in mainline


Ignore:
Timestamp:
2010-11-05T16:16:57Z (11 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master
Children:
0485135, 60898b6
Parents:
f4057f5 (diff), 55bd76c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge from lp:~jakub/helenos/deadlock-detection.

File:
1 edited

Legend:

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

    rf4057f5 ra66e2993  
    5858}
    5959
    60 static 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 
    7160static void print_deadlock(fibril_owner_info_t *oi)
    7261{
     
    8978                oi = oi->owned_by->waits_for;
    9079        }
    91 
    92         abort();
    93 }
     80}
     81
     82
     83static 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
    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 
    116                 if (check_for_deadlock(&fm->oi))
    117                         print_deadlock(&fm->oi);
     115                check_for_deadlock(&fm->oi);
    118116                f->waits_for = &fm->oi;
    119 
    120117                fibril_switch(FIBRIL_TO_MANAGER);
    121118        } else {
     
    194191                f->flags &= ~FIBRIL_WRITER;
    195192                list_append(&wdata.wu_event.link, &frw->waiters);
     193                check_for_deadlock(&frw->oi);
     194                f->waits_for = &frw->oi;
    196195                fibril_switch(FIBRIL_TO_MANAGER);
    197196        } else {
     
    203202void fibril_rwlock_write_lock(fibril_rwlock_t *frw)
    204203{
     204        fibril_t *f = (fibril_t *) fibril_get_id();
     205       
    205206        futex_down(&async_futex);
    206207        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;
    216218                fibril_switch(FIBRIL_TO_MANAGER);
    217219        } else {
     220                frw->oi.owned_by = f;
    218221                frw->writers++;
    219222                futex_up(&async_futex);
     
    233236       
    234237        assert(!frw->readers && !frw->writers);
     238       
     239        frw->oi.owned_by = NULL;
    235240       
    236241        while (!list_empty(&frw->waiters)) {
     
    241246                wdp = list_get_instance(tmp, awaiter_t, wu_event.link);
    242247                f = (fibril_t *) wdp->fid;
     248               
     249                f->waits_for = NULL;
    243250               
    244251                if (f->flags & FIBRIL_WRITER) {
     
    250257                        fibril_add_ready(wdp->fid);
    251258                        frw->writers++;
     259                        frw->oi.owned_by = f;
    252260                        optimize_execution_power();
    253261                        break;
Note: See TracChangeset for help on using the changeset viewer.