Proper locking for getchar() and putchar()
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>
This commit is contained in:
parent
65c13851b3
commit
b0f271d1db
|
@ -735,14 +735,37 @@ _ELIDABLE_INLINE int __sputc_r(struct _reent *_ptr, int _c, FILE *_p) {
|
||||||
#define fileno(p) __sfileno(p)
|
#define fileno(p) __sfileno(p)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __CYGWIN__
|
static __inline int
|
||||||
#ifndef lint
|
_getchar_unlocked(void)
|
||||||
#define getc(fp) __sgetc_r(_REENT, fp)
|
{
|
||||||
#define putc(x, fp) __sputc_r(_REENT, x, fp)
|
struct _reent *_ptr;
|
||||||
#endif /* lint */
|
|
||||||
#endif /* __CYGWIN__ */
|
_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 */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#if __MISC_VISIBLE || __POSIX_VISIBLE
|
||||||
|
#define getchar_unlocked() _getchar_unlocked()
|
||||||
|
#define putchar_unlocked(_c) _putchar_unlocked(_c)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if __MISC_VISIBLE
|
#if __MISC_VISIBLE
|
||||||
/* fast always-buffered version, true iff error */
|
/* fast always-buffered version, true iff error */
|
||||||
#define fast_putc(x,p) (--(p)->_w < 0 ? \
|
#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
|
#define L_ctermid 16
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* !__CUSTOM_FILE_IO__ */
|
#else /* __CUSTOM_FILE_IO__ */
|
||||||
|
|
||||||
#define getchar() getc(stdin)
|
#define getchar() getc(stdin)
|
||||||
#define putchar(x) putc(x, stdout)
|
#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)
|
#define putchar_unlocked(x) putc_unlocked(x, stdout)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif /* !__CUSTOM_FILE_IO__ */
|
||||||
|
|
||||||
_END_STD_C
|
_END_STD_C
|
||||||
|
|
||||||
#endif /* _STDIO_H_ */
|
#endif /* _STDIO_H_ */
|
||||||
|
|
Loading…
Reference in New Issue