118 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			TeX
		
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			TeX
		
	
	
	
@node Reentrancy
 | 
						|
@chapter Reentrancy
 | 
						|
 | 
						|
@cindex reentrancy
 | 
						|
Reentrancy is a characteristic of library functions which allows multiple
 | 
						|
processes to use the same address space with assurance that the values stored
 | 
						|
in those spaces will remain constant between calls. The Red Hat
 | 
						|
newlib implementation of the library functions ensures that 
 | 
						|
whenever possible, these library functions are reentrant.  However,
 | 
						|
there are some functions that can not be trivially made reentrant.
 | 
						|
Hooks have been provided to allow you to use these functions in a fully
 | 
						|
reentrant fashion.
 | 
						|
 | 
						|
@findex _reent
 | 
						|
@findex reent.h
 | 
						|
@cindex reentrancy structure
 | 
						|
These hooks use the structure @code{_reent} defined in @file{reent.h}.
 | 
						|
A variable defined as @samp{struct _reent} is called a @dfn{reentrancy
 | 
						|
structure}.  All functions which must manipulate global information are
 | 
						|
available in two versions.  The first version has the usual name, and
 | 
						|
uses a single global instance of the reentrancy structure.  The second
 | 
						|
has a different name, normally formed by prepending @samp{_} and
 | 
						|
appending @samp{_r}, and takes a pointer to the particular reentrancy
 | 
						|
structure to use.
 | 
						|
 | 
						|
For example, the function @code{fopen} takes two arguments, @var{file}
 | 
						|
and @var{mode}, and uses the global reentrancy structure.  The function
 | 
						|
@code{_fopen_r} takes the arguments, @var{struct_reent}, which is a
 | 
						|
pointer to an instance of the reentrancy structure, @var{file}
 | 
						|
and @var{mode}.	
 | 
						|
 | 
						|
There are two versions of @samp{struct _reent}, a normal one and one
 | 
						|
for small memory systems, controlled by the @code{_REENT_SMALL}
 | 
						|
definition from the (automatically included) @file{<sys/config.h>}.
 | 
						|
 | 
						|
@cindex global reentrancy structure
 | 
						|
@findex _impure_ptr
 | 
						|
Each function which uses the global reentrancy structure uses the global
 | 
						|
variable @code{_impure_ptr}, which points to a reentrancy structure.
 | 
						|
 | 
						|
This means that you have two ways to achieve reentrancy.  Both require
 | 
						|
that each thread of execution control initialize a unique global
 | 
						|
variable of type @samp{struct _reent}:
 | 
						|
 | 
						|
@enumerate
 | 
						|
@item
 | 
						|
@cindex extra argument, reentrant fns
 | 
						|
Use the reentrant versions of the library functions, after initializing
 | 
						|
a global reentrancy structure for each process.  Use the pointer to this
 | 
						|
structure as the extra argument for all library functions.
 | 
						|
 | 
						|
@item
 | 
						|
Ensure that each thread of execution control has a pointer to its own
 | 
						|
unique reentrancy structure in the global variable @code{_impure_ptr},
 | 
						|
and call the standard library subroutines.
 | 
						|
@end enumerate
 | 
						|
 | 
						|
@cindex list of reentrant functions
 | 
						|
@cindex reentrant function list
 | 
						|
The following functions are provided in both reentrant
 | 
						|
and non-reentrant versions.
 | 
						|
 | 
						|
@example
 | 
						|
@exdent @emph{Equivalent for errno variable:}
 | 
						|
_errno_r
 | 
						|
 | 
						|
@exdent @emph{Locale functions:}
 | 
						|
_localeconv_r  _setlocale_r
 | 
						|
 | 
						|
@exdent @emph{Equivalents for stdio variables:}
 | 
						|
_stdin_r        _stdout_r       _stderr_r
 | 
						|
 | 
						|
@page  
 | 
						|
@exdent @emph{Stdio functions:}
 | 
						|
_fdopen_r       _perror_r       _tempnam_r
 | 
						|
_fopen_r        _putchar_r      _tmpnam_r
 | 
						|
_getchar_r      _puts_r         _tmpfile_r
 | 
						|
_gets_r         _remove_r       _vfprintf_r
 | 
						|
_iprintf_r      _rename_r       _vsnprintf_r
 | 
						|
_mkstemp_r      _snprintf_r     _vsprintf_r
 | 
						|
_mktemp_t       _sprintf_r
 | 
						|
 | 
						|
@exdent @emph{Signal functions:}
 | 
						|
_init_signal_r  _signal_r
 | 
						|
_kill_r         __sigtramp_r
 | 
						|
_raise_r
 | 
						|
 | 
						|
@exdent @emph{Stdlib functions:}
 | 
						|
_calloc_r       _mblen_r        _setenv_r
 | 
						|
_dtoa_r         _mbstowcs_r     _srand_r
 | 
						|
_free_r         _mbtowc_r       _strtod_r
 | 
						|
_getenv_r       _memalign_r     _strtol_r
 | 
						|
_mallinfo_r     _mstats_r       _strtoul_r
 | 
						|
_malloc_r       _putenv_r       _system_r
 | 
						|
_malloc_r       _rand_r         _wcstombs_r
 | 
						|
_malloc_stats_r _realloc_r      _wctomb_r
 | 
						|
 | 
						|
@exdent @emph{String functions:}
 | 
						|
_strdup_r       _strtok_r
 | 
						|
 | 
						|
@exdent @emph{System functions:}
 | 
						|
_close_r        _link_r         _unlink_r
 | 
						|
_execve_r       _lseek_r        _wait_r
 | 
						|
_fcntl_r        _open_r         _write_r 
 | 
						|
_fork_r         _read_r
 | 
						|
_fstat_r        _sbrk_r
 | 
						|
_gettimeofday_r _stat_r
 | 
						|
_getpid_r       _times_r
 | 
						|
 | 
						|
@ifset STDIO64
 | 
						|
@exdent @emph{Additional 64-bit I/O System functions:}
 | 
						|
_fstat64_r	_lseek64_r	_open64_r
 | 
						|
@end ifset
 | 
						|
 | 
						|
@exdent @emph{Time function:}
 | 
						|
_asctime_r
 | 
						|
@end example
 |