reentrant.h revision 1.2 1 1.1 jtc /*-
2 1.1 jtc * Copyright (c) 1997,98 The NetBSD Foundation, Inc.
3 1.1 jtc * All rights reserved.
4 1.1 jtc *
5 1.1 jtc * This code is derived from software contributed to The NetBSD Foundation
6 1.1 jtc * by J.T. Conklin.
7 1.1 jtc *
8 1.1 jtc * Redistribution and use in source and binary forms, with or without
9 1.1 jtc * modification, are permitted provided that the following conditions
10 1.1 jtc * are met:
11 1.1 jtc * 1. Redistributions of source code must retain the above copyright
12 1.1 jtc * notice, this list of conditions and the following disclaimer.
13 1.1 jtc * 2. Redistributions in binary form must reproduce the above copyright
14 1.1 jtc * notice, this list of conditions and the following disclaimer in the
15 1.1 jtc * documentation and/or other materials provided with the distribution.
16 1.1 jtc * 3. All advertising materials mentioning features or use of this software
17 1.1 jtc * must display the following acknowledgement:
18 1.1 jtc * This product includes software developed by the NetBSD
19 1.1 jtc * Foundation, Inc. and its contributors.
20 1.1 jtc * 4. Neither the name of The NetBSD Foundation nor the names of its
21 1.1 jtc * contributors may be used to endorse or promote products derived
22 1.1 jtc * from this software without specific prior written permission.
23 1.1 jtc *
24 1.1 jtc * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
25 1.1 jtc * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
26 1.1 jtc * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
27 1.1 jtc * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
28 1.1 jtc * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29 1.1 jtc * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30 1.1 jtc * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31 1.1 jtc * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32 1.1 jtc * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 1.1 jtc * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 1.1 jtc * POSSIBILITY OF SUCH DAMAGE.
35 1.1 jtc */
36 1.1 jtc
37 1.1 jtc /*
38 1.1 jtc * Requirements:
39 1.1 jtc *
40 1.1 jtc * 1. The thread safe mechanism should be lightweight so the library can
41 1.1 jtc * be used by non-threaded applications without unreasonable overhead.
42 1.1 jtc *
43 1.1 jtc * 2. There should be no dependency on a thread engine for non-threaded
44 1.1 jtc * applications.
45 1.1 jtc *
46 1.1 jtc * 3. There should be no dependency on any particular thread engine.
47 1.1 jtc *
48 1.1 jtc * 4. The library should be able to be compiled without support for thread
49 1.1 jtc * safety.
50 1.1 jtc *
51 1.1 jtc *
52 1.1 jtc * Rationale:
53 1.1 jtc *
54 1.1 jtc * One approach for thread safety is to provide discrete versions of the
55 1.1 jtc * library: one thread safe, the other not. The disadvantage of this is
56 1.1 jtc * that libc is rather large, and two copies of a library which are 99%+
57 1.1 jtc * identical is not an efficent use of resources.
58 1.1 jtc *
59 1.1 jtc * Another approach is to provide a single thread safe library. However,
60 1.1 jtc * it should not add significant run time or code size overhead to non-
61 1.1 jtc * threaded applications.
62 1.1 jtc *
63 1.1 jtc * Since the NetBSD C library is used in other projects, it should be
64 1.1 jtc * easy to replace the mutual exclusion primitives with ones provided by
65 1.1 jtc * another system. Similarly, it should also be easy to remove all
66 1.1 jtc * support for thread safety completely if the target environment does
67 1.1 jtc * not support threads.
68 1.1 jtc *
69 1.1 jtc *
70 1.1 jtc * Implementation Details:
71 1.1 jtc *
72 1.1 jtc * The mutex primitives used by the library (mutex_t, mutex_lock, etc.)
73 1.1 jtc * are macros which expand to the cooresponding primitives provided by
74 1.1 jtc * the thread engine or to nothing. The latter is used so that code is
75 1.1 jtc * not unreasonably cluttered with #ifdefs when all thread safe support
76 1.1 jtc * is removed.
77 1.1 jtc *
78 1.1 jtc * The mutex macros can be directly mapped to the mutex primitives from
79 1.1 jtc * pthreads, however it should be reasonably easy to wrap another mutex
80 1.1 jtc * implementation so it presents a similar interface.
81 1.1 jtc *
82 1.1 jtc * Stub implementations of the mutex functions are provided with *weak*
83 1.1 jtc * linkage. These functions simply return success. When linked with a
84 1.1 jtc * thread library (i.e. -lpthread), the functions will override the
85 1.1 jtc * stubs.
86 1.1 jtc */
87 1.1 jtc
88 1.1 jtc /* FIXME: Using _REENT during integration testing. It should be changed
89 1.1 jtc to _REENTRANT once pthread engine is available */
90 1.1 jtc
91 1.1 jtc #ifdef _REENT
92 1.1 jtc
93 1.1 jtc #include <pthread.h>
94 1.1 jtc
95 1.1 jtc #define mutex_t pthread_mutex_t
96 1.1 jtc #define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
97 1.1 jtc
98 1.1 jtc #define mutex_lock(m) pthread_mutex_lock(m)
99 1.1 jtc #define mutex_unlock(m) pthread_mutex_unlock(m)
100 1.1 jtc
101 1.2 jtc #define FLOCKFILE(fp) flockfile(fp)
102 1.2 jtc #define FUNLOCKFILE(fp) funlockfile(fp)
103 1.2 jtc
104 1.2 jtc #define
105 1.2 jtc
106 1.1 jtc #else
107 1.1 jtc
108 1.1 jtc #define mutex_lock(m) do { } while(0)
109 1.1 jtc #define mutex_unlock(m) do { } while(0)
110 1.2 jtc
111 1.2 jtc #define FLOCKFILE(fp) do { } while(0)
112 1.2 jtc #define FUNLOCKFILE(fp) do { } while(0)
113 1.1 jtc
114 1.1 jtc #endif
115