simplify and optimize FILE lock handling
[musl] / src / stdio / __lockfile.c
1 #include "stdio_impl.h"
2 #include "pthread_impl.h"
3
4 void __lockfile(FILE *f)
5 {
6         int spins=100000;
7         int tid;
8
9         if (f->lock < 0) return;
10         tid = __pthread_self()->tid;
11         if (f->lock == tid) {
12                 while (f->lockcount == INT_MAX);
13                 f->lockcount++;
14                 return;
15         }
16         while (f->lock || a_cas(&f->lock, 0, tid))
17                 if (spins) spins--, a_spin();
18                 else syscall(SYS_sched_yield);
19         f->lockcount = 1;
20 }