Changeset a35b458 in mainline for kernel/generic/src/synch/spinlock.c
- Timestamp:
- 2018-03-02T20:10:49Z (6 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/synch/spinlock.c
r3061bc1 ra35b458 77 77 size_t i = 0; 78 78 bool deadlock_reported = false; 79 79 80 80 preemption_disable(); 81 81 while (test_and_set(&lock->val)) { … … 101 101 if (lock->name[0] == '*') 102 102 continue; 103 103 104 104 if (i++ > DEADLOCK_THRESHOLD) { 105 105 printf("cpu%u: looping on spinlock %p:%s, " … … 107 107 (void *) CALLER, symtab_fmt_name_lookup(CALLER)); 108 108 stack_trace(); 109 109 110 110 i = 0; 111 111 deadlock_reported = true; 112 112 } 113 113 } 114 114 115 115 if (deadlock_reported) 116 116 printf("cpu%u: not deadlocked\n", CPU->id); 117 117 118 118 /* 119 119 * Prevent critical section code from bleeding out this way up. … … 131 131 { 132 132 ASSERT_SPINLOCK(spinlock_locked(lock), lock); 133 133 134 134 /* 135 135 * Prevent critical section code from bleeding out this way down. 136 136 */ 137 137 CS_LEAVE_BARRIER(); 138 138 139 139 atomic_set(&lock->val, 0); 140 140 preemption_enable(); … … 157 157 preemption_disable(); 158 158 bool ret = !test_and_set(&lock->val); 159 159 160 160 /* 161 161 * Prevent critical section code from bleeding out this way up. 162 162 */ 163 163 CS_ENTER_BARRIER(); 164 164 165 165 if (!ret) 166 166 preemption_enable(); 167 167 168 168 return ret; 169 169 } … … 208 208 ipl_t ipl = interrupts_disable(); 209 209 spinlock_lock(&(lock->lock)); 210 210 211 211 lock->guard = true; 212 212 lock->ipl = ipl; 213 213 } else { 214 214 ASSERT_IRQ_SPINLOCK(interrupts_disabled(), lock); 215 215 216 216 spinlock_lock(&(lock->lock)); 217 217 ASSERT_IRQ_SPINLOCK(!lock->guard, lock); … … 231 231 { 232 232 ASSERT_IRQ_SPINLOCK(interrupts_disabled(), lock); 233 233 234 234 if (irq_res) { 235 235 ASSERT_IRQ_SPINLOCK(lock->guard, lock); 236 236 237 237 lock->guard = false; 238 238 ipl_t ipl = lock->ipl; 239 239 240 240 spinlock_unlock(&(lock->lock)); 241 241 interrupts_restore(ipl); … … 261 261 ASSERT_IRQ_SPINLOCK(interrupts_disabled(), lock); 262 262 bool ret = spinlock_trylock(&(lock->lock)); 263 263 264 264 ASSERT_IRQ_SPINLOCK((!ret) || (!lock->guard), lock); 265 265 return ret; … … 280 280 { 281 281 ASSERT_IRQ_SPINLOCK(interrupts_disabled(), unlock); 282 282 283 283 /* Pass guard from unlock to lock */ 284 284 bool guard = unlock->guard; 285 285 ipl_t ipl = unlock->ipl; 286 286 unlock->guard = false; 287 287 288 288 spinlock_unlock(&(unlock->lock)); 289 289 spinlock_lock(&(lock->lock)); 290 290 291 291 ASSERT_IRQ_SPINLOCK(!lock->guard, lock); 292 292 293 293 if (guard) { 294 294 lock->guard = true; … … 311 311 { 312 312 ASSERT_IRQ_SPINLOCK(interrupts_disabled(), unlock); 313 313 314 314 spinlock_lock(&(lock->lock)); 315 315 ASSERT_IRQ_SPINLOCK(!lock->guard, lock); 316 316 317 317 /* Pass guard from unlock to lock */ 318 318 if (unlock->guard) { … … 321 321 unlock->guard = false; 322 322 } 323 323 324 324 spinlock_unlock(&(unlock->lock)); 325 325 }
Note:
See TracChangeset
for help on using the changeset viewer.