Changes in uspace/lib/c/generic/fibril_synch.c [9414abc:84b7384] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/fibril_synch.c
r9414abc r84b7384 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 { … … 180 183 void fibril_rwlock_read_lock(fibril_rwlock_t *frw) 181 184 { 182 fibril_t *f = (fibril_t *) fibril_get_id();183 184 185 futex_down(&async_futex); 185 186 if (frw->writers) { 187 fibril_t *f = (fibril_t *) fibril_get_id(); 186 188 awaiter_t wdata; 187 189 … … 192 194 f->flags &= ~FIBRIL_WRITER; 193 195 list_append(&wdata.wu_event.link, &frw->waiters); 194 check_for_deadlock(&frw->oi);195 f->waits_for = &frw->oi;196 196 fibril_switch(FIBRIL_TO_MANAGER); 197 197 } else { 198 /* Consider the first reader the owner. */ 199 if (frw->readers++ == 0) 200 frw->oi.owned_by = f; 198 frw->readers++; 201 199 futex_up(&async_futex); 202 200 } … … 205 203 void fibril_rwlock_write_lock(fibril_rwlock_t *frw) 206 204 { 207 fibril_t *f = (fibril_t *) fibril_get_id();208 209 205 futex_down(&async_futex); 210 206 if (frw->writers || frw->readers) { 207 fibril_t *f = (fibril_t *) fibril_get_id(); 211 208 awaiter_t wdata; 212 209 … … 217 214 f->flags |= FIBRIL_WRITER; 218 215 list_append(&wdata.wu_event.link, &frw->waiters); 219 check_for_deadlock(&frw->oi);220 f->waits_for = &frw->oi;221 216 fibril_switch(FIBRIL_TO_MANAGER); 222 217 } else { 223 frw->oi.owned_by = f;224 218 frw->writers++; 225 219 futex_up(&async_futex); … … 232 226 assert(frw->readers || (frw->writers == 1)); 233 227 if (frw->readers) { 234 if (--frw->readers) { 235 if (frw->oi.owned_by == (fibril_t *) fibril_get_id()) { 236 /* 237 * If this reader firbril was considered the 238 * owner of this rwlock, clear the ownership 239 * information even if there are still more 240 * readers. 241 * 242 * This is the limitation of the detection 243 * mechanism rooted in the fact that tracking 244 * all readers would require dynamically 245 * allocated memory for keeping linkage info. 246 */ 247 frw->oi.owned_by = NULL; 248 } 228 if (--frw->readers) 249 229 goto out; 250 }251 230 } else { 252 231 frw->writers--; … … 254 233 255 234 assert(!frw->readers && !frw->writers); 256 257 frw->oi.owned_by = NULL;258 235 259 236 while (!list_empty(&frw->waiters)) { … … 264 241 wdp = list_get_instance(tmp, awaiter_t, wu_event.link); 265 242 f = (fibril_t *) wdp->fid; 266 267 f->waits_for = NULL;268 243 269 244 if (f->flags & FIBRIL_WRITER) { … … 275 250 fibril_add_ready(wdp->fid); 276 251 frw->writers++; 277 frw->oi.owned_by = f;278 252 optimize_execution_power(); 279 253 break; … … 283 257 list_remove(&wdp->wu_event.link); 284 258 fibril_add_ready(wdp->fid); 285 if (frw->readers++ == 0) { 286 /* Consider the first reader the owner. */ 287 frw->oi.owned_by = f; 288 } 259 frw->readers++; 289 260 optimize_execution_power(); 290 261 }
Note:
See TracChangeset
for help on using the changeset viewer.