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)
|
||||
#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_ */
|
||||
|
|
Loading…
Reference in New Issue