Changeset cf2af94 in mainline for uspace/lib/c/generic/fibril_synch.c
- Timestamp:
- 2011-02-09T11:46:47Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- cb15135a
- Parents:
- a49c4002 (diff), 0b37882 (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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/fibril_synch.c
ra49c4002 rcf2af94 36 36 #include <fibril.h> 37 37 #include <async.h> 38 #include <async_priv.h>39 38 #include <adt/list.h> 40 39 #include <futex.h> … … 44 43 #include <stacktrace.h> 45 44 #include <stdlib.h> 45 #include "private/async.h" 46 46 47 47 static void optimize_execution_power(void) … … 55 55 */ 56 56 if (atomic_get(&threads_in_ipc_wait) > 0) 57 ipc_poke();57 async_poke(); 58 58 } 59 59 … … 103 103 { 104 104 fibril_t *f = (fibril_t *) fibril_get_id(); 105 106 if (fibril_get_sercount() != 0) 107 abort(); 105 108 106 109 futex_down(&async_futex); … … 139 142 static void _fibril_mutex_unlock_unsafe(fibril_mutex_t *fm) 140 143 { 141 assert(fm->counter <= 0);142 144 if (fm->counter++ < 0) { 143 145 link_t *tmp; … … 165 167 void fibril_mutex_unlock(fibril_mutex_t *fm) 166 168 { 169 assert(fibril_mutex_is_locked(fm)); 167 170 futex_down(&async_futex); 168 171 _fibril_mutex_unlock_unsafe(fm); 169 172 futex_up(&async_futex); 173 } 174 175 bool fibril_mutex_is_locked(fibril_mutex_t *fm) 176 { 177 bool locked = false; 178 179 futex_down(&async_futex); 180 if (fm->counter <= 0) 181 locked = true; 182 futex_up(&async_futex); 183 184 return locked; 170 185 } 171 186 … … 182 197 fibril_t *f = (fibril_t *) fibril_get_id(); 183 198 199 if (fibril_get_sercount() != 0) 200 abort(); 201 184 202 futex_down(&async_futex); 185 203 if (frw->writers) { … … 207 225 fibril_t *f = (fibril_t *) fibril_get_id(); 208 226 227 if (fibril_get_sercount() != 0) 228 abort(); 229 209 230 futex_down(&async_futex); 210 231 if (frw->writers || frw->readers) { … … 230 251 { 231 252 futex_down(&async_futex); 232 assert(frw->readers || (frw->writers == 1));233 253 if (frw->readers) { 234 254 if (--frw->readers) { … … 296 316 void fibril_rwlock_read_unlock(fibril_rwlock_t *frw) 297 317 { 318 assert(fibril_rwlock_is_read_locked(frw)); 298 319 _fibril_rwlock_common_unlock(frw); 299 320 } … … 301 322 void fibril_rwlock_write_unlock(fibril_rwlock_t *frw) 302 323 { 324 assert(fibril_rwlock_is_write_locked(frw)); 303 325 _fibril_rwlock_common_unlock(frw); 326 } 327 328 bool fibril_rwlock_is_read_locked(fibril_rwlock_t *frw) 329 { 330 bool locked = false; 331 332 futex_down(&async_futex); 333 if (frw->readers) 334 locked = true; 335 futex_up(&async_futex); 336 337 return locked; 338 } 339 340 bool fibril_rwlock_is_write_locked(fibril_rwlock_t *frw) 341 { 342 bool locked = false; 343 344 futex_down(&async_futex); 345 if (frw->writers) { 346 assert(frw->writers == 1); 347 locked = true; 348 } 349 futex_up(&async_futex); 350 351 return locked; 352 } 353 354 bool fibril_rwlock_is_locked(fibril_rwlock_t *frw) 355 { 356 return fibril_rwlock_is_read_locked(frw) || 357 fibril_rwlock_is_write_locked(frw); 304 358 } 305 359 … … 314 368 { 315 369 awaiter_t wdata; 370 371 assert(fibril_mutex_is_locked(fm)); 316 372 317 373 if (timeout < 0)
Note:
See TracChangeset
for help on using the changeset viewer.