summaryrefslogtreecommitdiffstats
path: root/man3p/getchar_unlocked.3p
diff options
context:
space:
mode:
Diffstat (limited to 'man3p/getchar_unlocked.3p')
-rw-r--r--man3p/getchar_unlocked.3p157
1 files changed, 157 insertions, 0 deletions
diff --git a/man3p/getchar_unlocked.3p b/man3p/getchar_unlocked.3p
new file mode 100644
index 000000000..20bf63d70
--- /dev/null
+++ b/man3p/getchar_unlocked.3p
@@ -0,0 +1,157 @@
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved
+.TH "GETC_UNLOCKED" P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" getc_unlocked
+.SH NAME
+getc_unlocked, getchar_unlocked, putc_unlocked, putchar_unlocked \-
+stdio with explicit client locking
+.SH SYNOPSIS
+.LP
+\fB#include <stdio.h>
+.br
+.sp
+int getc_unlocked(FILE *\fP\fIstream\fP\fB);
+.br
+int getchar_unlocked(void);
+.br
+int putc_unlocked(int\fP \fIc\fP\fB, FILE *\fP\fIstream\fP\fB);
+.br
+int putchar_unlocked(int\fP \fIc\fP\fB); \fP
+\fB
+.br
+\fP
+.SH DESCRIPTION
+.LP
+Versions of the functions \fIgetc\fP(), \fIgetchar\fP(), \fIputc\fP(),
+and \fIputchar\fP() respectively named \fIgetc_unlocked\fP(), \fIgetchar_unlocked\fP(),
+\fIputc_unlocked\fP(), and \fIputchar_unlocked\fP() shall be provided
+which are functionally equivalent to the original versions,
+with the exception that they are not required to be implemented in
+a thread-safe manner. They may only safely be used within a
+scope protected by \fIflockfile\fP() (or \fIftrylockfile\fP()) and
+\fIfunlockfile\fP().
+These functions may safely be used in a multi-threaded program if
+and only if they are called while the invoking thread owns the (
+\fBFILE *\fP) object, as is the case after a successful call to the
+\fIflockfile\fP()
+or \fIftrylockfile\fP() functions.
+.SH RETURN VALUE
+.LP
+See \fIgetc\fP() , \fIgetchar\fP() , \fIputc\fP()
+, and \fIputchar\fP() .
+.SH ERRORS
+.LP
+See \fIgetc\fP() , \fIgetchar\fP() , \fIputc\fP()
+, and \fIputchar\fP() .
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+Since they may be implemented as macros, \fIgetc_unlocked\fP() and
+\fIputc_unlocked\fP() may treat incorrectly a \fIstream\fP
+argument with side effects. In particular, \fIgetc_unlocked\fP(*f++)
+and \fIputc_unlocked\fP(*f++) do not necessarily work as
+expected. Therefore, use of these functions in such situations should
+be preceded by the following statement as appropriate:
+.sp
+.RS
+.nf
+
+\fB#undef getc_unlocked
+#undef putc_unlocked
+\fP
+.fi
+.RE
+.SH RATIONALE
+.LP
+Some I/O functions are typically implemented as macros for performance
+reasons (for example, \fIputc\fP() and \fIgetc\fP()). For safety,
+they need to be
+synchronized, but it is often too expensive to synchronize on every
+character. Nevertheless, it was felt that the safety concerns
+were more important; consequently, the \fIgetc\fP(), \fIgetchar\fP(),
+\fIputc\fP(), and \fIputchar\fP() functions are required to be thread-safe.
+However, unlocked versions are also
+provided with names that clearly indicate the unsafe nature of their
+operation but can be used to exploit their higher performance.
+These unlocked versions can be safely used only within explicitly
+locked program regions, using exported locking primitives. In
+particular, a sequence such as:
+.sp
+.RS
+.nf
+
+\fBflockfile(fileptr);
+putc_unlocked('1', fileptr);
+putc_unlocked('\\n', fileptr);
+fprintf(fileptr, "Line 2\\n");
+funlockfile(fileptr);
+\fP
+.fi
+.RE
+.LP
+is permissible, and results in the text sequence:
+.sp
+.RS
+.nf
+
+\fB1
+Line 2
+\fP
+.fi
+.RE
+.LP
+being printed without being interspersed with output from other threads.
+.LP
+It would be wrong to have the standard names such as \fIgetc\fP(),
+\fIputc\fP(), and so on, map to the "faster, but unsafe" rather than
+the "slower, but safe''
+versions. In either case, you would still want to inspect all uses
+of \fIgetc\fP(), \fIputc\fP(), and so on, by hand when converting
+existing code. Choosing the safe bindings as the
+default, at least, results in correct code and maintains the "atomicity
+at the function" invariant. To do otherwise would
+introduce gratuitous synchronization errors into converted code. Other
+routines that modify the \fIstdio\fP ( \fBFILE *\fP)
+structures or buffers are also safely synchronized.
+.LP
+Note that there is no need for functions of the form \fIgetc_locked\fP(),
+\fIputc_locked\fP(), and so on, since this is the
+functionality of \fIgetc\fP(), \fIputc\fP(), \fIet
+al\fP. It would be inappropriate to use a feature test macro to switch
+a macro definition of \fIgetc\fP() between \fIgetc_locked\fP() and
+\fIgetc_unlocked\fP(), since the ISO\ C standard
+requires an actual function to exist, a function whose behavior could
+not be changed by the feature test macro. Also, providing
+both the \fIxxx_locked\fP() and \fIxxx_unlocked\fP() forms leads to
+the confusion of whether the suffix describes the behavior of
+the function or the circumstances under which it should be used.
+.LP
+Three additional routines, \fIflockfile\fP(), \fIftrylockfile\fP(),
+and \fIfunlockfile\fP()
+(which may be macros), are provided to allow the user to delineate
+a sequence of I/O statements that are executed
+synchronously.
+.LP
+The \fIungetc\fP() function is infrequently called relative to the
+other
+functions/macros so no unlocked variation is needed.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIgetc\fP() , \fIgetchar\fP() , \fIputc\fP() , \fIputchar\fP() ,
+the Base Definitions volume of IEEE\ Std\ 1003.1-2001, \fI<stdio.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .