Skip to content
This repository was archived by the owner on Oct 12, 2022. It is now read-only.

Commit 0bf7ddd

Browse files
authored
Merge pull request #2231 from ibuclaw/fixaio
core.sys.posix.aio: Update CRuntime_Glibc bindings to be LARGEFILE64 aware merged-on-behalf-of: Petar Kirov <ZombineDev@users.noreply.github.com>
2 parents e5800b6 + 53df410 commit 0bf7ddd

File tree

1 file changed

+105
-21
lines changed

1 file changed

+105
-21
lines changed

src/core/sys/posix/aio.d

Lines changed: 105 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
module core.sys.posix.aio;
1010

1111
private import core.sys.posix.signal;
12+
private import core.sys.posix.sys.types;
1213

1314
version (Posix):
1415

@@ -19,9 +20,30 @@ nothrow:
1920

2021
version (CRuntime_Glibc)
2122
{
22-
version (X86_64)
23+
import core.sys.posix.config;
24+
25+
struct aiocb
26+
{
27+
int aio_fildes;
28+
int aio_lio_opcode;
29+
int aio_reqprio;
30+
void* aio_buf; //volatile
31+
size_t aio_nbytes;
32+
sigevent aio_sigevent;
33+
34+
aiocb* __next_prio;
35+
int __abs_prio;
36+
int __policy;
37+
int __error_code;
38+
ssize_t __return_value;
39+
40+
off_t aio_offset;
41+
ubyte[32] __glibc_reserved;
42+
}
43+
44+
static if (__USE_LARGEFILE64)
2345
{
24-
struct aiocb
46+
struct aiocb64
2547
{
2648
int aio_fildes;
2749
int aio_lio_opcode;
@@ -30,12 +52,16 @@ version (CRuntime_Glibc)
3052
size_t aio_nbytes;
3153
sigevent aio_sigevent;
3254

33-
ubyte[24] internal_members_padding;
55+
aiocb* __next_prio;
56+
int __abs_prio;
57+
int __policy;
58+
int __error_code;
59+
ssize_t __return_value;
60+
3461
off_t aio_offset;
3562
ubyte[32] __glibc_reserved;
3663
}
37-
} else
38-
static assert(false, "Unsupported CPU Type");
64+
}
3965
}
4066
else version (FreeBSD)
4167
{
@@ -60,7 +86,7 @@ else version (FreeBSD)
6086
sigevent aio_sigevent;
6187
}
6288

63-
version = bsd_posix;
89+
version = BSD_Posix;
6490
}
6591
else version (NetBSD)
6692
{
@@ -78,7 +104,7 @@ else version (NetBSD)
78104
private ssize_t _retval;
79105
}
80106

81-
version = bsd_posix;
107+
version = BSD_Posix;
82108
}
83109
else version (DragonFlyBSD)
84110
{
@@ -95,7 +121,7 @@ else version (DragonFlyBSD)
95121
private int _aio_err;
96122
}
97123

98-
version = bsd_posix;
124+
version = BSD_Posix;
99125
}
100126
else
101127
static assert(false, "Unsupported platform");
@@ -118,7 +144,7 @@ version (CRuntime_Glibc)
118144
LIO_NOP
119145
}
120146
}
121-
else version (bsd_posix)
147+
else version (BSD_Posix)
122148
{
123149
enum
124150
{
@@ -137,7 +163,7 @@ version (CRuntime_Glibc)
137163
LIO_NOWAIT
138164
}
139165
}
140-
else version (bsd_posix)
166+
else version (BSD_Posix)
141167
{
142168
enum
143169
{
@@ -146,17 +172,75 @@ else version (bsd_posix)
146172
}
147173
}
148174

149-
int aio_read(aiocb* aiocbp);
150-
int aio_write(aiocb* aiocbp);
151-
int aio_fsync(int op, aiocb* aiocbp);
152-
int aio_error(const(aiocb)* aiocbp);
153-
ssize_t aio_return(aiocb* aiocbp);
154-
int aio_suspend(const(aiocb*)* aiocb_list, int nitems, const(timespec)* timeout);
155-
int aio_cancel(int fd, aiocb* aiocbp);
156-
int lio_listio(int mode, const(aiocb*)* aiocb_list, int nitems, sigevent* sevp);
157-
158-
/* functions outside/extending posix requirement */
159-
version (FreeBSD)
175+
/* Functions implementing POSIX AIO. */
176+
version (CRuntime_Glibc)
177+
{
178+
static if (__USE_LARGEFILE64)
179+
{
180+
int aio_read64(aiocb64* aiocbp);
181+
int aio_write64(aiocb64* aiocbp);
182+
int aio_fsync64(int op, aiocb64* aiocbp);
183+
int aio_error64(const(aiocb64)* aiocbp);
184+
ssize_t aio_return64(aiocb64* aiocbp);
185+
int aio_suspend64(const(aiocb64*)* aiocb_list, int nitems, const(timespec)* timeout);
186+
int aio_cancel64(int fd, aiocb64* aiocbp);
187+
int lio_listio64(int mode, const(aiocb64*)* aiocb_list, int nitems, sigevent* sevp);
188+
189+
alias aio_read = aio_read64;
190+
alias aio_write = aio_write64;
191+
alias aio_fsync = aio_fsync64;
192+
alias aio_error = aio_error64;
193+
alias aio_return = aio_return64;
194+
alias aio_suspend = aio_suspend64;
195+
alias aio_cancel = aio_cancel64;
196+
alias lio_listio = lio_listio64;
197+
}
198+
else
199+
{
200+
int aio_read(aiocb* aiocbp);
201+
int aio_write(aiocb* aiocbp);
202+
int aio_fsync(int op, aiocb* aiocbp);
203+
int aio_error(const(aiocb)* aiocbp);
204+
ssize_t aio_return(aiocb* aiocbp);
205+
int aio_suspend(const(aiocb*)* aiocb_list, int nitems, const(timespec)* timeout);
206+
int aio_cancel(int fd, aiocb* aiocbp);
207+
int lio_listio(int mode, const(aiocb*)* aiocb_list, int nitems, sigevent* sevp);
208+
}
209+
}
210+
else
211+
{
212+
int aio_read(aiocb* aiocbp);
213+
int aio_write(aiocb* aiocbp);
214+
int aio_fsync(int op, aiocb* aiocbp);
215+
int aio_error(const(aiocb)* aiocbp);
216+
ssize_t aio_return(aiocb* aiocbp);
217+
int aio_suspend(const(aiocb*)* aiocb_list, int nitems, const(timespec)* timeout);
218+
int aio_cancel(int fd, aiocb* aiocbp);
219+
int lio_listio(int mode, const(aiocb*)* aiocb_list, int nitems, sigevent* sevp);
220+
}
221+
222+
/* Functions outside/extending POSIX requirement. */
223+
version (CRuntime_Glibc)
224+
{
225+
static if (__USE_GNU)
226+
{
227+
/* To customize the implementation one can use the following struct. */
228+
struct aioinit
229+
{
230+
int aio_threads;
231+
int aio_num;
232+
int aio_locks;
233+
int aio_usedba;
234+
int aio_debug;
235+
int aio_numusers;
236+
int aio_idle_time;
237+
int aio_reserved;
238+
}
239+
240+
void aio_init(const(aioinit)* init);
241+
}
242+
}
243+
else version (FreeBSD)
160244
{
161245
int aio_waitcomplete(aiocb** aiocb_list, const(timespec)* timeout);
162246
int aio_mlock(aiocb* aiocbp);

0 commit comments

Comments
 (0)