]> sourceware.org Git - newlib-cygwin.git/blame - newlib/libc/include/reent.h
Cygwin: console: Fix clean up conditions in close()
[newlib-cygwin.git] / newlib / libc / include / reent.h
CommitLineData
8a0efa53
CF
1/* This header file provides the reentrancy. */
2
3/* The reentrant system calls here serve two purposes:
4
5 1) Provide reentrant versions of the system calls the ANSI C library
6 requires.
7 2) Provide these system calls in a namespace clean way.
8
9 It is intended that *all* system calls that the ANSI C library needs
10 be declared here. It documents them all in one place. All library access
11 to the system is via some form of these functions.
12
3ab380aa 13 The target may provide the needed syscalls by any of the following:
8a0efa53
CF
14
15 1) Define the reentrant versions of the syscalls directly.
16 (eg: _open_r, _close_r, etc.). Please keep the namespace clean.
af5a221f
JJ
17 When you do this, set "syscall_dir" to "syscalls" and add
18 -DREENTRANT_SYSCALLS_PROVIDED to newlib_cflags in configure.host.
8a0efa53
CF
19
20 2) Define namespace clean versions of the system calls by prefixing
21 them with '_' (eg: _open, _close, etc.). Technically, there won't be
22 true reentrancy at the syscall level, but the library will be namespace
23 clean.
af5a221f 24 When you do this, set "syscall_dir" to "syscalls" in configure.host.
8a0efa53
CF
25
26 3) Define or otherwise provide the regular versions of the syscalls
27 (eg: open, close, etc.). The library won't be reentrant nor namespace
28 clean, but at least it will work.
af5a221f
JJ
29 When you do this, add -DMISSING_SYSCALL_NAMES to newlib_cflags in
30 configure.host.
8a0efa53 31
3ab380aa
JJ
32 4) Define or otherwise provide the regular versions of the syscalls,
33 and do not supply functional interfaces for any of the reentrant
34 calls. With this method, the reentrant syscalls are redefined to
35 directly call the regular system call without the reentrancy argument.
36 When you do this, specify both -DREENTRANT_SYSCALLS_PROVIDED and
37 -DMISSING_SYSCALL_NAMES via newlib_cflags in configure.host and do
38 not specify "syscall_dir".
39
8a0efa53 40 Stubs of the reentrant versions of the syscalls exist in the libc/reent
3ab380aa
JJ
41 source directory and are provided if REENTRANT_SYSCALLS_PROVIDED isn't
42 defined. These stubs call the native system calls: _open, _close, etc.
43 if MISSING_SYSCALL_NAMES is *not* defined, otherwise they call the
44 non-underscored versions: open, close, etc. when MISSING_SYSCALL_NAMES
45 *is* defined.
46
47 By default, newlib functions call the reentrant syscalls internally,
48 passing a reentrancy structure as an argument. This reentrancy structure
49 contains data that is thread-specific. For example, the errno value is
50 kept in the reentrancy structure. If multiple threads exist, each will
51 keep a separate errno value which is intuitive since the application flow
52 cannot check for failure reliably otherwise.
53
54 The reentrant syscalls are either provided by the platform, by the
55 libc/reent stubs, or in the case of both MISSING_SYSCALL_NAMES and
56 REENTRANT_SYSCALLS_PROVIDED being defined, the calls are redefined to
57 simply call the regular syscalls with no reentrancy struct argument.
58
59 A single-threaded application does not need to worry about the reentrancy
60 structure. It is used internally.
61
62 A multi-threaded application needs either to manually manage reentrancy
63 structures or use dynamic reentrancy.
64
65 Manually managing reentrancy structures entails calling special reentrant
66 versions of newlib functions that have an additional reentrancy argument.
67 For example, _printf_r. By convention, the first argument is the
68 reentrancy structure. By default, the normal version of the function
69 uses the default reentrancy structure: _REENT. The reentrancy structure
70 is passed internally, eventually to the reentrant syscalls themselves.
71 How the structures are stored and accessed in this model is up to the
72 application.
73
74 Dynamic reentrancy is specified by the __DYNAMIC_REENT__ flag. This
75 flag denotes setting up a macro to replace _REENT with a function call
76 to __getreent(). This function needs to be implemented by the platform
77 and it is meant to return the reentrancy structure for the current
78 thread. When the regular C functions (e.g. printf) go to call internal
79 routines with the default _REENT structure, they end up calling with
80 the reentrancy structure for the thread. Thus, application code does not
81 need to call the _r routines nor worry about reentrancy structures. */
8a0efa53
CF
82
83/* WARNING: All identifiers here must begin with an underscore. This file is
84 included by stdio.h and others and we therefore must only use identifiers
85 in the namespace allotted to us. */
86
87#ifndef _REENT_H_
88#ifdef __cplusplus
89extern "C" {
90#endif
91#define _REENT_H_
92
93#include <sys/reent.h>
94#include <sys/_types.h>
8a0efa53
CF
95
96#define __need_size_t
ad552766 97#define __need_ptrdiff_t
8a0efa53
CF
98#include <stddef.h>
99
100/* FIXME: not namespace clean */
101struct stat;
102struct tms;
103struct timeval;
104struct timezone;
105
3ab380aa
JJ
106#if defined(REENTRANT_SYSCALLS_PROVIDED) && defined(MISSING_SYSCALL_NAMES)
107
108#define _close_r(__reent, __fd) close(__fd)
109#define _execve_r(__reent, __f, __arg, __env) execve(__f, __arg, __env)
110#define _fcntl_r(__reent, __fd, __cmd, __arg) fcntl(__fd, __cmd, __arg)
111#define _fork_r(__reent) fork()
112#define _fstat_r(__reent, __fdes, __stat) fstat(__fdes, __stat)
113#define _getpid_r(__reent) getpid()
114#define _isatty_r(__reent, __desc) isatty(__desc)
115#define _kill_r(__reent, __pid, __signal) kill(__pid, __signal)
116#define _link_r(__reent, __oldpath, __newpath) link(__oldpath, __newpath)
117#define _lseek_r(__reent, __fdes, __off, __w) lseek(__fdes, __off, __w)
12387ab6 118#define _mkdir_r(__reent, __path, __m) mkdir(__path, __m)
3ab380aa
JJ
119#define _open_r(__reent, __path, __flag, __m) open(__path, __flag, __m)
120#define _read_r(__reent, __fd, __buff, __cnt) read(__fd, __buff, __cnt)
0aca33c8 121#define _rename_r(__reent, __old, __new) rename(__old, __new)
3ab380aa
JJ
122#define _sbrk_r(__reent, __incr) sbrk(__incr)
123#define _stat_r(__reent, __path, __buff) stat(__path, __buff)
124#define _times_r(__reent, __time) times(__time)
125#define _unlink_r(__reent, __path) unlink(__path)
126#define _wait_r(__reent, __status) wait(__status)
127#define _write_r(__reent, __fd, __buff, __cnt) write(__fd, __buff, __cnt)
b9e867d0 128#define _getentropy_r(__reent, __buff, __cnt) getentropy(__buff, __cnt)
3ab380aa
JJ
129#define _gettimeofday_r(__reent, __tp, __tzp) gettimeofday(__tp, __tzp)
130
131#ifdef __LARGE64_FILES
132#define _lseek64_r(__reent, __fd, __off, __w) lseek64(__fd, __off, __w)
133#define _fstat64_r(__reent, __fd, __buff) fstat64(__fd, __buff)
134#define _open64_r(__reent, __path, __flag, __m) open64(__path, __flag, __m)
135#endif
136
137#else
8a0efa53
CF
138/* Reentrant versions of system calls. */
139
eea249da
YS
140extern int _close_r (struct _reent *, int);
141extern int _execve_r (struct _reent *, const char *, char *const *, char *const *);
142extern int _fcntl_r (struct _reent *, int, int, int);
143extern int _fork_r (struct _reent *);
144extern int _fstat_r (struct _reent *, int, struct stat *);
145extern int _getpid_r (struct _reent *);
146extern int _isatty_r (struct _reent *, int);
147extern int _kill_r (struct _reent *, int, int);
148extern int _link_r (struct _reent *, const char *, const char *);
149extern _off_t _lseek_r (struct _reent *, int, _off_t, int);
150extern int _mkdir_r (struct _reent *, const char *, int);
151extern int _open_r (struct _reent *, const char *, int, int);
152extern _ssize_t _read_r (struct _reent *, int, void *, size_t);
153extern int _rename_r (struct _reent *, const char *, const char *);
154extern void *_sbrk_r (struct _reent *, ptrdiff_t);
155extern int _stat_r (struct _reent *, const char *, struct stat *);
156extern _CLOCK_T_ _times_r (struct _reent *, struct tms *);
157extern int _unlink_r (struct _reent *, const char *);
158extern int _wait_r (struct _reent *, int *);
159extern _ssize_t _write_r (struct _reent *, int, const void *, size_t);
b9e867d0 160extern int _getentropy_r (struct _reent *, void *, size_t);
8a0efa53
CF
161
162/* This one is not guaranteed to be available on all targets. */
eea249da 163extern int _gettimeofday_r (struct _reent *, struct timeval *__tp, void *__tzp);
8a0efa53 164
dee51391 165#ifdef __LARGE64_FILES
880fa247 166
880fa247 167
1875ee55
CV
168#if defined(__CYGWIN__)
169#define stat64 stat
170#endif
dee51391
JJ
171struct stat64;
172
eea249da
YS
173extern _off64_t _lseek64_r (struct _reent *, int, _off64_t, int);
174extern int _fstat64_r (struct _reent *, int, struct stat64 *);
175extern int _open64_r (struct _reent *, const char *, int, int);
176extern int _stat64_r (struct _reent *, const char *, struct stat64 *);
1875ee55
CV
177
178/* Don't pollute namespace if not building newlib. */
6226bad0 179#if defined (__CYGWIN__) && !defined (_LIBC)
1875ee55
CV
180#undef stat64
181#endif
182
dee51391
JJ
183#endif
184
3ab380aa
JJ
185#endif
186
8a0efa53
CF
187#ifdef __cplusplus
188}
189#endif
190#endif /* _REENT_H_ */
This page took 0.526402 seconds and 6 git commands to generate.