blob: ff246451fdc8327aec0d431d5e8f6242dd09b5cd [file] [log] [blame]
Viet-Trung Luu96b05c12016-01-11 11:26:36 -08001#include "stdio_impl.h"
2#include "pthread_impl.h"
3#include <limits.h>
4
George Kulakowski17e3b042016-02-18 15:59:50 -08005void __do_orphaned_stdio_locks() {
6 FILE* f;
7 for (f = __pthread_self()->stdio_locks; f; f = f->next_locked)
8 a_store(&f->lock, 0x40000000);
Viet-Trung Luu96b05c12016-01-11 11:26:36 -08009}
10
George Kulakowski17e3b042016-02-18 15:59:50 -080011void __unlist_locked_file(FILE* f) {
12 if (f->lockcount) {
13 if (f->next_locked)
14 f->next_locked->prev_locked = f->prev_locked;
15 if (f->prev_locked)
16 f->prev_locked->next_locked = f->next_locked;
17 else
18 __pthread_self()->stdio_locks = f->next_locked;
19 }
Viet-Trung Luu96b05c12016-01-11 11:26:36 -080020}
21
George Kulakowski17e3b042016-02-18 15:59:50 -080022int ftrylockfile(FILE* f) {
23 pthread_t self = __pthread_self();
24 int tid = self->tid;
25 if (f->lock == tid) {
26 if (f->lockcount == LONG_MAX)
27 return -1;
28 f->lockcount++;
29 return 0;
30 }
31 if (f->lock < 0)
32 f->lock = 0;
33 if (f->lock || a_cas(&f->lock, 0, tid))
34 return -1;
35 f->lockcount = 1;
36 f->prev_locked = 0;
37 f->next_locked = self->stdio_locks;
38 if (f->next_locked)
39 f->next_locked->prev_locked = f;
40 self->stdio_locks = f;
41 return 0;
Viet-Trung Luu96b05c12016-01-11 11:26:36 -080042}