1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
/*-
* Copyright (c) 1997 John S. Dyson. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. John S. Dyson's name may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* DISCLAIMER: This code isn't warranted to do anything useful. Anything
* bad that happens because of using this software isn't the responsibility
* of the author. This software is distributed AS-IS.
*
* $FreeBSD$
*/
#ifndef _SYS_AIO_H_
#define _SYS_AIO_H_
#include <sys/types.h>
#include <sys/signal.h>
/*
* Returned by aio_cancel:
*/
#define AIO_CANCELED 0x1
#define AIO_NOTCANCELED 0x2
#define AIO_ALLDONE 0x3
/*
* LIO opcodes
*/
#define LIO_NOP 0x0
#define LIO_WRITE 0x1
#define LIO_READ 0x2
#ifdef _KERNEL
#define LIO_SYNC 0x3
#define LIO_MLOCK 0x4
#endif
/*
* LIO modes
*/
#define LIO_NOWAIT 0x0
#define LIO_WAIT 0x1
/*
* Maximum number of allowed LIO operations
*/
#define AIO_LISTIO_MAX 16
/*
* Private members for aiocb -- don't access
* directly.
*/
struct __aiocb_private {
long status;
long error;
void *kernelinfo;
};
/*
* I/O control block
*/
typedef struct aiocb {
int aio_fildes; /* File descriptor */
off_t aio_offset; /* File offset for I/O */
volatile void *aio_buf; /* I/O buffer in process space */
size_t aio_nbytes; /* Number of bytes for I/O */
int __spare__[2];
void *__spare2__;
int aio_lio_opcode; /* LIO opcode */
int aio_reqprio; /* Request priority -- ignored */
struct __aiocb_private _aiocb_private;
struct sigevent aio_sigevent; /* Signal to deliver */
} aiocb_t;
#ifndef _KERNEL
struct timespec;
__BEGIN_DECLS
/*
* Asynchronously read from a file
*/
int aio_read(struct aiocb *);
/*
* Asynchronously write to file
*/
int aio_write(struct aiocb *);
/*
* List I/O Asynchronously/synchronously read/write to/from file
* "lio_mode" specifies whether or not the I/O is synchronous.
* "acb_list" is an array of "nacb_listent" I/O control blocks.
* when all I/Os are complete, the optional signal "sig" is sent.
*/
int lio_listio(int, struct aiocb * const [], int, struct sigevent *);
/*
* Get completion status
* returns EINPROGRESS until I/O is complete.
* this routine does not block.
*/
int aio_error(const struct aiocb *);
/*
* Finish up I/O, releasing I/O resources and returns the value
* that would have been associated with a synchronous I/O request.
* This routine must be called once and only once for each
* I/O control block who has had I/O associated with it.
*/
ssize_t aio_return(struct aiocb *);
/*
* Cancel I/O
*/
int aio_cancel(int, struct aiocb *);
/*
* Suspend until all specified I/O or timeout is complete.
*/
int aio_suspend(const struct aiocb * const[], int, const struct timespec *);
/*
* Asynchronous mlock
*/
int aio_mlock(struct aiocb *);
#ifdef __BSD_VISIBLE
int aio_waitcomplete(struct aiocb **, struct timespec *);
#endif
int aio_fsync(int op, struct aiocb *aiocbp);
__END_DECLS
#else
/* Forward declarations for prototypes below. */
struct socket;
struct sockbuf;
extern void (*aio_swake)(struct socket *, struct sockbuf *);
#endif
#endif
|