1 #include "threads_impl.h"
2 #include "stdio_impl.h"
3 #include <limits.h>
4 
ftrylockfile(FILE * f)5 int ftrylockfile(FILE* f) {
6     int tid = __thread_get_tid();
7     if (f->lock == tid) {
8         if (f->lockcount == LONG_MAX)
9             return -1;
10         f->lockcount++;
11         return 0;
12     }
13     if (atomic_load(&f->lock) < 0)
14         atomic_store(&f->lock, 0);
15     if (atomic_load(&f->lock) || a_cas_shim(&f->lock, 0, tid))
16         return -1;
17     f->lockcount = 1;
18     return 0;
19 }
20