… | |
… | |
7 | typedef struct eio_req eio_req; |
7 | typedef struct eio_req eio_req; |
8 | |
8 | |
9 | typedef int (*eio_cb)(eio_req *req); |
9 | typedef int (*eio_cb)(eio_req *req); |
10 | |
10 | |
11 | #ifndef EIO_COMMON |
11 | #ifndef EIO_COMMON |
12 | # define EIO_COMMON \ |
12 | # define EIO_COMMON void *data |
13 | eio_cb finish; \ |
|
|
14 | void (*destroy)(eio_req *req);\ |
|
|
15 | void *data |
|
|
16 | #endif |
13 | #endif |
17 | |
14 | |
18 | enum { |
15 | enum { |
19 | EIO_QUIT, |
16 | EIO_QUIT, |
20 | EIO_OPEN, EIO_CLOSE, EIO_DUP2, |
17 | EIO_OPEN, EIO_CLOSE, EIO_DUP2, |
… | |
… | |
56 | int errorno; /* errno value on syscall return */ |
53 | int errorno; /* errno value on syscall return */ |
57 | |
54 | |
58 | unsigned char flags; /* private */ |
55 | unsigned char flags; /* private */ |
59 | unsigned char pri; /* the priority */ |
56 | unsigned char pri; /* the priority */ |
60 | |
57 | |
|
|
58 | eio_cb finish; |
|
|
59 | void (*destroy)(eio_req *req); |
61 | void (*feed)(eio_req *req); |
60 | void (*feed)(eio_req *req); |
62 | |
61 | |
63 | EIO_COMMON; |
62 | EIO_COMMON; |
64 | |
63 | |
65 | eio_req *grp, *grp_prev, *grp_next, *grp_first; /* private */ |
64 | eio_req *grp, *grp_prev, *grp_next, *grp_first; /* private */ |
66 | }; |
65 | }; |
67 | |
66 | |
68 | enum { |
67 | enum { |
69 | EIO_FLAG_CANCELLED = 0x01, /* request was cancelled */ |
68 | EIO_FLAG_CANCELLED = 0x01, /* request was cancelled */ |
70 | EIO_FLAG_PTR2_FREE = 0x02, /* need to free(ptr2) */ |
69 | EIO_FLAG_PTR1_FREE = 0x02, /* need to free(ptr1) */ |
|
|
70 | EIO_FLAG_PTR2_FREE = 0x04 /* need to free(ptr2) */ |
71 | }; |
71 | }; |
72 | |
72 | |
73 | enum { |
73 | enum { |
74 | EIO_PRI_MIN = -4, |
74 | EIO_PRI_MIN = -4, |
75 | EIO_PRI_MAX = 4, |
75 | EIO_PRI_MAX = 4, |
76 | |
76 | |
77 | EIO_DEFAULT_PRI = 0, |
77 | EIO_DEFAULT_PRI = 0, |
78 | EIO_PRI_BIAS = -EIO_PRI_MIN, |
78 | EIO_PRI_BIAS = -EIO_PRI_MIN, |
79 | EIO_NUM_PRI = EIO_PRI_MAX + EIO_PRI_BIAS + 1, |
79 | EIO_NUM_PRI = EIO_PRI_MAX + EIO_PRI_BIAS + 1 |
80 | }; |
80 | }; |
81 | |
81 | |
82 | /* returns < 0 on error, errno set |
82 | /* returns < 0 on error, errno set |
83 | * need_poll, if non-zero, will be called when results are available |
83 | * need_poll, if non-zero, will be called when results are available |
84 | * and eio_poll_cb needs to be invoked (it MUST NOT call eio_poll_cb itself). |
84 | * and eio_poll_cb needs to be invoked (it MUST NOT call eio_poll_cb itself). |
… | |
… | |
110 | /*****************************************************************************/ |
110 | /*****************************************************************************/ |
111 | /* high-level request API */ |
111 | /* high-level request API */ |
112 | |
112 | |
113 | eio_req *eio_fsync (int fd, eio_cb cb); |
113 | eio_req *eio_fsync (int fd, eio_cb cb); |
114 | eio_req *eio_fdatasync (int fd, eio_cb cb); |
114 | eio_req *eio_fdatasync (int fd, eio_cb cb); |
115 | eio_req *eio_dupclose (int fd, eio_cb cb); |
|
|
116 | eio_req *eio_readahead (int fd, off_t offset, size_t length, eio_cb cb); |
115 | eio_req *eio_readahead (int fd, off_t offset, size_t length, eio_cb cb); |
117 | eio_req *eio_read (int fd, off_t offs, size_t length, char *data, eio_cb cb); |
116 | eio_req *eio_read (int fd, off_t offset, size_t length, void *data, eio_cb cb); |
118 | eio_req *eio_write (int fd, off_t offs, size_t length, char *data, eio_cb cb); |
117 | eio_req *eio_write (int fd, off_t offset, size_t length, void *data, eio_cb cb); |
119 | eio_req *eio_fstat (int fd, eio_cb cb); /* stat buffer=ptr2 allocates dynamically */ |
118 | eio_req *eio_fstat (int fd, eio_cb cb); /* stat buffer=ptr2 allocated dynamically */ |
120 | eio_req *eio_futime (int fd, eio_tstamp atime, eio_tstamp mtime, eio_cb cb); |
119 | eio_req *eio_futime (int fd, eio_tstamp atime, eio_tstamp mtime, eio_cb cb); |
121 | eio_req *eio_ftruncate (int fd, off_t offset, eio_cb cb); |
120 | eio_req *eio_ftruncate (int fd, off_t offset, eio_cb cb); |
122 | eio_req *eio_fchmod (int fd, mode_t mode, eio_cb cb); |
121 | eio_req *eio_fchmod (int fd, mode_t mode, eio_cb cb); |
123 | eio_req *eio_fchown (int fd, uid_t uid, gid_t gid, eio_cb cb); |
122 | eio_req *eio_fchown (int fd, uid_t uid, gid_t gid, eio_cb cb); |
124 | eio_req *eio_dup2 (int fd, int fd2, eio_cb cb); |
123 | eio_req *eio_dup2 (int fd, int fd2, eio_cb cb); |
125 | eio_req *eio_sendfile (int out_fd, int in_fd, off_t in_offset, size_t length, eio_cb cb); |
124 | eio_req *eio_sendfile (int out_fd, int in_fd, off_t in_offset, size_t length, eio_cb cb); |
126 | eio_req *eio_open (const char *path, int flags, mode_t mode, eio_cb cb); |
125 | eio_req *eio_open (const char *path, int flags, mode_t mode, eio_cb cb); |
127 | eio_req *eio_readlink (const char *path, eio_cb cb); /* result=ptr2 allocated dynamically */ |
126 | eio_req *eio_readlink (const char *path, eio_cb cb); /* result=ptr2 allocated dynamically */ |
128 | eio_req *eio_stat (const char *path, eio_cb cb); /* stat buffer=ptr2 allocates dynamically */ |
127 | eio_req *eio_stat (const char *path, eio_cb cb); /* stat buffer=ptr2 allocated dynamically */ |
129 | eio_req *eio_lstat (const char *path, eio_cb cb); /* stat buffer=ptr2 allocates dynamically */ |
128 | eio_req *eio_lstat (const char *path, eio_cb cb); /* stat buffer=ptr2 allocated dynamically */ |
130 | eio_req *eio_utime (const char *path, eio_tstamp atime, eio_tstamp mtime, eio_cb cb); |
129 | eio_req *eio_utime (const char *path, eio_tstamp atime, eio_tstamp mtime, eio_cb cb); |
131 | eio_req *eio_truncate (const char *path, off_t offset, eio_cb cb); |
130 | eio_req *eio_truncate (const char *path, off_t offset, eio_cb cb); |
|
|
131 | eio_req *eio_chown (const char *path, uid_t uid, gid_t gid, eio_cb cb); |
132 | eio_req *eio_chmod (const char *path, mode_t mode, eio_cb cb); |
132 | eio_req *eio_chmod (const char *path, mode_t mode, eio_cb cb); |
133 | eio_req *eio_mkdir (const char *path, mode_t mode, eio_cb cb); |
133 | eio_req *eio_mkdir (const char *path, mode_t mode, eio_cb cb); |
134 | eio_req *eio_chown (const char *path, uid_t uid, gid_t gid, eio_cb cb); |
|
|
135 | eio_req *eio_unlink (const char *path, eio_cb cb); |
134 | eio_req *eio_unlink (const char *path, eio_cb cb); |
136 | eio_req *eio_rmdir (const char *path, eio_cb cb); |
135 | eio_req *eio_rmdir (const char *path, eio_cb cb); |
137 | eio_req *eio_readdir (const char *path, eio_cb cb); /* result=ptr2 allocated dynamically */ |
136 | eio_req *eio_readdir (const char *path, eio_cb cb); /* result=ptr2 allocated dynamically */ |
138 | eio_req *eio_mknod (const char *path, mode_t mode, dev_t dev, eio_cb cb); |
137 | eio_req *eio_mknod (const char *path, mode_t mode, dev_t dev, eio_cb cb); |
139 | eio_req *eio_busy (eio_tstamp delay, eio_cb cb); /* ties a thread for this long, simulating busyness */ |
138 | eio_req *eio_busy (eio_tstamp delay, eio_cb cb); /* ties a thread for this long, simulating busyness */ |
… | |
… | |
164 | /* cancel a request as soon fast as possible */ |
163 | /* cancel a request as soon fast as possible */ |
165 | void eio_cancel (eio_req *req); |
164 | void eio_cancel (eio_req *req); |
166 | /* destroy a request that has never been submitted */ |
165 | /* destroy a request that has never been submitted */ |
167 | void eio_destroy (eio_req *req); |
166 | void eio_destroy (eio_req *req); |
168 | |
167 | |
|
|
168 | /*****************************************************************************/ |
|
|
169 | /* convinience functions */ |
|
|
170 | |
|
|
171 | /*ssize_t eio_sendfile (int ofd, int ifd, off_t offset, size_t count)*/ |
|
|
172 | |
169 | #endif |
173 | #endif |
170 | |
174 | |