* [PATCH 1/3] Remove superfluous parameter from std() @ 2017-06-23 9:23 Sebastian Huber 2017-06-23 9:23 ` [PATCH 3/3] Introduce _REENT_GLOBAL_STDIO_STREAMS Sebastian Huber 2017-06-23 9:23 ` [PATCH 2/3] Add stdin_init(), stdout_init() and stderr_init() Sebastian Huber 0 siblings, 2 replies; 9+ messages in thread From: Sebastian Huber @ 2017-06-23 9:23 UTC (permalink / raw) To: newlib Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de> --- newlib/libc/stdio/findfp.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/newlib/libc/stdio/findfp.c b/newlib/libc/stdio/findfp.c index 83d3dc558..ecc65d6d3 100644 --- a/newlib/libc/stdio/findfp.c +++ b/newlib/libc/stdio/findfp.c @@ -40,11 +40,10 @@ _NOINLINE_STATIC _VOID #else static _VOID #endif -_DEFUN(std, (ptr, flags, file, data), +_DEFUN(std, (ptr, flags, file), FILE *ptr _AND int flags _AND - int file _AND - struct _reent *data) + int file) { ptr->_p = 0; ptr->_r = 0; @@ -236,7 +235,7 @@ _DEFUN(__sinit, (s), s->_stderr = __sfp(s); #endif - std (s->_stdin, __SRD, 0, s); + std (s->_stdin, __SRD, 0); /* On platforms that have true file system I/O, we can verify whether stdout is an interactive terminal or not, as part of @@ -245,14 +244,14 @@ _DEFUN(__sinit, (s), requires both stdin and stdout to be line-buffered, but tradition leaves stdin alone on systems without fcntl. */ #ifdef HAVE_FCNTL - std (s->_stdout, __SWR, 1, s); + std (s->_stdout, __SWR, 1); #else - std (s->_stdout, __SWR | __SLBF, 1, s); + std (s->_stdout, __SWR | __SLBF, 1); #endif /* POSIX requires stderr to be opened for reading and writing, even when the underlying fd 2 is write-only. */ - std (s->_stderr, __SRW | __SNBF, 2, s); + std (s->_stderr, __SRW | __SNBF, 2); s->__sdidinit = 1; -- 2.12.3 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 3/3] Introduce _REENT_GLOBAL_STDIO_STREAMS 2017-06-23 9:23 [PATCH 1/3] Remove superfluous parameter from std() Sebastian Huber @ 2017-06-23 9:23 ` Sebastian Huber 2017-06-23 21:53 ` Freddie Chopin 2017-06-23 9:23 ` [PATCH 2/3] Add stdin_init(), stdout_init() and stderr_init() Sebastian Huber 1 sibling, 1 reply; 9+ messages in thread From: Sebastian Huber @ 2017-06-23 9:23 UTC (permalink / raw) To: newlib In Newlib, the stdio streams are defined to thread-specific pointers _reent::_stdin, _reent::_stdout and _reent::_stderr. In case _REENT_SMALL is not defined, then these pointers are initialized via _REENT_INIT_PTR() or _REENT_INIT_PTR_ZEROED() to thread-specific FILE objects provided via _reent::__sf[3]. There are two problems with this (at least in case of RTEMS). (1) The thread-specific FILE objects are closed by _reclaim_reent(). This leads to problems with language run-time libraries that provide wrappers to the C/POSIX stdio streams (e.g. C++ and Ada), since they use the thread-specific FILE objects of the initialization thread. In case the initialization thread is deleted, then they use freed memory. (2) Since thread-specific FILE objects are used with a common output device via file descriptors 0, 1 and 2, the locking at FILE object level cannot ensure atomicity of the output, e.g. a call to printf(). Introduce a new Newlib configuration option _REENT_GLOBAL_STDIO_STREAMS to enable the use of global stdio FILE objects. Use this option for RTEMS. As a side-effect this reduces the size of struct _reent by more than 50%. The _REENT_GLOBAL_STDIO_STREAMS should not be used without _STDIO_CLOSE_PER_REENT_STD_STREAMS. Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de> --- newlib/libc/include/sys/config.h | 1 + newlib/libc/include/sys/reent.h | 21 +++++++++++++++------ newlib/libc/stdio/findfp.c | 24 ++++++++++++++++++++++++ newlib/libc/stdio/local.h | 2 +- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/newlib/libc/include/sys/config.h b/newlib/libc/include/sys/config.h index 555239f8b..ae8caff7b 100644 --- a/newlib/libc/include/sys/config.h +++ b/newlib/libc/include/sys/config.h @@ -238,6 +238,7 @@ #define _READ_WRITE_RETURN_TYPE _ssize_t #define __DYNAMIC_REENT__ #define _REENT_GLOBAL_ATEXIT +#define _REENT_GLOBAL_STDIO_STREAMS #endif #ifndef __EXPORT diff --git a/newlib/libc/include/sys/reent.h b/newlib/libc/include/sys/reent.h index 8b67889ac..2a79ccc71 100644 --- a/newlib/libc/include/sys/reent.h +++ b/newlib/libc/include/sys/reent.h @@ -644,14 +644,23 @@ struct _reent of the above members (on the off chance that future binary compatibility would be broken otherwise). */ struct _glue __sglue; /* root of glue chain */ +# ifndef _REENT_GLOBAL_STDIO_STREAMS __FILE __sf[3]; /* first three file descriptors */ +# endif }; +#ifdef _REENT_GLOBAL_STDIO_STREAMS +extern __FILE __sf[3]; +#define _REENT_STDIO_STREAM(var, index) &__sf[index] +#else +#define _REENT_STDIO_STREAM(var, index) &(var).__sf[index] +#endif + #define _REENT_INIT(var) \ { 0, \ - &(var).__sf[0], \ - &(var).__sf[1], \ - &(var).__sf[2], \ + _REENT_STDIO_STREAM(var, 0), \ + _REENT_STDIO_STREAM(var, 1), \ + _REENT_STDIO_STREAM(var, 2), \ 0, \ "", \ 0, \ @@ -696,9 +705,9 @@ struct _reent } #define _REENT_INIT_PTR_ZEROED(var) \ - { (var)->_stdin = &(var)->__sf[0]; \ - (var)->_stdout = &(var)->__sf[1]; \ - (var)->_stderr = &(var)->__sf[2]; \ + { (var)->_stdin = _REENT_STDIO_STREAM(var, 0); \ + (var)->_stdout = _REENT_STDIO_STREAM(var, 1); \ + (var)->_stderr = _REENT_STDIO_STREAM(var, 2); \ (var)->_new._reent._rand_next = 1; \ (var)->_new._reent._r48._seed[0] = _RAND48_SEED_0; \ (var)->_new._reent._r48._seed[1] = _RAND48_SEED_1; \ diff --git a/newlib/libc/stdio/findfp.c b/newlib/libc/stdio/findfp.c index 601795098..ffeb019fa 100644 --- a/newlib/libc/stdio/findfp.c +++ b/newlib/libc/stdio/findfp.c @@ -35,6 +35,10 @@ const struct __sFILE_fake __sf_fake_stderr = {_NULL, 0, 0, 0, 0, {_NULL, 0}, 0, _NULL}; #endif +#ifdef _REENT_GLOBAL_STDIO_STREAMS +__FILE __sf[3]; +#endif + #if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) _NOINLINE_STATIC _VOID #else @@ -218,6 +222,14 @@ _DEFUN(_cleanup_r, (ptr), cleanup_func = _fclose_r; #endif #endif +#ifdef _REENT_GLOBAL_STDIO_STREAMS + if (ptr->_stdin != &__sf[0]) + (*cleanup_func) (ptr, ptr->_stdin); + if (ptr->_stdout != &__sf[1]) + (*cleanup_func) (ptr, ptr->_stdout); + if (ptr->_stderr != &__sf[2]) + (*cleanup_func) (ptr, ptr->_stderr); +#endif _CAST_VOID _fwalk_reent (ptr, cleanup_func); } @@ -250,8 +262,10 @@ _DEFUN(__sinit, (s), s->__sglue._next = NULL; #ifndef _REENT_SMALL +# ifndef _REENT_GLOBAL_STDIO_STREAMS s->__sglue._niobs = 3; s->__sglue._iobs = &s->__sf[0]; +# endif #else s->__sglue._niobs = 0; s->__sglue._iobs = NULL; @@ -265,9 +279,19 @@ _DEFUN(__sinit, (s), s->_stderr = __sfp(s); #endif +#ifdef _REENT_GLOBAL_STDIO_STREAMS + if (__sf[0]._cookie == NULL) { + _GLOBAL_REENT->__sglue._niobs = 3; + _GLOBAL_REENT->__sglue._iobs = &__sf[0]; + stdin_init (&__sf[0]); + stdout_init (&__sf[1]); + stderr_init (&__sf[2]); + } +#else stdin_init (s->_stdin); stdout_init (s->_stdout); stderr_init (s->_stderr); +#endif s->__sdidinit = 1; diff --git a/newlib/libc/stdio/local.h b/newlib/libc/stdio/local.h index 5f6995501..511e5e35f 100644 --- a/newlib/libc/stdio/local.h +++ b/newlib/libc/stdio/local.h @@ -38,7 +38,7 @@ case _STDIO_CLOSE_PER_REENT_STD_STREAMS is defined these file descriptors will be closed via close() provided the owner of the reent structure triggerd the on demand reent initilization, see CHECK_INIT(). */ -#if !defined(__rtems__) && !defined(__tirtos__) +#if !defined(__tirtos__) #define _STDIO_CLOSE_PER_REENT_STD_STREAMS #endif -- 2.12.3 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/3] Introduce _REENT_GLOBAL_STDIO_STREAMS 2017-06-23 9:23 ` [PATCH 3/3] Introduce _REENT_GLOBAL_STDIO_STREAMS Sebastian Huber @ 2017-06-23 21:53 ` Freddie Chopin 2017-06-26 5:59 ` Sebastian Huber 0 siblings, 1 reply; 9+ messages in thread From: Freddie Chopin @ 2017-06-23 21:53 UTC (permalink / raw) To: newlib On Fri, 2017-06-23 at 11:22 +0200, Sebastian Huber wrote: > Introduce a new Newlib configuration option > _REENT_GLOBAL_STDIO_STREAMS > to enable the use of global stdio FILE objects. Use this option for > RTEMS. Coult this be turned into an option for ./configure script? This seems like a very useful change for any microcontroller target (like "arm- none-eabi-"), but if this option can be enabled only by modifications of the source code, then doing that for a generic case (no specific RTOS) probably won't be popular. Thanks in advance! Regards, FCh ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/3] Introduce _REENT_GLOBAL_STDIO_STREAMS 2017-06-23 21:53 ` Freddie Chopin @ 2017-06-26 5:59 ` Sebastian Huber 0 siblings, 0 replies; 9+ messages in thread From: Sebastian Huber @ 2017-06-26 5:59 UTC (permalink / raw) To: Freddie Chopin, newlib On 23/06/17 23:53, Freddie Chopin wrote: > On Fri, 2017-06-23 at 11:22 +0200, Sebastian Huber wrote: >> Introduce a new Newlib configuration option >> _REENT_GLOBAL_STDIO_STREAMS >> to enable the use of global stdio FILE objects. Use this option for >> RTEMS. > Coult this be turned into an option for ./configure script? This seems > like a very useful change for any microcontroller target (like "arm- > none-eabi-"), but if this option can be enabled only by modifications > of the source code, then doing that for a generic case (no specific > RTOS) probably won't be popular. How safe is it to use configure generated options in header files? For example during libgcc build, the Newlib configure didn't run yet. For example: [...] make[2]: Entering directory '/build/git-build/b-gcc-git-sparc-rtems4.12/sparc-rtems4.12/libgcc' # If this is the top-level multilib, build all the other /build/git-build/b-gcc-git-sparc-rtems4.12/./gcc/xgcc -B/build/git-build/b-gcc-git-sparc-rtems4.12/./gcc/ -nostdinc -B/build/git-build/b-gcc-git-sparc-rtems4.12/sparc-rtems4.12/newlib/ -isystem /build/git-build/b-gcc-git-sparc-rtems4.12/sparc-rtems4.12/newlib/targ-include -isystem /home/EB/sebastian_h/archive/gcc-git/newlib/libc/include -B/opt/rtems-4.12/sparc-rtems4.12/bin/ -B/opt/rtems-4.12/sparc-rtems4.12/lib/ -isystem /opt/rtems-4.12/sparc-rtems4.12/include -isystem /opt/rtems-4.12/sparc-rtems4.12/sys-include -g -O2 -O2 -I/home/EB/sebastian_h/archive/gcc-git/libgcc/../newlib/libc/sys/rtems/include -g -O2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -isystem ./include -g -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector -Dinhibit_libc -I. -I. -I../.././gcc -I/home/EB/sebastian_h/archive/gcc-git/libgcc -I/home/EB/sebastian_h/archive/gcc-git/libgcc/. -I/home/EB/sebastian_h/archive/gcc-git/libgcc/../gcc -I/home/EB/sebastian_h/archive/gcc-git/libgcc/../include -DHAVE_CC_TLS -o _mulsi3_s.o -MT _mulsi3_s.o -MD -MP -MF _mulsi3_s.dep -DSHARED -DL_mulsi3 -xassembler-with-cpp -c /home/EB/sebastian_h/archive/gcc-git/libgcc/config/sparc/lb1spc.S [....] === configuring in libc (/build/git-build/b-gcc-git-sparc-rtems4.12/sparc-rtems4.12/soft/newlib/libc) configure: running /bin/sh /home/EB/sebastian_h/archive/gcc-git/newlib/libc/configure --disable-option-checking '--prefix=/opt/rtems-4.12' '--with-multisubdir=soft' '--with-multisrctop=' '--enable-multilib' '--with-cross-host=x86_64-pc-linux-gnu' '--verbose' '--with-gnu-as' '--with-gnu-ld' '--with-newlib' '--disable-libstdcxx-pch' '--disable-nls' '--disable-lto' '--disable-plugin' '--without-included-gettext' '--disable-win32-registry' '--enable-version-specific-runtime-libs' '--enable-threads' '--enable-newlib-iconv' '--enable-newlib-iconv-encodings=big5,cp775,cp850,cp852,cp855,cp866,euc_jp,euc_kr,euc_tw,iso_8859_1,iso_8859_10,iso_8859_11,iso_8859_13,iso_8859_14,iso_8859_15,iso_8859_2,iso_8859_3,iso_8859_4,iso_8859_5,iso_8859_6,iso_8859_7,iso_8859_8,iso_8859_9,iso_ir_111,koi8_r,koi8_ru,koi8_u,koi8_uni,ucs_2,ucs_2_internal,ucs_2be,ucs_2le,ucs_4,ucs_4_internal,ucs_4be,ucs_4le,us_ascii,utf_16,utf_16be,utf_16le,utf_8,win_1250,win_1251,win_1252,win_1253,win_1254,win_1255,win_1256,win_1257,win_1258' '--enable-newlib-io-c99-formats' '--enable-libgomp' '--enable-languages=c,c++' '--program-transform-name=s&^&sparc-rtems4.12-&' '--with-target-subdir=sparc-rtems4.12' '--build=x86_64-pc-linux-gnu' '--host=sparc-rtems4.12' '--target=sparc-rtems4.12' 'build_alias=x86_64-pc-linux-gnu' 'host_alias=sparc-rtems4.12' 'target_alias=sparc-rtems4.12' 'CC=/build/git-build/b-gcc-git-sparc-rtems4.12/./gcc/xgcc -B/build/git-build/b-gcc-git-sparc-rtems4.12/./gcc/ -nostdinc -B/build/git-build/b-gcc-git-sparc-rtems4.12/sparc-rtems4.12/newlib/ -isystem /build/git-build/b-gcc-git-sparc-rtems4.12/sparc-rtems4.12/newlib/targ-include -isystem /home/EB/sebastian_h/archive/gcc-git/newlib/libc/include -B/opt/rtems-4.12/sparc-rtems4.12/bin/ -B/opt/rtems-4.12/sparc-rtems4.12/lib/ -isystem /opt/rtems-4.12/sparc-rtems4.12/include -isystem /opt/rtems-4.12/sparc-rtems4.12/sys-include ' 'CFLAGS=-g -O2' 'LDFLAGS=' 'CPPFLAGS=' 'CC=/build/git-build/b-gcc-git-sparc-rtems4.12/./gcc/xgcc -B/build/git-build/b-gcc-git-sparc-rtems4.12/./gcc/ -nostdinc -B/build/git-build/b-gcc-git-sparc-rtems4.12/sparc-rtems4.12/soft/newlib/ -isystem /build/git-build/b-gcc-git-sparc-rtems4.12/sparc-rtems4.12/soft/newlib/targ-include -isystem /home/EB/sebastian_h/archive/gcc-git/newlib/libc/include -B/opt/rtems-4.12/sparc-rtems4.12/bin/ -B/opt/rtems-4.12/sparc-rtems4.12/lib/ -isystem /opt/rtems-4.12/sparc-rtems4.12/include -isystem /opt/rtems-4.12/sparc-rtems4.12/sys-include -msoft-float' 'CXX=/build/git-build/b-gcc-git-sparc-rtems4.12/./gcc/xg++ -B/build/git-build/b-gcc-git-sparc-rtems4.12/./gcc/ -nostdinc++ -funconfigured-libstdc++-v3 -L/build/git-build/b-gcc-git-sparc-rtems4.12/sparc-rtems4.12/soft/libstdc++-v3/src -L/build/git-build/b-gcc-git-sparc-rtems4.12/sparc-rtems4.12/soft/libstdc++-v3/src/.libs -L/build/git-build/b-gcc-git-sparc-rtems4.12/sparc-rtems4.12/soft/libstdc++-v3/libsupc++/.libs -nostdinc -B/build/git-build/b-gcc-git-sparc-rtems4.12/sparc-rtems4.12/soft/newlib/ -isystem /build/git-build/b-gcc-git-sparc-rtems4.12/sparc-rtems4.12/soft/newlib/targ-include -isystem /home/EB/sebastian_h/archive/gcc-git/newlib/libc/include -B/opt/rtems-4.12/sparc-rtems4.12/bin/ -B/opt/rtems-4.12/sparc-rtems4.12/lib/ -isystem /opt/rtems-4.12/sparc-rtems4.12/include -isystem /opt/rtems-4.12/sparc-rtems4.12/sys-include -msoft-float' 'F77= -msoft-float' 'GCJ= -msoft-float' 'GFORTRAN=sparc-rtems4.12-gfortran -nostdinc -B/build/git-build/b-gcc-git-sparc-rtems4.12/sparc-rtems4.12/soft/newlib/ -isystem /build/git-build/b-gcc-git-sparc-rtems4.12/sparc-rtems4.12/soft/newlib/targ-include -isystem /home/EB/sebastian_h/archive/gcc-git/newlib/libc/include -B/opt/rtems-4.12/sparc-rtems4.12/bin/ -B/opt/rtems-4.12/sparc-rtems4.12/lib/ -isystem /opt/rtems-4.12/sparc-rtems4.12/include -isystem /opt/rtems-4.12/sparc-rtems4.12/sys-include -msoft-float' 'GOC=sparc-rtems4.12-gccgo -nostdinc -B/build/git-build/b-gcc-git-sparc-rtems4.12/sparc-rtems4.12/soft/newlib/ -isystem /build/git-build/b-gcc-git-sparc-rtems4.12/sparc-rtems4.12/soft/newlib/targ-include -isystem /home/EB/sebastian_h/archive/gcc-git/newlib/libc/include -B/opt/rtems-4.12/sparc-rtems4.12/bin/ -B/opt/rtems-4.12/sparc-rtems4.12/lib/ -isystem /opt/rtems-4.12/sparc-rtems4.12/include -isystem /opt/rtems-4.12/sparc-rtems4.12/sys-include -msoft-float' 'LD_LIBRARY_PATH=/build/git-build/b-gcc-git-sparc-rtems4.12/./gmp/.libs:/build/git-build/b-gcc-git-sparc-rtems4.12/./prev-gmp/.libs:/build/git-build/b-gcc-git-sparc-rtems4.12/./mpfr/src/.libs:/build/git-build/b-gcc-git-sparc-rtems4.12/./prev-mpfr/src/.libs:/build/git-build/b-gcc-git-sparc-rtems4.12/./mpc/src/.libs:/build/git-build/b-gcc-git-sparc-rtems4.12/./prev-mpc/src/.libs:/build/git-build/b-gcc-git-sparc-rtems4.12/./isl/.libs:/build/git-build/b-gcc-git-sparc-rtems4.12/./prev-isl/.libs' --cache-file=.././config.cache --srcdir=/home/EB/sebastian_h/archive/gcc-git/newlib/libc -- Sebastian Huber, embedded brains GmbH Address : Dornierstr. 4, D-82178 Puchheim, Germany Phone : +49 89 189 47 41-16 Fax : +49 89 189 47 41-09 E-Mail : sebastian.huber@embedded-brains.de PGP : Public key available on request. Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG. ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 2/3] Add stdin_init(), stdout_init() and stderr_init() 2017-06-23 9:23 [PATCH 1/3] Remove superfluous parameter from std() Sebastian Huber 2017-06-23 9:23 ` [PATCH 3/3] Introduce _REENT_GLOBAL_STDIO_STREAMS Sebastian Huber @ 2017-06-23 9:23 ` Sebastian Huber 2017-06-23 14:02 ` Corinna Vinschen 1 sibling, 1 reply; 9+ messages in thread From: Sebastian Huber @ 2017-06-23 9:23 UTC (permalink / raw) To: newlib This simplifies further changes in this area. Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de> --- newlib/libc/stdio/findfp.c | 50 ++++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/newlib/libc/stdio/findfp.c b/newlib/libc/stdio/findfp.c index ecc65d6d3..601795098 100644 --- a/newlib/libc/stdio/findfp.c +++ b/newlib/libc/stdio/findfp.c @@ -84,6 +84,36 @@ _DEFUN(std, (ptr, flags, file), #endif } +static void +stdin_init(FILE *ptr) +{ + std (ptr, __SRD, 0); +} + +static void +stdout_init(FILE *ptr) +{ + /* On platforms that have true file system I/O, we can verify + whether stdout is an interactive terminal or not, as part of + __smakebuf on first use of the stream. For all other platforms, + we will default to line buffered mode here. Technically, POSIX + requires both stdin and stdout to be line-buffered, but tradition + leaves stdin alone on systems without fcntl. */ +#ifdef HAVE_FCNTL + std (ptr, __SWR, 1); +#else + std (ptr, __SWR | __SLBF, 1); +#endif +} + +static void +stderr_init(FILE *ptr) +{ + /* POSIX requires stderr to be opened for reading and writing, even + when the underlying fd 2 is write-only. */ + std (ptr, __SRW | __SNBF, 2); +} + struct glue_with_file { struct _glue glue; FILE file; @@ -235,23 +265,9 @@ _DEFUN(__sinit, (s), s->_stderr = __sfp(s); #endif - std (s->_stdin, __SRD, 0); - - /* On platforms that have true file system I/O, we can verify - whether stdout is an interactive terminal or not, as part of - __smakebuf on first use of the stream. For all other platforms, - we will default to line buffered mode here. Technically, POSIX - requires both stdin and stdout to be line-buffered, but tradition - leaves stdin alone on systems without fcntl. */ -#ifdef HAVE_FCNTL - std (s->_stdout, __SWR, 1); -#else - std (s->_stdout, __SWR | __SLBF, 1); -#endif - - /* POSIX requires stderr to be opened for reading and writing, even - when the underlying fd 2 is write-only. */ - std (s->_stderr, __SRW | __SNBF, 2); + stdin_init (s->_stdin); + stdout_init (s->_stdout); + stderr_init (s->_stderr); s->__sdidinit = 1; -- 2.12.3 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/3] Add stdin_init(), stdout_init() and stderr_init() 2017-06-23 9:23 ` [PATCH 2/3] Add stdin_init(), stdout_init() and stderr_init() Sebastian Huber @ 2017-06-23 14:02 ` Corinna Vinschen 2017-06-26 6:15 ` Sebastian Huber 0 siblings, 1 reply; 9+ messages in thread From: Corinna Vinschen @ 2017-06-23 14:02 UTC (permalink / raw) To: newlib [-- Attachment #1: Type: text/plain, Size: 1588 bytes --] Hi Sebastian, On Jun 23 11:22, Sebastian Huber wrote: > This simplifies further changes in this area. > > Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de> > --- > newlib/libc/stdio/findfp.c | 50 ++++++++++++++++++++++++++++++---------------- > 1 file changed, 33 insertions(+), 17 deletions(-) > > diff --git a/newlib/libc/stdio/findfp.c b/newlib/libc/stdio/findfp.c > index ecc65d6d3..601795098 100644 > --- a/newlib/libc/stdio/findfp.c > +++ b/newlib/libc/stdio/findfp.c > @@ -84,6 +84,36 @@ _DEFUN(std, (ptr, flags, file), > #endif > } > > +static void > +stdin_init(FILE *ptr) > +{ > + std (ptr, __SRD, 0); > +} > + > +static void > +stdout_init(FILE *ptr) > +{ > + /* On platforms that have true file system I/O, we can verify > + whether stdout is an interactive terminal or not, as part of > + __smakebuf on first use of the stream. For all other platforms, > + we will default to line buffered mode here. Technically, POSIX > + requires both stdin and stdout to be line-buffered, but tradition > + leaves stdin alone on systems without fcntl. */ > +#ifdef HAVE_FCNTL > + std (ptr, __SWR, 1); > +#else > + std (ptr, __SWR | __SLBF, 1); > +#endif > +} > + > +static void > +stderr_init(FILE *ptr) > +{ > + /* POSIX requires stderr to be opened for reading and writing, even > + when the underlying fd 2 is write-only. */ > + std (ptr, __SRW | __SNBF, 2); > +} >. + Perhaps these func should be inline? Corinna -- Corinna Vinschen Cygwin Maintainer Red Hat [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/3] Add stdin_init(), stdout_init() and stderr_init() 2017-06-23 14:02 ` Corinna Vinschen @ 2017-06-26 6:15 ` Sebastian Huber 2017-06-26 6:24 ` Sebastian Huber 0 siblings, 1 reply; 9+ messages in thread From: Sebastian Huber @ 2017-06-26 6:15 UTC (permalink / raw) To: newlib On 23/06/17 16:02, Corinna Vinschen wrote: >> +static void >> +stderr_init(FILE *ptr) >> +{ >> + /* POSIX requires stderr to be opened for reading and writing, even >> + when the underlying fd 2 is write-only. */ >> + std (ptr, __SRW | __SNBF, 2); >> +} >> . + > Perhaps these func should be inline? Ok, I change them to "static __inline void". -- Sebastian Huber, embedded brains GmbH Address : Dornierstr. 4, D-82178 Puchheim, Germany Phone : +49 89 189 47 41-16 Fax : +49 89 189 47 41-09 E-Mail : sebastian.huber@embedded-brains.de PGP : Public key available on request. Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/3] Add stdin_init(), stdout_init() and stderr_init() 2017-06-26 6:15 ` Sebastian Huber @ 2017-06-26 6:24 ` Sebastian Huber 2017-06-26 8:22 ` Corinna Vinschen 0 siblings, 1 reply; 9+ messages in thread From: Sebastian Huber @ 2017-06-26 6:24 UTC (permalink / raw) To: newlib On 26/06/17 08:15, Sebastian Huber wrote: > On 23/06/17 16:02, Corinna Vinschen wrote: > >>> +static void >>> +stderr_init(FILE *ptr) >>> +{ >>> + /* POSIX requires stderr to be opened for reading and writing, even >>> + when the underlying fd 2 is write-only. */ >>> + std (ptr, __SRW | __SNBF, 2); >>> +} >>> . + >> Perhaps these func should be inline? > > Ok, I change them to "static __inline void". Or simply "static inline void"? Is it time to assume at least a C99 compiler for the Newlib sources? -- Sebastian Huber, embedded brains GmbH Address : Dornierstr. 4, D-82178 Puchheim, Germany Phone : +49 89 189 47 41-16 Fax : +49 89 189 47 41-09 E-Mail : sebastian.huber@embedded-brains.de PGP : Public key available on request. Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/3] Add stdin_init(), stdout_init() and stderr_init() 2017-06-26 6:24 ` Sebastian Huber @ 2017-06-26 8:22 ` Corinna Vinschen 0 siblings, 0 replies; 9+ messages in thread From: Corinna Vinschen @ 2017-06-26 8:22 UTC (permalink / raw) To: newlib [-- Attachment #1: Type: text/plain, Size: 941 bytes --] On Jun 26 08:17, Sebastian Huber wrote: > On 26/06/17 08:15, Sebastian Huber wrote: > > > On 23/06/17 16:02, Corinna Vinschen wrote: > > > > > > +static void > > > > +stderr_init(FILE *ptr) > > > > +{ > > > > + /* POSIX requires stderr to be opened for reading and writing, even > > > > + when the underlying fd 2 is write-only. */ > > > > + std (ptr, __SRW | __SNBF, 2); > > > > +} > > > > . + > > > Perhaps these func should be inline? > > > > Ok, I change them to "static __inline void". > > Or simply "static inline void"? Is it time to assume at least a C99 compiler > for the Newlib sources? We're already using inline in the local arc4random header and in a couple of target dependent files. I guess we can safely assume a C99 compiler should be used for building newlib itself. That doesn't hold for exported headers, of course. Corinna -- Corinna Vinschen Cygwin Maintainer Red Hat [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2017-06-26 8:22 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2017-06-23 9:23 [PATCH 1/3] Remove superfluous parameter from std() Sebastian Huber 2017-06-23 9:23 ` [PATCH 3/3] Introduce _REENT_GLOBAL_STDIO_STREAMS Sebastian Huber 2017-06-23 21:53 ` Freddie Chopin 2017-06-26 5:59 ` Sebastian Huber 2017-06-23 9:23 ` [PATCH 2/3] Add stdin_init(), stdout_init() and stderr_init() Sebastian Huber 2017-06-23 14:02 ` Corinna Vinschen 2017-06-26 6:15 ` Sebastian Huber 2017-06-26 6:24 ` Sebastian Huber 2017-06-26 8:22 ` Corinna Vinschen
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).