Index: libc/stdio/fread.c =================================================================== RCS file: /cvs/src/src/newlib/libc/stdio/fread.c,v retrieving revision 1.22 diff -u -p -r1.22 fread.c --- libc/stdio/fread.c 18 Nov 2013 17:28:05 -0000 1.22 +++ libc/stdio/fread.c 17 Dec 2014 18:27:13 -0000 @@ -17,22 +17,35 @@ /* FUNCTION -<>---read array elements from a file +<>. <>---read array elements from a file INDEX fread INDEX + fread_unlocked +INDEX _fread_r +INDEX + _fread_unlocked_r ANSI_SYNOPSIS #include size_t fread(void *restrict <[buf]>, size_t <[size]>, size_t <[count]>, FILE *restrict <[fp]>); + #define _BSD_SOURCE + #include + size_t fread_unlocked(void *restrict <[buf]>, size_t <[size]>, size_t <[count]>, + FILE *restrict <[fp]>); + #include size_t _fread_r(struct _reent *<[ptr]>, void *restrict <[buf]>, size_t <[size]>, size_t <[count]>, FILE *restrict <[fp]>); + #include + size_t _fread_unlocked_r(struct _reent *<[ptr]>, void *restrict <[buf]>, + size_t <[size]>, size_t <[count]>, FILE *restrict <[fp]>); + TRAD_SYNOPSIS #include size_t fread(<[buf]>, <[size]>, <[count]>, <[fp]>) @@ -41,6 +54,14 @@ TRAD_SYNOPSIS size_t <[count]>; FILE *<[fp]>; + #define _BSD_SOURCE + #include + size_t fread_unlocked(<[buf]>, <[size]>, <[count]>, <[fp]>) + char *<[buf]>; + size_t <[size]>; + size_t <[count]>; + FILE *<[fp]>; + #include size_t _fread_r(<[ptr]>, <[buf]>, <[size]>, <[count]>, <[fp]>) struct _reent *<[ptr]>; @@ -49,6 +70,14 @@ TRAD_SYNOPSIS size_t <[count]>; FILE *<[fp]>; + #include + size_t _fread_unlocked_r(<[ptr]>, <[buf]>, <[size]>, <[count]>, <[fp]>) + struct _reent *<[ptr]>; + char *<[buf]>; + size_t <[size]>; + size_t <[count]>; + FILE *<[fp]>; + DESCRIPTION <> attempts to copy, from the file or stream identified by <[fp]>, <[count]> elements (each of size <[size]>) into memory, @@ -58,8 +87,17 @@ starting at <[buf]>. <> may cop <> also advances the file position indicator (if any) for <[fp]> by the number of @emph{characters} actually read. -<<_fread_r>> is simply the reentrant version of <> that -takes an additional reentrant structure pointer argument: <[ptr]>. +<> is a non-thread-safe version of <>. +<> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). This +function may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the (FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +<<_fread_r>> and <<_fread_unlocked_r>> are simply reentrant versions of the +above that take an additional reentrant structure pointer argument: <[ptr]>. RETURNS The result of <> is the number of elements it succeeded in @@ -68,6 +106,8 @@ reading. PORTABILITY ANSI C requires <>. +<> is a BSD extension also provided by GNU libc. + Supporting OS subroutines required: <>, <>, <>, <>, <>, <>, <>. */ @@ -78,6 +118,17 @@ Supporting OS subroutines required: < #include "local.h" +#ifdef FREAD_UNLOCKED +#undef _newlib_flockfile_start +#undef _newlib_flockfile_exit +#undef _newlib_flockfile_end +#define _newlib_flockfile_start(x) {} +#define _newlib_flockfile_exit(x) {} +#define _newlib_flockfile_end(x) {} +#define _fread_r _fread_unlocked_r +#define fread fread_unlocked +#endif + #ifdef __SCLE static size_t _DEFUN(crlf_r, (ptr, fp, buf, count, eof), Index: libc/stdio/fread_u.c =================================================================== RCS file: libc/stdio/fread_u.c diff -N libc/stdio/fread_u.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ libc/stdio/fread_u.c 17 Dec 2014 18:27:13 -0000 @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define FREAD_UNLOCKED +#include "fread.c"