Changes in / [a66e2993:f4057f5] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/fibril_synch.c
ra66e2993 rf4057f5 58 58 } 59 59 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 60 71 static void print_deadlock(fibril_owner_info_t *oi) 61 72 { … … 78 89 oi = oi->owned_by->waits_for; 79 90 } 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 } 94 94 95 95 void fibril_mutex_initialize(fibril_mutex_t *fm) … … 113 113 link_initialize(&wdata.wu_event.link); 114 114 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); 116 118 f->waits_for = &fm->oi; 119 117 120 fibril_switch(FIBRIL_TO_MANAGER); 118 121 } else { … … 191 194 f->flags &= ~FIBRIL_WRITER; 192 195 list_append(&wdata.wu_event.link, &frw->waiters); 193 check_for_deadlock(&frw->oi);194 f->waits_for = &frw->oi;195 196 fibril_switch(FIBRIL_TO_MANAGER); 196 197 } else { … … 202 203 void fibril_rwlock_write_lock(fibril_rwlock_t *frw) 203 204 { 204 fibril_t *f = (fibril_t *) fibril_get_id();205 206 205 futex_down(&async_futex); 207 206 if (frw->writers || frw->readers) { 207 fibril_t *f = (fibril_t *) fibril_get_id(); 208 208 awaiter_t wdata; 209 209 … … 214 214 f->flags |= FIBRIL_WRITER; 215 215 list_append(&wdata.wu_event.link, &frw->waiters); 216 check_for_deadlock(&frw->oi);217 f->waits_for = &frw->oi;218 216 fibril_switch(FIBRIL_TO_MANAGER); 219 217 } else { 220 frw->oi.owned_by = f;221 218 frw->writers++; 222 219 futex_up(&async_futex); … … 236 233 237 234 assert(!frw->readers && !frw->writers); 238 239 frw->oi.owned_by = NULL;240 235 241 236 while (!list_empty(&frw->waiters)) { … … 246 241 wdp = list_get_instance(tmp, awaiter_t, wu_event.link); 247 242 f = (fibril_t *) wdp->fid; 248 249 f->waits_for = NULL;250 243 251 244 if (f->flags & FIBRIL_WRITER) { … … 257 250 fibril_add_ready(wdp->fid); 258 251 frw->writers++; 259 frw->oi.owned_by = f;260 252 optimize_execution_power(); 261 253 break;
Note:
See TracChangeset
for help on using the changeset viewer.