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/fgetc.c
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2018年10月16日 01:08:21 -0400
committerRich Felker <dalias@aerifal.cx>2018年10月17日 23:16:35 -0400
commitdd8f02b7dce53d6b1c4282439f1636a2d63bee01 (patch)
tree22b57b941720ddefb64108da93268b2ea288567a /src/stdio/fgetc.c
parent7136836e14e5286afe74a354c289601375bd472d (diff)
downloadmusl-dd8f02b7dce53d6b1c4282439f1636a2d63bee01.tar.gz
optimize hot paths of getc with manual shrink-wrapping
with these changes, in a program that has not created any threads besides the main thread and that has not called f[try]lockfile, getc performs indistinguishably from getc_unlocked. this was measured on several i386 and x86_64 models, and should hold on other archs too simply by the properties of the code generation. the case where the caller already holds the lock (via flockfile) is improved significantly as well (40-60% reduction in time on machines tested) and the case where locking is needed is improved somewhat (roughly 10%). the key technique used here is forcing the non-hot path out-of-line and enabling it to be a tail call. a static noinline function (conditional on __GNUC__) is used rather than the extern hiddens used elsewhere for this purpose, so that the compiler can choose non-default calling conventions, making it possible to tail-call to a callee that takes more arguments than the caller on archs where arguments are passed on the stack or must have space reserved on the stack for spilling the. the tid could just be reloaded via the thread pointer in locking_getc, but that would be ridiculously expensive on some archs where thread pointer load requires a trap or syscall.
Diffstat (limited to 'src/stdio/fgetc.c')
-rw-r--r--src/stdio/fgetc.c 10
1 files changed, 3 insertions, 7 deletions
diff --git a/src/stdio/fgetc.c b/src/stdio/fgetc.c
index e1224164..2578afcc 100644
--- a/src/stdio/fgetc.c
+++ b/src/stdio/fgetc.c
@@ -1,11 +1,7 @@
-#include "stdio_impl.h"
+#include <stdio.h>
+#include "getc.h"
int fgetc(FILE *f)
{
- int c;
- if (f->lock < 0 || !__lockfile(f))
- return getc_unlocked(f);
- c = getc_unlocked(f);
- __unlockfile(f);
- return c;
+ return do_getc(f);
}
generated by cgit v1.2.1 (git 2.18.0) at 2025年09月08日 19:32:01 +0000

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