Page MenuHomeFreeBSD

D23336.id67261.diff
No OneTemporary

D23336.id67261.diff

Index: include/stdio.h
===================================================================
--- include/stdio.h
+++ include/stdio.h
@@ -346,7 +346,12 @@
void clearerr_unlocked(FILE *);
int feof_unlocked(FILE *);
int ferror_unlocked(FILE *);
+int fflush_unlocked(FILE *);
int fileno_unlocked(FILE *);
+int fputs_unlocked(const char * __restrict, FILE * __restrict);
+size_t fread_unlocked(void * __restrict, size_t, size_t, FILE * __restrict);
+size_t fwrite_unlocked(const void * __restrict, size_t, size_t,
+ FILE * __restrict);
#endif
#if __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE >= 500
@@ -507,10 +512,12 @@
* See ISO/IEC 9945-1 ANSI/IEEE Std 1003.1 Second Edition 1996-07-12
* B.8.2.7 for the rationale behind the *_unlocked() macros.
*/
+#define clearerr_unlocked(p) __sclearerr(p)
#define feof_unlocked(p) __sfeof(p)
#define ferror_unlocked(p) __sferror(p)
-#define clearerr_unlocked(p) __sclearerr(p)
#define fileno_unlocked(p) __sfileno(p)
+#define fputc_unlocked(s, p) __sputc(s, p)
+#define fputs_unlocked(s, p) fputs_unlocked(s, p)
#endif
#if __POSIX_VISIBLE >= 199506
#define getc_unlocked(fp) __sgetc(fp)
Index: lib/libc/stdio/Makefile.inc
===================================================================
--- lib/libc/stdio/Makefile.inc
+++ lib/libc/stdio/Makefile.inc
@@ -48,13 +48,17 @@
ferror.3 clearerr.3 ferror.3 clearerr_unlocked.3 \
ferror.3 feof.3 ferror.3 feof_unlocked.3 \
ferror.3 fileno.3 ferror.3 fileno_unlocked.3
-MLINKS+=fflush.3 fpurge.3
+MLINKS+=fflush.3 fflush_unlocked.3 \
+ fflush.3 fpurge.3
MLINKS+=fgets.3 gets.3
MLINKS+=fgets.3 gets_s.3
MLINKS+=flockfile.3 ftrylockfile.3 flockfile.3 funlockfile.3
MLINKS+=fopen.3 fdopen.3 fopen.3 freopen.3 fopen.3 fmemopen.3
-MLINKS+=fputs.3 puts.3
-MLINKS+=fread.3 fwrite.3
+MLINKS+=fputs.3 fputs_unlocked.3 \
+ fputs.3 puts.3
+MLINKS+=fread.3 fread_unlocked.3 \
+ fread.3 fwrite.3 \
+ fread.3 fwrite_unlocked.3
MLINKS+=fseek.3 fgetpos.3 fseek.3 fseeko.3 fseek.3 fsetpos.3 fseek.3 ftell.3 \
fseek.3 ftello.3 fseek.3 rewind.3
MLINKS+=funopen.3 fropen.3 funopen.3 fwopen.3
Index: lib/libc/stdio/Symbol.map
===================================================================
--- lib/libc/stdio/Symbol.map
+++ lib/libc/stdio/Symbol.map
@@ -172,6 +172,10 @@
};
FBSD_1.6 {
+ fflush_unlocked;
+ fputs_unlocked;
+ fread_unlocked;
+ fwrite_unlocked;
mkostempsat;
};
Index: lib/libc/stdio/fflush.3
===================================================================
--- lib/libc/stdio/fflush.3
+++ lib/libc/stdio/fflush.3
@@ -32,11 +32,12 @@
.\" @(#)fflush.3 8.1 (Berkeley) 6/4/93
.\" $FreeBSD$
.\"
-.Dd December 25, 2017
+.Dd January 23, 2020
.Dt FFLUSH 3
.Os
.Sh NAME
.Nm fflush ,
+.Nm fflush_unlocked ,
.Nm fpurge
.Nd flush a stream
.Sh LIBRARY
@@ -46,6 +47,8 @@
.Ft int
.Fn fflush "FILE *stream"
.Ft int
+.Fn fflush_unlocked "FILE *stream"
+.Ft int
.Fn fpurge "FILE *stream"
.Sh DESCRIPTION
The function
@@ -64,6 +67,16 @@
.Em all
open output streams.
.Pp
+The
+.Fn fflush_unlocked
+function is equivalent to
+.Fn fflush ,
+except that the caller is responsible for locking the stream with
+.Xr flockfile 3
+before calling it.
+This function may be used to avoid the overhead of locking the stream and to
+prevent races when multiple threads are operating on the same stream.
+.Pp
The function
.Fn fpurge
erases any input or output buffered in the given
Index: lib/libc/stdio/fflush.c
===================================================================
--- lib/libc/stdio/fflush.c
+++ lib/libc/stdio/fflush.c
@@ -45,6 +45,8 @@
#include "libc_private.h"
#include "local.h"
+#undef fflush_unlocked
+
static int sflush_locked(FILE *);
/*
@@ -100,6 +102,8 @@
return (retval);
}
+__weak_reference(__fflush, fflush_unlocked);
+
int
__sflush(FILE *fp)
{
Index: lib/libc/stdio/fputc.c
===================================================================
--- lib/libc/stdio/fputc.c
+++ lib/libc/stdio/fputc.c
@@ -44,6 +44,8 @@
#include "local.h"
#include "libc_private.h"
+#undef fputc_unlocked
+
int
fputc(int c, FILE *fp)
{
Index: lib/libc/stdio/fputs.3
===================================================================
--- lib/libc/stdio/fputs.3
+++ lib/libc/stdio/fputs.3
@@ -32,11 +32,12 @@
.\" @(#)fputs.3 8.1 (Berkeley) 6/4/93
.\" $FreeBSD$
.\"
-.Dd June 4, 1993
+.Dd January 23, 2020
.Dt FPUTS 3
.Os
.Sh NAME
.Nm fputs ,
+.Nm fputs_unlocked ,
.Nm puts
.Nd output a line to a stream
.Sh LIBRARY
@@ -46,6 +47,8 @@
.Ft int
.Fn fputs "const char *str" "FILE *stream"
.Ft int
+.Fn fputs_unlocked "const char *str" "FILE *stream"
+.Ft int
.Fn puts "const char *str"
.Sh DESCRIPTION
The function
@@ -58,6 +61,16 @@
.\" .Dv NUL
.\" character is not written.
.Pp
+The
+.Fn fputs_unlocked
+function is equivalent to
+.Fn fputs ,
+except that the caller is responsible for locking the stream with
+.Xr flockfile 3
+before calling it.
+This function may be used to avoid the overhead of locking the stream and to
+prevent races when multiple threads are operating on the same stream.
+.Pp
The function
.Fn puts
writes the string
Index: lib/libc/stdio/fputs.c
===================================================================
--- lib/libc/stdio/fputs.c
+++ lib/libc/stdio/fputs.c
@@ -47,11 +47,13 @@
#include "libc_private.h"
#include "local.h"
+#undef fputs_unlocked
+
/*
* Write the given string to the given file.
*/
int
-fputs(const char * __restrict s, FILE * __restrict fp)
+fputs_unlocked(const char * __restrict s, FILE * __restrict fp)
{
int retval;
struct __suio uio;
@@ -61,11 +63,20 @@
uio.uio_resid = iov.iov_len = strlen(s);
uio.uio_iov = &iov;
uio.uio_iovcnt = 1;
- FLOCKFILE_CANCELSAFE(fp);
ORIENT(fp, -1);
retval = __sfvwrite(fp, &uio);
- FUNLOCKFILE_CANCELSAFE();
if (retval == 0)
return (iov.iov_len > INT_MAX ? INT_MAX : iov.iov_len);
return (retval);
}
+
+int
+fputs(const char * __restrict s, FILE * __restrict fp)
+{
+ int retval;
+
+ FLOCKFILE_CANCELSAFE(fp);
+ retval = fputs_unlocked(s, fp);
+ FUNLOCKFILE_CANCELSAFE();
+ return (retval);
+}
Index: lib/libc/stdio/fread.3
===================================================================
--- lib/libc/stdio/fread.3
+++ lib/libc/stdio/fread.3
@@ -32,12 +32,14 @@
.\" @(#)fread.3 8.2 (Berkeley) 3/8/94
.\" $FreeBSD$
.\"
-.Dd March 8, 1994
+.Dd January 23, 2020
.Dt FREAD 3
.Os
.Sh NAME
.Nm fread ,
-.Nm fwrite
+.Nm fread_unlocked ,
+.Nm fwrite ,
+.Nm fwrite_unlocked
.Nd binary stream input/output
.Sh LIBRARY
.Lb libc
@@ -46,7 +48,11 @@
.Ft size_t
.Fn fread "void * restrict ptr" "size_t size" "size_t nmemb" "FILE * restrict stream"
.Ft size_t
+.Fn fread_unlocked "void * restrict ptr" "size_t size" "size_t nmemb" "FILE * restrict stream"
+.Ft size_t
.Fn fwrite "const void * restrict ptr" "size_t size" "size_t nmemb" "FILE * restrict stream"
+.Ft size_t
+.Fn fwrite_unlocked "const void * restrict ptr" "size_t size" "size_t nmemb" "FILE * restrict stream"
.Sh DESCRIPTION
The function
.Fn fread
@@ -69,6 +75,21 @@
.Fa stream ,
obtaining them from the location given by
.Fa ptr .
+.Pp
+The
+.Fn fread_unlocked
+and
+.Fn fwrite_unlocked
+functions are equivalent to
+.Fn fread
+and
+.Fn fwrite
+respectively, except that the caller is responsible for locking the stream
+with
+.Xr flockfile 3
+before calling them.
+These functions may be used to avoid the overhead of locking the stream
+and to prevent races when multiple threads are operating on the same stream.
.Sh RETURN VALUES
The functions
.Fn fread
Index: lib/libc/stdio/fread.c
===================================================================
--- lib/libc/stdio/fread.c
+++ lib/libc/stdio/fread.c
@@ -47,6 +47,8 @@
#include "local.h"
#include "libc_private.h"
+#undef fread_unlocked
+
/*
* MT-safe version
*/
@@ -115,3 +117,5 @@
fp->_p += resid;
return (count);
}
+
+__weak_reference(__fread, fread_unlocked);
Index: lib/libc/stdio/fwrite.c
===================================================================
--- lib/libc/stdio/fwrite.c
+++ lib/libc/stdio/fwrite.c
@@ -47,12 +47,15 @@
#include "fvwrite.h"
#include "libc_private.h"
+#undef fwrite_unlocked
+
/*
* Write `count' objects (each size `size') from memory to the given file.
* Return the number of whole objects written.
*/
size_t
-fwrite(const void * __restrict buf, size_t size, size_t count, FILE * __restrict fp)
+fwrite_unlocked(const void * __restrict buf, size_t size, size_t count,
+ FILE * __restrict fp)
{
size_t n;
struct __suio uio;
@@ -84,7 +87,6 @@
uio.uio_iov = &iov;
uio.uio_iovcnt = 1;
- FLOCKFILE_CANCELSAFE(fp);
ORIENT(fp, -1);
/*
* The usual case is success (__sfvwrite returns 0);
@@ -93,6 +95,17 @@
*/
if (__sfvwrite(fp, &uio) != 0)
count = (n - uio.uio_resid) / size;
- FUNLOCKFILE_CANCELSAFE();
return (count);
}
+
+size_t
+fwrite(const void * __restrict buf, size_t size, size_t count,
+ FILE * __restrict fp)
+{
+ size_t n;
+
+ FLOCKFILE_CANCELSAFE(fp);
+ n = fwrite_unlocked(buf, size, count, fp);
+ FUNLOCKFILE_CANCELSAFE();
+ return (n);
+}
Index: lib/libc/stdio/putc.3
===================================================================
--- lib/libc/stdio/putc.3
+++ lib/libc/stdio/putc.3
@@ -32,11 +32,12 @@
.\" @(#)putc.3 8.1 (Berkeley) 6/4/93
.\" $FreeBSD$
.\"
-.Dd January 10, 2003
+.Dd January 23, 2020
.Dt PUTC 3
.Os
.Sh NAME
.Nm fputc ,
+.Nm fputc_unlocked ,
.Nm putc ,
.Nm putc_unlocked ,
.Nm putchar ,
@@ -50,6 +51,8 @@
.Ft int
.Fn fputc "int c" "FILE *stream"
.Ft int
+.Fn fputc_unlocked "int c" "FILE *stream"
+.Ft int
.Fn putc "int c" "FILE *stream"
.Ft int
.Fn putc_unlocked "int c" "FILE *stream"
@@ -97,11 +100,13 @@
.Fa stream .
.Pp
The
-.Fn putc_unlocked
+.Fn fputc_unlocked ,
+.Fn putc_unlocked ,
and
.Fn putchar_unlocked
functions are equivalent to
-.Fn putc
+.Fn fputc ,
+.Fn putc ,
and
.Fn putchar
respectively,

File Metadata

Mime Type
text/plain
Expires
Tue, Nov 11, 10:22 AM (11 h, 20 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25155349
Default Alt Text
D23336.id67261.diff (9 KB)

Event Timeline