github.com/afumu/libc@v0.0.6/musl/src/stdio/fflush.c (about)

     1  #include "stdio_impl.h"
     2  
     3  /* stdout.c will override this if linked */
     4  static FILE *volatile dummy = 0;
     5  weak_alias(dummy, __stdout_used);
     6  weak_alias(dummy, __stderr_used);
     7  
     8  int fflush(FILE *f)
     9  {
    10  	if (!f) {
    11  		int r = 0;
    12  		if (__stdout_used) r |= fflush(__stdout_used);
    13  		if (__stderr_used) r |= fflush(__stderr_used);
    14  
    15  		for (f=*__ofl_lock(); f; f=f->next) {
    16  			FLOCK(f);
    17  			if (f->wpos != f->wbase) r |= fflush(f);
    18  			FUNLOCK(f);
    19  		}
    20  		__ofl_unlock();
    21  
    22  		return r;
    23  	}
    24  
    25  	FLOCK(f);
    26  
    27  	/* If writing, flush output */
    28  	if (f->wpos != f->wbase) {
    29  		f->write(f, 0, 0);
    30  		if (!f->wpos) {
    31  			FUNLOCK(f);
    32  			return EOF;
    33  		}
    34  	}
    35  
    36  	/* If reading, sync position, per POSIX */
    37  	if (f->rpos != f->rend) f->seek(f, f->rpos-f->rend, SEEK_CUR);
    38  
    39  	/* Clear read and write modes */
    40  	f->wpos = f->wbase = f->wend = 0;
    41  	f->rpos = f->rend = 0;
    42  
    43  	FUNLOCK(f);
    44  	return 0;
    45  }
    46  
    47  weak_alias(fflush, fflush_unlocked);