Whamcloud - gitweb
Branch b1_4
[fs/lustre-release.git] / libsysio / include / sysio-cmn.h
1 /*
2  *    This Cplant(TM) source code is the property of Sandia National
3  *    Laboratories.
4  *
5  *    This Cplant(TM) source code is copyrighted by Sandia National
6  *    Laboratories.
7  *
8  *    The redistribution of this Cplant(TM) source code is subject to the
9  *    terms of the GNU Lesser General Public License
10  *    (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
11  *
12  *    Cplant(TM) Copyright 1998-2006 Sandia Corporation. 
13  *    Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
14  *    license for use of this work by or on behalf of the US Government.
15  *    Export of this program may require a license from the United States
16  *    Government.
17  */
18
19 /*
20  * This library is free software; you can redistribute it and/or
21  * modify it under the terms of the GNU Lesser General Public
22  * License as published by the Free Software Foundation; either
23  * version 2.1 of the License, or (at your option) any later version.
24  * 
25  * This library is distributed in the hope that it will be useful,
26  * but WITHOUT ANY WARRANTY; without even the implied warranty of
27  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28  * Lesser General Public License for more details.
29  * 
30  * You should have received a copy of the GNU Lesser General Public
31  * License along with this library; if not, write to the Free Software
32  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
33  *
34  * Questions or comments about this library should be sent to:
35  *
36  * Lee Ward
37  * Sandia National Laboratories, New Mexico
38  * P.O. Box 5800
39  * Albuquerque, NM 87185-1110
40  *
41  * lee@sandia.gov
42  */
43
44 /*
45  * System IO common information.
46  */
47
48 #if !defined(__IS_UNUSED) && defined(__GNUC__)
49 #define __IS_UNUSED     __attribute__ ((unused))
50 #else
51 #define __IS_UNUSED
52 #endif
53
54 #ifndef _LARGEFILE64_SOURCE
55 /*
56  * Not glibc I guess. Define this ourselves.
57  */
58 #define _LARGEFILE64_SOURCE             0
59 #endif
60
61 /*
62  * Define internal file-offset type and it's maximum value.
63  */
64 #if _LARGEFILE64_SOURCE
65 #define _SYSIO_OFF_T                    off64_t
66 #ifdef LLONG_MAX
67 #define _SYSIO_OFF_T_MAX                (LLONG_MAX)
68 #else
69 /*
70  * Don't have LLONG_MAX before C99. We'll need to define it ourselves.
71  */
72 #define _SYSIO_OFF_T_MAX                (9223372036854775807LL)
73 #endif
74 #else
75 #define _SYSIO_OFF_T                    off_t
76 #define _SYSIO_OFF_T_MAX                LONG_MAX
77 #endif
78
79 /*
80  * Internally, all file status is carried in the 64-bit capable
81  * structure.
82  */
83 #if _LARGEFILE64_SOURCE
84 #define intnl_xtvec xtvec64
85 #else
86 #define intnl_xtvec xtvec
87 #endif
88 struct intnl_xtvec;
89
90 struct iovec;
91
92 /*
93  * Symbol composition.
94  */
95 #define _PREPEND_HELPER(p, x) \
96         p ## x
97 #define PREPEND(p, x) \
98         _PREPEND_HELPER(p, x)
99
100 /*
101  * SYSIO name label macros
102  */
103 #ifndef SYSIO_INTERFACE_NAME
104 #ifdef SYSIO_LABEL_NAMES
105 #define SYSIO_INTERFACE_NAME(x) \
106         PREPEND(SYSIO_LABEL_NAMES, x)
107 #else
108 #define SYSIO_INTERFACE_NAME(x) x
109 #endif /* SYSIO_LABEL_NAMES */
110 #endif /* !SYSIO_INTERFACE_NAME */
111
112 /* for debugging */
113 #if 0
114 #define ASSERT(cond)                                                    \
115         if (!(cond)) {                                                  \
116                 printf("ASSERTION(" #cond ") failed: " __FILE__ ":"     \
117                         __FUNCTION__ ":%d\n", __LINE__);                \
118                 abort();                                                \
119         }
120
121 #define ERROR(fmt, a...)                                                \
122         do {                                                            \
123                 printf("ERROR(" __FILE__ ":%d):" fmt, __LINE__, ##a);   \
124         while(0)
125
126 #else
127 #define ERROR(fmt)      do{}while(0)
128 #define ASSERT          do{}while(0)
129 #endif
130
131 /*
132  * SYSIO interface frame macros
133  *
134  * + DISPLAY_BLOCK; Allocates storage on the stack for use by the set of
135  *      macros.
136  * + ENTER; Performs entry point work
137  * + RETURN; Returns a value and performs exit point work
138  *
139  * NB: For RETURN, the arguments are the return value and value for errno.
140  * If the value for errno is non-zero then that value, *negated*, is set
141  * into errno.
142  */
143 #define SYSIO_INTERFACE_DISPLAY_BLOCK \
144         int _saved_errno;
145 #define SYSIO_INTERFACE_ENTER \
146         do { \
147                 _saved_errno = errno; \
148                 SYSIO_ENTER; \
149         } while (0)
150 #define SYSIO_INTERFACE_RETURN(rtn, err) \
151         do { \
152                 SYSIO_LEAVE; \
153                 errno = (err) ? -(err) : _saved_errno; \
154                 return (rtn); \
155         } while(0) 
156
157 /* Interface enter/leave hook functions  */
158 #ifdef SYSIO_TRACING
159 extern void *_sysio_entry_trace_q;
160 extern void *_sysio_exit_trace_q;
161
162 extern void *_sysio_register_trace(void *q,
163                                    void (*)(const char *file,
164                                             const char *func,
165                                             int line,
166                                             void *data),
167                                    void *data,
168                                    void (*destructor)(void *data));
169 extern void _sysio_remove_trace(void *q, void *p);
170 extern void _sysio_run_trace_q(void *q,
171                                const char *file,
172                                const char *func,
173                                int line);
174 #define SYSIO_ENTER                                                     \
175         do { \
176                 _sysio_run_trace_q(_sysio_entry_trace_q,                \
177                                    __FILE__, __func__, __LINE__);       \
178         } while (0)
179
180
181 #define SYSIO_LEAVE                                                     \
182         do { \
183                 _sysio_run_trace_q(_sysio_exit_trace_q,                 \
184                                    __FILE__, __func__, __LINE__);       \
185         } while (0)
186 #else
187 #define SYSIO_ENTER                                                     \
188         do { } while (0)
189 #define SYSIO_LEAVE                                                     \
190         do { } while (0)
191 #endif
192
193 /* Accounting for IO stats; Read and write character count. */
194 #if defined(REDSTORM)
195 #define _SYSIO_UPDACCT(w, cc) \
196         do { \
197                 if ((cc) < 0) \
198                         break; \
199                 if (w) \
200                         _add_iostats(0, (size_t )(cc)); \
201                 else \
202                         _add_iostats((size_t )(cc), 0); \
203         } while(0)
204 #else
205 #define _SYSIO_UPDACCT(w, cc)
206 #endif
207
208 extern ssize_t _sysio_validx(const struct intnl_xtvec *xtv, size_t xtvlen,
209                              const struct iovec *iov, size_t iovlen,
210                              _SYSIO_OFF_T limit);
211 extern ssize_t _sysio_enumerate_extents(const struct intnl_xtvec *xtv,
212                                         size_t xtvlen,
213                                         const struct iovec *iov,
214                                         size_t iovlen,
215                                         ssize_t (*f)(const struct iovec *,
216                                                      int,
217                                                      _SYSIO_OFF_T,
218                                                      ssize_t,
219                                                      void *),
220                                         void *arg);
221 extern ssize_t _sysio_enumerate_iovec(const struct iovec *iov,
222                                       size_t count,
223                                       _SYSIO_OFF_T off,
224                                       ssize_t limit,
225                                       ssize_t (*f)(void *,
226                                                    size_t,
227                                                    _SYSIO_OFF_T,
228                                                    void *),
229                                       void *arg);
230 extern ssize_t _sysio_doio(const struct intnl_xtvec *xtv, size_t xtvlen,
231                            const struct iovec *iov, size_t iovlen,
232                            ssize_t (*f)(void *, size_t, _SYSIO_OFF_T, void *),
233                            void *arg);