musl - musl - an implementation of the standard library for Linux-based systems

index : musl
musl - an implementation of the standard library for Linux-based systems
summary refs log tree commit diff
path: root/src/stdio/fflush.c
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2016年09月18日 21:45:47 -0400
committerRich Felker <dalias@aerifal.cx>2016年09月18日 21:45:47 -0400
commitc002668eb0352e619ea7064e4940b397b4a6e68d (patch)
tree224b1efc7abdf85e84d413f62ca0465628404e2e /src/stdio/fflush.c
parent5505f6afae9acf37ef565c68a07ca3df7b1ae2cb (diff)
downloadmusl-c002668eb0352e619ea7064e4940b397b4a6e68d.tar.gz
simplify/refactor fflush and make fflush_unlocked an alias for fflush
previously, fflush_unlocked was an alias for an internal backend that was called by fflush, either for its argument or in a loop for each file if a null pointer was passed. since the logic for the latter was in the main fflush function, fflush_unlocked crashed when passed a null pointer, rather than flushing all open files. since fflush_unlocked is not a standard function and has no specification, it's not clear whether it should be expected to accept null pointers like fflush does, but a reasonable argument could be made that it should. this patch eliminates the helper function, simplifying fflush, and makes fflush_unlocked an alias for fflush, which is valid because the two functions agree in their behavior in all cases where their behavior is defined (the unlocked version has undefined behavior if another thread could hold locks).
Diffstat (limited to 'src/stdio/fflush.c')
-rw-r--r--src/stdio/fflush.c 53
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);
generated by cgit v1.2.1 (git 2.18.0) at 2025年10月04日 09:48:15 +0000

AltStyle によって変換されたページ (->オリジナル) /