Go to the first, previous, next, last section, table of contents.


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. Cygnus's 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.

These hooks use the structure _reent defined in `reent.h'. A variable defined as `struct _reent' is called a 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 `_' and appending `_r', and takes a pointer to the particular reentrancy structure to use.

For example, the function fopen takes two arguments, file and mode, and uses the global reentrancy structure. The function _fopen_r takes the arguments, struct_reent, which is a pointer to an instance of the reentrancy structure, file and mode.

Each function which uses the global reentrancy structure uses the global variable _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 `struct _reent':

  1. 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.
  2. Ensure that each thread of execution control has a pointer to its own unique reentrancy structure in the global variable _impure_ptr, and call the standard library subroutines.

The following functions are provided in both reentrant and non-reentrant versions.

Equivalent for errno variable:
_errno_r

Locale functions:
_localeconv_r  _setlocale_r

Equivalents for stdio variables:
_stdin_r        _stdout_r       _stderr_r

Stdio functions:
_fdopen_r       _mkstemp_r       _remove_r
_fopen_r        _mktemp_r        _rename_r
_getchar_r      _perror_r        _tempnam_r
_gets_r         _putchar_r       _tmpnam_r 
_iprintf_r 	_puts_r		 _tmpfile_r

Signal functions:
_raise_r        _signal_r

Stdlib functions:
_dtoa_r         _realloc_r      _strtoul_r
_free_r         _srand_r        _system_r
_malloc_r       _strtod_r
_rand_r         _strtol_r

String functions:
_strtok_r

System functions:
_close_r        _lseek_r        _stat_r
_fork_r         _open_r         _unlink_r
_fstat_r        _read_r         _wait_r
_link_r         _sbrk_r         _write_r

Time function:
_asctime_r


Go to the first, previous, next, last section, table of contents.