about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/stdio/fflush.c53
1 files changed, 23 insertions, 30 deletions
diff --git a/src/stdio/fflush.c b/src/stdio/fflush.c
index 3f462c80..c2881065 100644
--- a/src/stdio/fflush.c
+++ b/src/stdio/fflush.c
@@ -1,11 +1,30 @@
 #include "stdio_impl.h"
 
-static int __fflush_unlocked(FILE *f)
+/* stdout.c will override this if linked */
+static FILE *volatile dummy = 0;
+weak_alias(dummy, __stdout_used);
+
+int fflush(FILE *f)
 {
+	if (!f) {
+		int r = __stdout_used ? fflush(__stdout_used) : 0;
+
+		for (f=*__ofl_lock(); f; f=f->next)
+			if (f->wpos > f->wbase) r |= fflush(f);
+		__ofl_unlock();
+
+		return r;
+	}
+
+	FLOCK(f);
+
 	/* If writing, flush output */
 	if (f->wpos > f->wbase) {
 		f->write(f, 0, 0);
-		if (!f->wpos) return EOF;
+		if (!f->wpos) {
+			FUNLOCK(f);
+			return EOF;
+		}
 	}
 
 	/* If reading, sync position, per POSIX */
@@ -15,34 +34,8 @@ static int __fflush_unlocked(FILE *f)
 	f->wpos = f->wbase = f->wend = 0;
 	f->rpos = f->rend = 0;
 
+	FUNLOCK(f);
 	return 0;
 }
 
-/* stdout.c will override this if linked */
-static FILE *volatile dummy = 0;
-weak_alias(dummy, __stdout_used);
-
-int fflush(FILE *f)
-{
-	int r;
-
-	if (f) {
-		FLOCK(f);
-		r = __fflush_unlocked(f);
-		FUNLOCK(f);
-		return r;
-	}
-
-	r = __stdout_used ? fflush(__stdout_used) : 0;
-
-	for (f=*__ofl_lock(); f; f=f->next) {
-		FLOCK(f);
-		if (f->wpos > f->wbase) r |= __fflush_unlocked(f);
-		FUNLOCK(f);
-	}
-	__ofl_unlock();
-	
-	return r;
-}
-
-weak_alias(__fflush_unlocked, fflush_unlocked);
+weak_alias(fflush, fflush_unlocked);