This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Quoting from the comments in include/reent.h: Dynamic reentrancy is specified by the __DYNAMIC_REENT__ flag. This flag denotes setting up a macro to replace _REENT with a function call to __getreent(). And in fact, the definition of _REENT in include/sys/reent.h is #if defined(__DYNAMIC_REENT__) && !defined(__SINGLE_THREAD__) [...] # define _REENT (__getreent()) #else # define _REENT _impure_ptr #endif However, this works only if the rest of newlib never uses _impure_ptr directly. A quick grep on the sources found two uses of _impure_ptr, one in the definition of stdin, stdout, stderr in stdio.h, and one in the definition of getwchar/putwchar in wchar.h. These uses occur only if _REENT_ONLY is defined. So, my understanding is that if both __DYNAMIC_REENT__ and _REENT_ONLY are defined, those direct uses of _impure_ptr leak out the wrong reentrancy structure. I'm also wondering why these even exist when _REENT_ONLY is defined, shouldn't one use only _stdin_r, _stdout_r, _stderr_r, _getwchar_r and _putwchar_r in this case, according to the rule that non _r functions aren't defined when _REENT_ONLY is? Anyway, these are visible in public headers, so users may well have used those. Attached is a patch that implements them by calling __getreent() if both __DYNAMIC_REENT__ and _REENT_ONLY are defined. Note that this came out of a code review, I don't have such a setup to test this change, so please look at the patch carefully. newlib/ChangeLog 2013-06-23 Terraneo Federico <fede.tft@hotmail.it> * libc/include/stdio.h (stdin): Use __getreent when required (stdout): Ditto (stderr): Ditto * libc/include/wchar.h (getwchar): Ditto (putwchar): Ditto * libc/include/sys/reent.h: Make __getreent available even if _REENT_ONLY is defined. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQEcBAEBAgAGBQJRxtivAAoJECkLFtN5Xr9fHC4H/29YzTexscZv2Ez96b/UWexG kBqyL80OSLiJXX3Vi4B+YqvRS4dANVMXihXu5LCGp/zoqpBk+gpFrBEuwwPtxWyr mmwBAZ3OV9DlA2YwCbqWbrs2RPHzSaTG6JT0xRCUiIyDK0INPuTgnApj29Lq6A+B GZeVhOPjRGWMglx1G6oaQYpmYU7bn04TGsRR5GfY6O38ih3fDx8yhW9/pjKP+uFg jCieTQhv8ETZMaDxhuO/ldMCPokclEC2MNEGnYJ5moP8YYrt3utgrmp/6gVLkl0g v3NmpmQ2xU89n8gLdYhrkFaSX6Ut+/XuLXdydZf3x1+hut35BspY64NHRPxgcZc= =wANw -----END PGP SIGNATURE-----
diff -ruN a/newlib/libc/include/stdio.h b/newlib/libc/include/stdio.h --- a/newlib/libc/include/stdio.h 2012-11-01 12:51:11.000000000 +0100 +++ b/newlib/libc/include/stdio.h 2013-06-23 11:36:41.607057328 +0200 @@ -144,9 +144,15 @@ #define stdout (_REENT->_stdout) #define stderr (_REENT->_stderr) #else /* _REENT_ONLY */ +#if defined(__DYNAMIC_REENT__) && !defined(__SINGLE_THREAD__) +#define stdin (__getreent()->_stdin) +#define stdout (__getreent()->_stdout) +#define stderr (__getreent()->_stderr) +#else /* defined(__DYNAMIC_REENT__) && !defined(__SINGLE_THREAD__) */ #define stdin (_impure_ptr->_stdin) #define stdout (_impure_ptr->_stdout) #define stderr (_impure_ptr->_stderr) +#endif /* defined(__DYNAMIC_REENT__) && !defined(__SINGLE_THREAD__) */ #endif /* _REENT_ONLY */ #define _stdin_r(x) ((x)->_stdin) diff -ruN a/newlib/libc/include/sys/reent.h b/newlib/libc/include/sys/reent.h --- a/newlib/libc/include/sys/reent.h 2013-05-09 01:13:51.000000000 +0200 +++ b/newlib/libc/include/sys/reent.h 2013-06-23 11:36:41.607057328 +0200 @@ -795,14 +795,15 @@ void _reclaim_reent _PARAMS ((struct _reent *)); +#if defined(__DYNAMIC_REENT__) && !defined(__SINGLE_THREAD__) && !defined(__getreent) +struct _reent * _EXFUN(__getreent, (void)); +#endif + /* #define _REENT_ONLY define this to get only reentrant routines */ #ifndef _REENT_ONLY #if defined(__DYNAMIC_REENT__) && !defined(__SINGLE_THREAD__) -#ifndef __getreent - struct _reent * _EXFUN(__getreent, (void)); -#endif # define _REENT (__getreent()) #else /* __SINGLE_THREAD__ || !__DYNAMIC_REENT__ */ # define _REENT _impure_ptr diff -ruN a/newlib/libc/include/wchar.h b/newlib/libc/include/wchar.h --- a/newlib/libc/include/wchar.h 2012-11-01 12:51:11.000000000 +0100 +++ b/newlib/libc/include/wchar.h 2013-06-23 11:36:41.615057863 +0200 @@ -182,10 +182,15 @@ #ifndef _REENT_ONLY #define getwchar() fgetwc(_REENT->_stdin) #define putwchar(wc) fputwc((wc), _REENT->_stdout) -#else +#else /* _REENT_ONLY */ +#if defined(__DYNAMIC_REENT__) && !defined(__SINGLE_THREAD__) +#define getwchar() fgetwc(__getreent()->_stdin) +#define putwchar(wc) fputwc((wc), __getreent()->_stdout) +#else /* defined(__DYNAMIC_REENT__) && !defined(__SINGLE_THREAD__) */ #define getwchar() fgetwc(_impure_ptr->_stdin) #define putwchar(wc) fputwc((wc), _impure_ptr->_stdout) -#endif +#endif /* defined(__DYNAMIC_REENT__) && !defined(__SINGLE_THREAD__) */ +#endif /* _REENT_ONLY */ _END_STD_C
Attachment:
dynamic_reent.patch.sig
Description: Binary data
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |