diff options
author | tjr <tjr@FreeBSD.org> | 2004-03-17 01:43:08 +0000 |
---|---|---|
committer | tjr <tjr@FreeBSD.org> | 2004-03-17 01:43:08 +0000 |
commit | b4d98c68558acbe9782e24963999f922d52ccf28 (patch) | |
tree | a146c0d7f2efde65782926d4c69016d3b4715398 | |
parent | 131892ca17e9e6a23bd98f9bef05d035b36d2790 (diff) | |
download | FreeBSD-src-b4d98c68558acbe9782e24963999f922d52ccf28.zip FreeBSD-src-b4d98c68558acbe9782e24963999f922d52ccf28.tar.gz |
Re-add macro versions of getc(), getchar(), putc(), putchar(), feof(),
ferror(), fileno() and clearerr(), using the value of __isthreaded to
decide between the fast inline single-threaded code and the more
general function equivalent. This gives most of the performance
benefits of the old unsafe macros while preserving thread safety.
-rw-r--r-- | include/stdio.h | 16 | ||||
-rw-r--r-- | lib/libc/stdio/feof.c | 8 | ||||
-rw-r--r-- | lib/libc/stdio/ferror.c | 8 | ||||
-rw-r--r-- | lib/libc/stdio/fileno.c | 8 | ||||
-rw-r--r-- | lib/libc/stdio/getc.c | 2 | ||||
-rw-r--r-- | lib/libc/stdio/putc.c | 10 | ||||
-rw-r--r-- | lib/libc/stdio/putchar.c | 10 |
7 files changed, 28 insertions, 34 deletions
diff --git a/include/stdio.h b/include/stdio.h index 58f4995..90428b9 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -416,6 +416,22 @@ static __inline int __sputc(int _c, FILE *_p) { #define __sclearerr(p) ((void)((p)->_flags &= ~(__SERR|__SEOF))) #define __sfileno(p) ((p)->_file) +extern int __isthreaded; + +#define feof(p) (!__isthreaded ? __sfeof(p) : feof(p)) +#define ferror(p) (!__isthreaded ? __sferror(p) : ferror(p)) +#define clearerr(p) (!__isthreaded ? __sclearerr(p) : clearerr(p)) + +#if __POSIX_VISIBLE +#define fileno(p) (!__isthreaded ? __sfileno(p) : fileno(p)) +#endif + +#define getc(fp) (!__isthreaded ? __sgetc(fp) : getc(fp)) +#define putc(x, fp) (!__isthreaded ? __sputc(x, fp) : putc(x, fp)) + +#define getchar() getc(stdin) +#define putchar(x) putc(x, stdout) + #if __BSD_VISIBLE /* * See ISO/IEC 9945-1 ANSI/IEEE Std 1003.1 Second Edition 1996-07-12 diff --git a/lib/libc/stdio/feof.c b/lib/libc/stdio/feof.c index 6ad14aa..0bb12be 100644 --- a/lib/libc/stdio/feof.c +++ b/lib/libc/stdio/feof.c @@ -45,12 +45,8 @@ __FBSDID("$FreeBSD$"); #include "un-namespace.h" #include "libc_private.h" -/* - * feof has traditionally been a macro in <stdio.h>. That is no - * longer true because it needs to be thread-safe. - * - * #undef feof - */ +#undef feof + int feof(FILE *fp) { diff --git a/lib/libc/stdio/ferror.c b/lib/libc/stdio/ferror.c index c0fdecd..5d4c187 100644 --- a/lib/libc/stdio/ferror.c +++ b/lib/libc/stdio/ferror.c @@ -45,12 +45,8 @@ __FBSDID("$FreeBSD$"); #include "un-namespace.h" #include "libc_private.h" -/* - * ferror has traditionally been a macro in <stdio.h>. That is no - * longer true because it needs to be thread-safe. - * - * #undef ferror - */ +#undef ferror + int ferror(FILE *fp) { diff --git a/lib/libc/stdio/fileno.c b/lib/libc/stdio/fileno.c index d7bf93d..51c0464 100644 --- a/lib/libc/stdio/fileno.c +++ b/lib/libc/stdio/fileno.c @@ -45,12 +45,8 @@ __FBSDID("$FreeBSD$"); #include "un-namespace.h" #include "libc_private.h" -/* - * fileno has traditionally been a macro in <stdio.h>. That is - * no longer true because it needs to be thread-safe. - * - * #undef fileno - */ +#undef fileno + int fileno(FILE *fp) { diff --git a/lib/libc/stdio/getc.c b/lib/libc/stdio/getc.c index 8fb3057..5732568 100644 --- a/lib/libc/stdio/getc.c +++ b/lib/libc/stdio/getc.c @@ -46,6 +46,8 @@ __FBSDID("$FreeBSD$"); #include "libc_private.h" #include "local.h" +#undef getc + int getc(FILE *fp) { diff --git a/lib/libc/stdio/putc.c b/lib/libc/stdio/putc.c index 95a9cac..b42f878 100644 --- a/lib/libc/stdio/putc.c +++ b/lib/libc/stdio/putc.c @@ -46,14 +46,8 @@ __FBSDID("$FreeBSD$"); #include "local.h" #include "libc_private.h" -/* - * putc has traditionally been a macro in <stdio.h>. That is no - * longer true because POSIX requires it to be thread-safe. POSIX - * does define putc_unlocked() which is defined as a macro and is - * probably what you want to use instead. - * - * #undef putc - */ +#undef putc + int putc(c, fp) int c; diff --git a/lib/libc/stdio/putchar.c b/lib/libc/stdio/putchar.c index 5a775ec..fe97d01 100644 --- a/lib/libc/stdio/putchar.c +++ b/lib/libc/stdio/putchar.c @@ -46,14 +46,8 @@ __FBSDID("$FreeBSD$"); #include "local.h" #include "libc_private.h" -/* - * putchar has traditionally been a macro in <stdio.h>. That is no - * longer true because POSIX requires it to be thread-safe. POSIX - * does define putchar_unlocked() which is defined as a macro and is - * probably what you want to use instead. - * - * #undef putchar - */ +#undef putchar + /* * A subroutine version of the macro putchar */ |