Contents|Index|Previous|Next

# Reentrancy

Reentrancy is a characteristic of library functions allowing multiple processes to use the same address space with assurance that the values stored in those spaces will remain constant between calls.

Cygnus Solutions implements the library functions to ensure 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.

All functions which must manipulate global information are available in two versions.

- The first version has the usual name, using a single global instance of the reentrancy structure.
- The second has a different name, normally formed by prepending ‘_’ and appending ‘_r’ and taking 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 argument, 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.

- 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.
- 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 function:

_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 |  |