Ignore:
File:
1 edited

Legend:

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

    r84b7384 r63f8966  
    4242#include <errno.h>
    4343#include <assert.h>
    44 #include <stacktrace.h>
    45 #include <stdlib.h>
    4644
    4745static void optimize_execution_power(void)
     
    5856}
    5957
    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 
    71 static void print_deadlock(fibril_owner_info_t *oi)
    72 {
    73         fibril_t *f = (fibril_t *) fibril_get_id();
    74 
    75         printf("Deadlock detected.\n");
    76         stacktrace_print();
    77 
    78         printf("Fibril %p waits for primitive %p.\n", f, oi);
    79 
    80         while (oi && oi->owned_by) {
    81                 printf("Primitive %p is owned by fibril %p.\n",
    82                     oi, oi->owned_by);
    83                 if (oi->owned_by == f)
    84                         break;
    85                 stacktrace_print_fp_pc(context_get_fp(&oi->owned_by->ctx),
    86                     oi->owned_by->ctx.pc);
    87                 printf("Fibril %p waits for primitive %p.\n",
    88                      oi->owned_by, oi->owned_by->waits_for);
    89                 oi = oi->owned_by->waits_for;
    90         }
    91 
    92         abort();
    93 }
    94 
    9558void fibril_mutex_initialize(fibril_mutex_t *fm)
    9659{
    97         fm->oi.owned_by = NULL;
    9860        fm->counter = 1;
    9961        list_initialize(&fm->waiters);
     
    10264void fibril_mutex_lock(fibril_mutex_t *fm)
    10365{
    104         fibril_t *f = (fibril_t *) fibril_get_id();
    105 
    10666        futex_down(&async_futex);
    10767        if (fm->counter-- <= 0) {
     
    11373                link_initialize(&wdata.wu_event.link);
    11474                list_append(&wdata.wu_event.link, &fm->waiters);
    115 
    116                 if (check_for_deadlock(&fm->oi))
    117                         print_deadlock(&fm->oi);
    118                 f->waits_for = &fm->oi;
    119 
    12075                fibril_switch(FIBRIL_TO_MANAGER);
    12176        } else {
    122                 fm->oi.owned_by = f;
    12377                futex_up(&async_futex);
    12478        }
     
    13286        if (fm->counter > 0) {
    13387                fm->counter--;
    134                 fm->oi.owned_by = (fibril_t *) fibril_get_id();
    13588                locked = true;
    13689        }
     
    14699                link_t *tmp;
    147100                awaiter_t *wdp;
    148                 fibril_t *f;
    149101       
    150102                assert(!list_empty(&fm->waiters));
     
    153105                wdp->active = true;
    154106                wdp->wu_event.inlist = false;
    155 
    156                 f = (fibril_t *) wdp->fid;
    157                 fm->oi.owned_by = f;
    158                 f->waits_for = NULL;
    159 
    160107                list_remove(&wdp->wu_event.link);
    161108                fibril_add_ready(wdp->fid);
    162109                optimize_execution_power();
    163         } else {
    164                 fm->oi.owned_by = NULL;
    165110        }
    166111}
     
    175120void fibril_rwlock_initialize(fibril_rwlock_t *frw)
    176121{
    177         frw->oi.owned_by = NULL;
    178122        frw->writers = 0;
    179123        frw->readers = 0;
Note: See TracChangeset for help on using the changeset viewer.