The data contained in this repository can be downloaded to your computer using one of several clients.
Please see the documentation of your version control software client for more information.

Please select the desired protocol below to get the URL.

This URL has Read-Only access.

Statistics
| Branch: | Revision:

main_repo / deps / libeio / eio.h @ c5183738

History | View | Annotate | Download (10.8 KB)

1
/*
2
 * libeio API header
3
 *
4
 * Copyright (c) 2007,2008 Marc Alexander Lehmann <libeio@schmorp.de>
5
 * All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without modifica-
8
 * tion, are permitted provided that the following conditions are met:
9
 * 
10
 *   1.  Redistributions of source code must retain the above copyright notice,
11
 *       this list of conditions and the following disclaimer.
12
 * 
13
 *   2.  Redistributions in binary form must reproduce the above copyright
14
 *       notice, this list of conditions and the following disclaimer in the
15
 *       documentation and/or other materials provided with the distribution.
16
 * 
17
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
18
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-
19
 * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
20
 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
21
 * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-
25
 * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
26
 * OF THE POSSIBILITY OF SUCH DAMAGE.
27
 *
28
 * Alternatively, the contents of this file may be used under the terms of
29
 * the GNU General Public License ("GPL") version 2 or any later version,
30
 * in which case the provisions of the GPL are applicable instead of
31
 * the above. If you wish to allow the use of your version of this file
32
 * only under the terms of the GPL and not to allow others to use your
33
 * version of this file under the BSD license, indicate your decision
34
 * by deleting the provisions above and replace them with the notice
35
 * and other provisions required by the GPL. If you do not delete the
36
 * provisions above, a recipient may use your version of this file under
37
 * either the BSD or the GPL.
38
 */
39

    
40
#ifndef EIO_H_
41
#define EIO_H_
42

    
43
#ifdef __cplusplus
44
extern "C" {
45
#endif
46

    
47
#include <stddef.h>
48
#include <sys/types.h>
49

    
50
typedef struct eio_req eio_req;
51

    
52
typedef int (*eio_cb)(eio_req *req);
53

    
54
#ifndef EIO_REQ_MEMBERS
55
# define EIO_REQ_MEMBERS
56
#endif
57

    
58
#ifndef EIO_STRUCT_STAT
59
# define EIO_STRUCT_STAT struct stat
60
#endif
61

    
62
enum {
63
  EIO_CUSTOM,
64
  EIO_OPEN, EIO_CLOSE, EIO_DUP2,
65
  EIO_READ, EIO_WRITE,
66
  EIO_READAHEAD, EIO_SENDFILE,
67
  EIO_STAT, EIO_LSTAT, EIO_FSTAT,
68
  EIO_TRUNCATE, EIO_FTRUNCATE,
69
  EIO_UTIME, EIO_FUTIME,
70
  EIO_CHMOD, EIO_FCHMOD,
71
  EIO_CHOWN, EIO_FCHOWN,
72
  EIO_SYNC, EIO_FSYNC, EIO_FDATASYNC,
73
  EIO_MSYNC, EIO_MTOUCH, EIO_SYNC_FILE_RANGE,
74
  EIO_UNLINK, EIO_RMDIR, EIO_MKDIR, EIO_RENAME,
75
  EIO_MKNOD, EIO_READDIR,
76
  EIO_LINK, EIO_SYMLINK, EIO_READLINK,
77
  EIO_GROUP, EIO_NOP,
78
  EIO_BUSY
79
};
80

    
81
/* eio_sync_file_range flags */
82

    
83
enum {
84
  EIO_SYNC_FILE_RANGE_WAIT_BEFORE = 1,
85
  EIO_SYNC_FILE_RANGE_WRITE       = 2,
86
  EIO_SYNC_FILE_RANGE_WAIT_AFTER  = 4
87
};
88

    
89
typedef double eio_tstamp; /* feel free to use double in your code directly */
90

    
91
/* eio request structure */
92
/* this structure is mostly read-only */
93
struct eio_req
94
{
95
  eio_req volatile *next; /* private ETP */
96

    
97
  ssize_t result;  /* result of syscall, e.g. result = read (... */
98
  off_t offs;      /* read, write, truncate, readahead, sync_file_range: file offset */
99
  size_t size;     /* read, write, readahead, sendfile, msync, sync_file_range: length */
100
  void *ptr1;      /* all applicable requests: pathname, old name */
101
  void *ptr2;      /* all applicable requests: new name or memory buffer */
102
  eio_tstamp nv1;  /* utime, futime: atime; busy: sleep time */
103
  eio_tstamp nv2;  /* utime, futime: mtime */
104

    
105
  int type;        /* EIO_xxx constant ETP */
106
  int int1;        /* all applicable requests: file descriptor; sendfile: output fd; open, msync: flags */
107
  long int2;       /* chown, fchown: uid; sendfile: input fd; open, chmod, mkdir, mknod: file mode, sync_file_range: flags */
108
  long int3;       /* chown, fchown: gid; mknod: dev_t */
109
  int errorno;     /* errno value on syscall return */
110

    
111
  unsigned char flags; /* private */
112
  signed char pri;     /* the priority */
113

    
114
  void *data;
115
  eio_cb finish;
116
  void (*destroy)(eio_req *req); /* called when requets no longer needed */
117
  void (*feed)(eio_req *req);    /* only used for group requests */
118

    
119
  EIO_REQ_MEMBERS
120

    
121
  eio_req *grp, *grp_prev, *grp_next, *grp_first; /* private */
122
};
123

    
124
/* _private_ flags */
125
enum {
126
  EIO_FLAG_CANCELLED = 0x01, /* request was cancelled */
127
  EIO_FLAG_PTR1_FREE = 0x02, /* need to free(ptr1) */
128
  EIO_FLAG_PTR2_FREE = 0x04, /* need to free(ptr2) */
129
  EIO_FLAG_GROUPADD  = 0x08  /* some request was added to the group */
130
};
131

    
132
enum {
133
  EIO_PRI_MIN     = -4,
134
  EIO_PRI_MAX     =  4,
135
  EIO_PRI_DEFAULT =  0,
136
};
137

    
138
/* returns < 0 on error, errno set
139
 * need_poll, if non-zero, will be called when results are available
140
 * and eio_poll_cb needs to be invoked (it MUST NOT call eio_poll_cb itself).
141
 * done_poll is called when the need to poll is gone.
142
 */
143
int eio_init (void (*want_poll)(void), void (*done_poll)(void));
144

    
145
/* must be called regularly to handle pending requests */
146
/* returns 0 if all requests were handled, -1 if not, or the value of EIO_FINISH if != 0 */
147
int eio_poll (void);
148

    
149
/* stop polling if poll took longer than duration seconds */
150
void eio_set_max_poll_time (eio_tstamp nseconds);
151
/* do not handle more then count requests in one call to eio_poll_cb */
152
void eio_set_max_poll_reqs (unsigned int nreqs);
153

    
154
/* set minimum required number
155
 * maximum wanted number
156
 * or maximum idle number of threads */
157
void eio_set_min_parallel (unsigned int nthreads);
158
void eio_set_max_parallel (unsigned int nthreads);
159
void eio_set_max_idle     (unsigned int nthreads);
160

    
161
unsigned int eio_nreqs    (void); /* number of requests in-flight */
162
unsigned int eio_nready   (void); /* number of not-yet handled requests */
163
unsigned int eio_npending (void); /* numbe rof finished but unhandled requests */
164
unsigned int eio_nthreads (void); /* number of worker threads in use currently */
165

    
166
/*****************************************************************************/
167
/* convinience wrappers */
168

    
169
#ifndef EIO_NO_WRAPPERS
170
eio_req *eio_nop       (int pri, eio_cb cb, void *data); /* does nothing except go through the whole process */
171
eio_req *eio_busy      (eio_tstamp delay, int pri, eio_cb cb, void *data); /* ties a thread for this long, simulating busyness */
172
eio_req *eio_sync      (int pri, eio_cb cb, void *data);
173
eio_req *eio_fsync     (int fd, int pri, eio_cb cb, void *data);
174
eio_req *eio_fdatasync (int fd, int pri, eio_cb cb, void *data);
175
eio_req *eio_msync     (void *addr, size_t length, int flags, int pri, eio_cb cb, void *data);
176
eio_req *eio_mtouch    (void *addr, size_t length, int flags, int pri, eio_cb cb, void *data);
177
eio_req *eio_sync_file_range (int fd, off_t offset, size_t nbytes, unsigned int flags, int pri, eio_cb cb, void *data);
178
eio_req *eio_close     (int fd, int pri, eio_cb cb, void *data);
179
eio_req *eio_readahead (int fd, off_t offset, size_t length, int pri, eio_cb cb, void *data);
180
eio_req *eio_read      (int fd, void *buf, size_t length, off_t offset, int pri, eio_cb cb, void *data);
181
eio_req *eio_write     (int fd, void *buf, size_t length, off_t offset, int pri, eio_cb cb, void *data);
182
eio_req *eio_fstat     (int fd, int pri, eio_cb cb, void *data); /* stat buffer=ptr2 allocated dynamically */
183
eio_req *eio_futime    (int fd, eio_tstamp atime, eio_tstamp mtime, int pri, eio_cb cb, void *data);
184
eio_req *eio_ftruncate (int fd, off_t offset, int pri, eio_cb cb, void *data);
185
eio_req *eio_fchmod    (int fd, mode_t mode, int pri, eio_cb cb, void *data);
186
eio_req *eio_fchown    (int fd, uid_t uid, gid_t gid, int pri, eio_cb cb, void *data);
187
eio_req *eio_dup2      (int fd, int fd2, int pri, eio_cb cb, void *data);
188
eio_req *eio_sendfile  (int out_fd, int in_fd, off_t in_offset, size_t length, int pri, eio_cb cb, void *data);
189
eio_req *eio_open      (const char *path, int flags, mode_t mode, int pri, eio_cb cb, void *data);
190
eio_req *eio_utime     (const char *path, eio_tstamp atime, eio_tstamp mtime, int pri, eio_cb cb, void *data);
191
eio_req *eio_truncate  (const char *path, off_t offset, int pri, eio_cb cb, void *data);
192
eio_req *eio_chown     (const char *path, uid_t uid, gid_t gid, int pri, eio_cb cb, void *data);
193
eio_req *eio_chmod     (const char *path, mode_t mode, int pri, eio_cb cb, void *data);
194
eio_req *eio_mkdir     (const char *path, mode_t mode, int pri, eio_cb cb, void *data);
195
eio_req *eio_readdir   (const char *path, int pri, eio_cb cb, void *data); /* result=ptr2 allocated dynamically */
196
eio_req *eio_rmdir     (const char *path, int pri, eio_cb cb, void *data);
197
eio_req *eio_unlink    (const char *path, int pri, eio_cb cb, void *data);
198
eio_req *eio_readlink  (const char *path, int pri, eio_cb cb, void *data); /* result=ptr2 allocated dynamically */
199
eio_req *eio_stat      (const char *path, int pri, eio_cb cb, void *data); /* stat buffer=ptr2 allocated dynamically */
200
eio_req *eio_lstat     (const char *path, int pri, eio_cb cb, void *data); /* stat buffer=ptr2 allocated dynamically */
201
eio_req *eio_mknod     (const char *path, mode_t mode, dev_t dev, int pri, eio_cb cb, void *data);
202
eio_req *eio_link      (const char *path, const char *new_path, int pri, eio_cb cb, void *data);
203
eio_req *eio_symlink   (const char *path, const char *new_path, int pri, eio_cb cb, void *data);
204
eio_req *eio_rename    (const char *path, const char *new_path, int pri, eio_cb cb, void *data);
205
eio_req *eio_custom    (eio_cb execute, int pri, eio_cb cb, void *data);
206
#endif
207

    
208
/*****************************************************************************/
209
/* groups */
210

    
211
eio_req *eio_grp       (eio_cb cb, void *data);
212
void eio_grp_feed      (eio_req *grp, void (*feed)(eio_req *req), int limit);
213
void eio_grp_limit     (eio_req *grp, int limit);
214
void eio_grp_add       (eio_req *grp, eio_req *req);
215
void eio_grp_cancel    (eio_req *grp); /* cancels all sub requests but not the group */
216

    
217
/*****************************************************************************/
218
/* request api */
219

    
220
/* true if the request was cancelled, useful in the invoke callback */
221
#define EIO_CANCELLED(req) ((req)->flags & EIO_FLAG_CANCELLED)
222

    
223
#define EIO_RESULT(req)    ((req)->result)
224
/* returns a pointer to the result buffer allocated by eio */
225
#define EIO_BUF(req)       ((req)->ptr2)
226
#define EIO_STAT_BUF(req)  ((EIO_STRUCT_STAT *)EIO_BUF(req))
227
#define EIO_PATH(req)      ((char *)(req)->ptr1)
228

    
229
/* submit a request for execution */
230
void eio_submit (eio_req *req);
231
/* cancel a request as soon fast as possible, if possible */
232
void eio_cancel (eio_req *req);
233
/* destroy a request that has never been submitted */
234
void eio_destroy (eio_req *req);
235

    
236
/*****************************************************************************/
237
/* convinience functions */
238

    
239
ssize_t eio_sendfile_sync (int ofd, int ifd, off_t offset, size_t count);
240

    
241
#ifdef __cplusplus
242
}
243
#endif
244

    
245
#endif
246