diff options
Diffstat (limited to 'src/stdio')
-rw-r--r-- | src/stdio/__lockfile.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/stdio/__lockfile.c b/src/stdio/__lockfile.c index 2ff75d8a..0dcb2a42 100644 --- a/src/stdio/__lockfile.c +++ b/src/stdio/__lockfile.c @@ -8,13 +8,13 @@ int __lockfile(FILE *f) int owner = f->lock, tid = __pthread_self()->tid; if ((owner & ~MAYBE_WAITERS) == tid) return 0; - for (;;) { - owner = a_cas(&f->lock, 0, tid); - if (!owner) return 1; - if (a_cas(&f->lock, owner, owner|MAYBE_WAITERS)==owner) break; + owner = a_cas(&f->lock, 0, tid); + if (!owner) return 1; + while ((owner = a_cas(&f->lock, 0, tid|MAYBE_WAITERS))) { + if ((owner & MAYBE_WAITERS) || + a_cas(&f->lock, owner, owner|MAYBE_WAITERS)==owner) + __futexwait(&f->lock, owner|MAYBE_WAITERS, 1); } - while ((owner = a_cas(&f->lock, 0, tid|MAYBE_WAITERS))) - __futexwait(&f->lock, owner, 1); return 1; } |