svn commit: trunk/uClibc/libc/stdio

Carmelo AMOROSO carmelo.amoroso at st.com
Thu Jul 31 08:18:22 UTC 2008


vda at uclibc.org wrote:
> Author: vda
> Date: 2008-04-09 12:51:18 -0700 (Wed, 09 Apr 2008)
> New Revision: 21683
> 
> Log:
> Factor out the core of vprintf() into separate function
> vprintf_internal, so that:
> * vprintf() does locking and __STDIO_STREAM_TRANS_TO_WRITE thing,
>   then calls vprintf_internal
> * vsnprintf, vdprintf.c, vasprintf.c use
>   vprintf_internal directly
> 
> This makes sprintf faster (since it doesn't do any locking)
> and stops it from pulling in fseek in static compile.
> 
> 
> 
> Added:
>    trunk/uClibc/libc/stdio/_vfprintf_internal.c
>    trunk/uClibc/libc/stdio/_vfwprintf_internal.c
> 
> Modified:
>    trunk/uClibc/libc/stdio/Makefile.in
>    trunk/uClibc/libc/stdio/_stdio.h
>    trunk/uClibc/libc/stdio/_vfprintf.c
>    trunk/uClibc/libc/stdio/vasprintf.c
>    trunk/uClibc/libc/stdio/vdprintf.c
>    trunk/uClibc/libc/stdio/vsnprintf.c
>    trunk/uClibc/libc/stdio/vswprintf.c
> 
> 
[SNIP]
> Modified: trunk/uClibc/libc/stdio/_vfprintf.c
> ===================================================================
> --- trunk/uClibc/libc/stdio/_vfprintf.c	2008-04-09 11:38:48 UTC (rev 21682)
> +++ trunk/uClibc/libc/stdio/_vfprintf.c	2008-04-09 19:51:18 UTC (rev 21683)
> @@ -1198,7 +1198,7 @@
>  
>  #endif
>  /**********************************************************************/
> -#if defined(L_vfprintf) || defined(L_vfwprintf)
> +#if defined(L__vfprintf_internal) || defined(L__vfwprintf_internal)
>  
>  /* We only support ascii digits (or their USC equivalent codes) in
>   * precision and width settings in *printf (wide) format strings.
> @@ -1207,14 +1207,15 @@
>  
>  static size_t _charpad(FILE * __restrict stream, int padchar, size_t numpad);
>  
> -#ifdef L_vfprintf
> +#ifdef L__vfprintf_internal
>  
> -#define VFPRINTF vfprintf
> +#define VFPRINTF_internal _vfprintf_internal
>  #define FMT_TYPE char
>  #define OUTNSTR _outnstr
>  #define STRLEN  strlen
>  #define _PPFS_init _ppfs_init
> -#define OUTPUT(F,S)			fputs_unlocked(S,F)
> +/* Pulls in fseek: #define OUTPUT(F,S)	fputs_unlocked(S,F) */
> +#define OUTPUT(F,S)			__stdio_fwrite((const unsigned char *)(S),strlen(S),(F))

Hi Denys,
while running some test on nptl bracn with runtime assertion enabled,
I've discoverd that this change is causing uclibc aborting due to an
assert(bytes) in __stdio_fwrite, while calling fputs_unlocked all works
fine. I'd like to understand better the rationale behind and I'm
wondering if the problem is present in trunk with other arch than sh4.

To exploit the problem you simply need to call a printf with a format
string (i.e. printf("val=%d\n",x) ).

Please let me know your comments, thanks.

Carmelo




More information about the uClibc mailing list