This is the mail archive of the mailing list for the newlib project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] supplying _foo_r functions when -DREENTRANT_SYSCALLS_PROVIDED

Thanks Patrick. I modified it slightly to add documentation regarding manual reentrancy
management vs dynamic reentrancy. As well, I removed the bit about setting on

The _REENT_ONLY flag is used when manual reentrancy management is required. It
forces use of _r routines instead of their regular counterparts. In libc/reent, it implies that
the _r syscalls must exist.

Modified patch checked in.

-- Jeff J.

Patrick Mansfield wrote:
Jeff -

Here's a patch per your comments, except I didn't document the
__DYNAMIC_REENT__ as I don't understand its usage.

If this is close enough, please modify it as you see fit.

Thanks ...

newlib ChangeLog:

2008-03-27 Patrick Mansfield <>

	* libc/include/reent.h: Define _func_r functions in this file to

Index: quilt/newlib/libc/include/reent.h
--- quilt.orig/newlib/libc/include/reent.h
+++ quilt/newlib/libc/include/reent.h
@@ -10,7 +10,7 @@
be declared here. It documents them all in one place. All library access
to the system is via some form of these functions.
- There are three ways a target may provide the needed syscalls.
+ The target may provide the needed syscalls by any of the following:
1) Define the reentrant versions of the syscalls directly.
(eg: _open_r, _close_r, etc.). Please keep the namespace clean.
@@ -29,6 +29,13 @@
When you do this, add -DMISSING_SYSCALL_NAMES to newlib_cflags in
+ 4) Define or otherwise provide the regular versions of the syscalls,
+ and do not supply functional interfaces for any of the reentrant
+ calls. With this method, the reentrant versions are defined to
+ directly call the system call.
+ newlib_cflags in
Stubs of the reentrant versions of the syscalls exist in the libc/reent
source directory and are used if REENTRANT_SYSCALLS_PROVIDED isn't defined.
They use the native system calls: _open, _close, etc. if they're available
@@ -59,6 +66,41 @@ struct tms;
struct timeval;
struct timezone;
+#ifdef _REENT_ONLY
+#define _close_r(__reent, __fd) close(__fd)
+#define _execve_r(__reent, __f, __arg, __env) execve(__f, __arg, __env)
+#define _fcntl_r(__reent, __fd, __cmd, __arg) fcntl(__fd, __cmd, __arg)
+#define _fork_r(__reent) fork()
+#define _fstat_r(__reent, __fdes, __stat) fstat(__fdes, __stat)
+#define _getpid_r(__reent) getpid()
+#define _isatty_r(__reent, __desc) isatty(__desc)
+#define _kill_r(__reent, __pid, __signal) kill(__pid, __signal)
+#define _link_r(__reent, __oldpath, __newpath) link(__oldpath, __newpath)
+#define _lseek_r(__reent, __fdes, __off, __w) lseek(__fdes, __off, __w)
+#define _open_r(__reent, __path, __flag, __m) open(__path, __flag, __m)
+#define _read_r(__reent, __fd, __buff, __cnt) read(__fd, __buff, __cnt)
+#define _sbrk_r(__reent, __incr) sbrk(__incr)
+#define _stat_r(__reent, __path, __buff) stat(__path, __buff)
+#define _times_r(__reent, __time) times(__time)
+#define _unlink_r(__reent, __path) unlink(__path)
+#define _wait_r(__reent, __status) wait(__status)
+#define _write_r(__reent, __fd, __buff, __cnt) write(__fd, __buff, __cnt)
+#define _gettimeofday_r(__reent, __tp, __tzp) gettimeofday(__tp, __tzp)
+#ifdef __LARGE64_FILES
+#define _lseek64_r(__reent, __fd, __off, __w) lseek64(__fd, __off, __w)
+#define _fstat64_r(__reent, __fd, __buff) fstat64(__fd, __buff)
+#define _open64_r(__reent, __path, __flag, __m) open64(__path, __flag, __m)
/* Reentrant versions of system calls. */
extern int _close_r _PARAMS ((struct _reent *, int));
@@ -96,6 +138,8 @@ extern int _fstat64_r _PARAMS ((struct _
extern int _open64_r _PARAMS ((struct _reent *, const char *, int, int));
#ifdef __cplusplus

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]