__lockfile.c 551 B

1234567891011121314151617181920212223
  1. #include "stdio_impl.h"
  2. #include "pthread_impl.h"
  3. int __lockfile(FILE *f)
  4. {
  5. int owner = f->lock, tid = __pthread_self()->tid;
  6. if ((owner & ~MAYBE_WAITERS) == tid)
  7. return 0;
  8. owner = a_cas(&f->lock, 0, tid);
  9. if (!owner) return 1;
  10. while ((owner = a_cas(&f->lock, 0, tid|MAYBE_WAITERS))) {
  11. if ((owner & MAYBE_WAITERS) ||
  12. a_cas(&f->lock, owner, owner|MAYBE_WAITERS)==owner)
  13. __futexwait(&f->lock, owner|MAYBE_WAITERS, 1);
  14. }
  15. return 1;
  16. }
  17. void __unlockfile(FILE *f)
  18. {
  19. if (a_swap(&f->lock, 0) & MAYBE_WAITERS)
  20. __wake(&f->lock, 1, 1);
  21. }