]> sourceware.org Git - newlib-cygwin.git/commitdiff
Proper locking for getchar() and putchar()
authorSebastian Huber <sebastian.huber@embedded-brains.de>
Mon, 7 Aug 2017 05:35:19 +0000 (07:35 +0200)
committerSebastian Huber <sebastian.huber@embedded-brains.de>
Mon, 7 Aug 2017 05:54:58 +0000 (07:54 +0200)
Add internal inline functions _getchar_unlocked() and
_putchar_unlocked() if __CUSTOM_FILE_IO__ is not defined.  These
functions get _REENT only once.  Use them for getchar_unlocked() and
putchar_unlocked().  Define getchar() and putchar() to these unlocked
internal functions if __SINGLE_THREAD__ is defined, otherwise use the
external functions to use proper locking of the FILE object.

Assumes that __SINGLE_THREAD__ is not defined if __CYGWIN__ is defined.

Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
newlib/libc/include/stdio.h

index 1c32423d3b1fe9f47ca87838597983e64228b404..5d8cb10920b33e45248e713c5eb390f918cf477d 100644 (file)
@@ -735,14 +735,37 @@ _ELIDABLE_INLINE int __sputc_r(struct _reent *_ptr, int _c, FILE *_p) {
 #define        fileno(p)       __sfileno(p)
 #endif
 
-#ifndef __CYGWIN__
-#ifndef lint
-#define        getc(fp)        __sgetc_r(_REENT, fp)
-#define putc(x, fp)    __sputc_r(_REENT, x, fp)
-#endif /* lint */
-#endif /* __CYGWIN__ */
+static __inline int
+_getchar_unlocked(void)
+{
+       struct _reent *_ptr;
+
+       _ptr = _REENT;
+       return (__sgetc_r(_ptr, _stdin_r(_ptr)));
+}
+
+static __inline int
+_putchar_unlocked(int _c)
+{
+       struct _reent *_ptr;
+
+       _ptr = _REENT;
+       return (__sputc_r(_ptr, _c, _stdout_r(_ptr)));
+}
+
+#ifdef __SINGLE_THREAD__
+#define        getc(_p)        __sgetc_r(_REENT, _p)
+#define        putc(_c, _p)    __sputc_r(_REENT, _c, _p)
+#define        getchar()       _getchar_unlocked()
+#define        putchar(_c)     _putchar_unlocked(_c)
+#endif /* __SINGLE_THREAD__ */
 #endif /* __cplusplus */
 
+#if __MISC_VISIBLE || __POSIX_VISIBLE
+#define        getchar_unlocked()      _getchar_unlocked()
+#define        putchar_unlocked(_c)    _putchar_unlocked(_c)
+#endif
+
 #if __MISC_VISIBLE
 /* fast always-buffered version, true iff error */
 #define        fast_putc(x,p) (--(p)->_w < 0 ? \
@@ -756,7 +779,7 @@ _ELIDABLE_INLINE int __sputc_r(struct _reent *_ptr, int _c, FILE *_p) {
 #define L_ctermid       16
 #endif
 
-#endif /* !__CUSTOM_FILE_IO__ */
+#else /* __CUSTOM_FILE_IO__ */
 
 #define        getchar()       getc(stdin)
 #define        putchar(x)      putc(x, stdout)
@@ -766,6 +789,8 @@ _ELIDABLE_INLINE int __sputc_r(struct _reent *_ptr, int _c, FILE *_p) {
 #define        putchar_unlocked(x)     putc_unlocked(x, stdout)
 #endif
 
+#endif /* !__CUSTOM_FILE_IO__ */
+
 _END_STD_C
 
 #endif /* _STDIO_H_ */
This page took 0.034327 seconds and 5 git commands to generate.