1*c9945492SAndroid Build Coastguard Worker #include "stdio_impl.h" 2*c9945492SAndroid Build Coastguard Worker #include <stdlib.h> 3*c9945492SAndroid Build Coastguard Worker dummy(FILE * f)4*c9945492SAndroid Build Coastguard Workerstatic void dummy(FILE *f) { } 5*c9945492SAndroid Build Coastguard Worker weak_alias(dummy, __unlist_locked_file); 6*c9945492SAndroid Build Coastguard Worker fclose(FILE * f)7*c9945492SAndroid Build Coastguard Workerint fclose(FILE *f) 8*c9945492SAndroid Build Coastguard Worker { 9*c9945492SAndroid Build Coastguard Worker int r; 10*c9945492SAndroid Build Coastguard Worker 11*c9945492SAndroid Build Coastguard Worker FLOCK(f); 12*c9945492SAndroid Build Coastguard Worker r = fflush(f); 13*c9945492SAndroid Build Coastguard Worker r |= f->close(f); 14*c9945492SAndroid Build Coastguard Worker FUNLOCK(f); 15*c9945492SAndroid Build Coastguard Worker 16*c9945492SAndroid Build Coastguard Worker /* Past this point, f is closed and any further explict access 17*c9945492SAndroid Build Coastguard Worker * to it is undefined. However, it still exists as an entry in 18*c9945492SAndroid Build Coastguard Worker * the open file list and possibly in the thread's locked files 19*c9945492SAndroid Build Coastguard Worker * list, if it was closed while explicitly locked. Functions 20*c9945492SAndroid Build Coastguard Worker * which process these lists must tolerate dead FILE objects 21*c9945492SAndroid Build Coastguard Worker * (which necessarily have inactive buffer pointers) without 22*c9945492SAndroid Build Coastguard Worker * producing any side effects. */ 23*c9945492SAndroid Build Coastguard Worker 24*c9945492SAndroid Build Coastguard Worker if (f->flags & F_PERM) return r; 25*c9945492SAndroid Build Coastguard Worker 26*c9945492SAndroid Build Coastguard Worker __unlist_locked_file(f); 27*c9945492SAndroid Build Coastguard Worker 28*c9945492SAndroid Build Coastguard Worker FILE **head = __ofl_lock(); 29*c9945492SAndroid Build Coastguard Worker if (f->prev) f->prev->next = f->next; 30*c9945492SAndroid Build Coastguard Worker if (f->next) f->next->prev = f->prev; 31*c9945492SAndroid Build Coastguard Worker if (*head == f) *head = f->next; 32*c9945492SAndroid Build Coastguard Worker __ofl_unlock(); 33*c9945492SAndroid Build Coastguard Worker 34*c9945492SAndroid Build Coastguard Worker free(f->getln_buf); 35*c9945492SAndroid Build Coastguard Worker free(f); 36*c9945492SAndroid Build Coastguard Worker 37*c9945492SAndroid Build Coastguard Worker return r; 38*c9945492SAndroid Build Coastguard Worker } 39