1*c9945492SAndroid Build Coastguard Worker #include "stdio_impl.h" 2*c9945492SAndroid Build Coastguard Worker #include "pthread_impl.h" 3*c9945492SAndroid Build Coastguard Worker 4*c9945492SAndroid Build Coastguard Worker #ifdef __GNUC__ 5*c9945492SAndroid Build Coastguard Worker __attribute__((__noinline__)) 6*c9945492SAndroid Build Coastguard Worker #endif locking_getc(FILE * f)7*c9945492SAndroid Build Coastguard Workerstatic int locking_getc(FILE *f) 8*c9945492SAndroid Build Coastguard Worker { 9*c9945492SAndroid Build Coastguard Worker if (a_cas(&f->lock, 0, MAYBE_WAITERS-1)) __lockfile(f); 10*c9945492SAndroid Build Coastguard Worker int c = getc_unlocked(f); 11*c9945492SAndroid Build Coastguard Worker if (a_swap(&f->lock, 0) & MAYBE_WAITERS) 12*c9945492SAndroid Build Coastguard Worker __wake(&f->lock, 1, 1); 13*c9945492SAndroid Build Coastguard Worker return c; 14*c9945492SAndroid Build Coastguard Worker } 15*c9945492SAndroid Build Coastguard Worker do_getc(FILE * f)16*c9945492SAndroid Build Coastguard Workerstatic inline int do_getc(FILE *f) 17*c9945492SAndroid Build Coastguard Worker { 18*c9945492SAndroid Build Coastguard Worker int l = f->lock; 19*c9945492SAndroid Build Coastguard Worker if (l < 0 || l && (l & ~MAYBE_WAITERS) == __pthread_self()->tid) 20*c9945492SAndroid Build Coastguard Worker return getc_unlocked(f); 21*c9945492SAndroid Build Coastguard Worker return locking_getc(f); 22*c9945492SAndroid Build Coastguard Worker } 23