… | |
… | |
5 | #include <sys/types.h> |
5 | #include <sys/types.h> |
6 | #include <unistd.h> |
6 | #include <unistd.h> |
7 | #include <fcntl.h> |
7 | #include <fcntl.h> |
8 | #include <sched.h> |
8 | #include <sched.h> |
9 | |
9 | |
10 | #define STACKSIZE 1024 /* yeah */ |
10 | #define STACKSIZE 2048 /* yeah */ |
11 | |
11 | |
12 | #define REQ_QUIT 0 |
12 | #define REQ_QUIT 0 |
13 | #define REQ_READ 1 |
13 | #define REQ_READ 1 |
14 | #define REQ_WRITE 2 |
14 | #define REQ_WRITE 2 |
15 | |
15 | |
… | |
… | |
103 | req->type = dowrite ? REQ_WRITE : REQ_READ; |
103 | req->type = dowrite ? REQ_WRITE : REQ_READ; |
104 | req->fd = fd; |
104 | req->fd = fd; |
105 | req->offset = offset; |
105 | req->offset = offset; |
106 | req->length = length; |
106 | req->length = length; |
107 | req->data = SvREFCNT_inc (data); |
107 | req->data = SvREFCNT_inc (data); |
108 | req->dataptr = svptr + dataoffset; |
108 | req->dataptr = (char *)svptr + dataoffset; |
109 | req->callback = SvREFCNT_inc (callback); |
109 | req->callback = SvREFCNT_inc (callback); |
110 | |
110 | |
111 | nreqs++; |
111 | nreqs++; |
112 | write (reqpipe[1], &req, sizeof (aio_req)); |
112 | write (reqpipe[1], &req, sizeof (aio_req)); |
113 | } |
113 | } |
… | |
… | |
130 | { |
130 | { |
131 | int errorno = errno; |
131 | int errorno = errno; |
132 | errno = req->errorno; |
132 | errno = req->errorno; |
133 | |
133 | |
134 | if (req->type == REQ_READ) |
134 | if (req->type == REQ_READ) |
135 | SvCUR_set (req->data, req->result > 0 |
135 | SvCUR_set (req->data, req->dataoffset |
136 | ? req->dataoffset + req->result |
136 | + req->result > 0 ? req->result : 0); |
137 | : req->dataoffset); |
|
|
138 | |
137 | |
139 | PUSHMARK (SP); |
138 | PUSHMARK (SP); |
140 | XPUSHs (sv_2mortal (newSViv (req->result))); |
139 | XPUSHs (sv_2mortal (newSViv (req->result))); |
141 | PUTBACK; |
140 | PUTBACK; |
142 | call_sv (req->callback, G_VOID); |
141 | call_sv (req->callback, G_VOID); |
… | |
… | |
248 | } |
247 | } |
249 | |
248 | |
250 | void |
249 | void |
251 | aio_read(fh,offset,length,data,dataoffset,callback) |
250 | aio_read(fh,offset,length,data,dataoffset,callback) |
252 | PerlIO * fh |
251 | PerlIO * fh |
253 | unsigned long offset |
252 | UV offset |
254 | long length |
253 | STRLEN length |
255 | SV * data |
254 | SV * data |
256 | STRLEN dataoffset |
255 | STRLEN dataoffset |
257 | SV * callback |
256 | SV * callback |
258 | PROTOTYPE: $$$$$$ |
257 | PROTOTYPE: $$$$$$ |
259 | ALIAS: |
258 | ALIAS: |
260 | aio_write = 1 |
259 | aio_write = 1 |
261 | CODE: |
260 | CODE: |
262 | sv_upgrade (data, SVt_PV); |
261 | SvUPGRADE (data, SVt_PV); |
|
|
262 | SvPOK_on (data); |
263 | read_write (aTHX_ ix, PerlIO_fileno (fh), offset, length, data, dataoffset, callback); |
263 | read_write (aTHX_ ix, PerlIO_fileno (fh), offset, length, data, dataoffset, callback); |
264 | |
264 | |
265 | int |
265 | int |
266 | poll_fileno() |
266 | poll_fileno() |
267 | PROTOTYPE: |
267 | PROTOTYPE: |
… | |
… | |
269 | RETVAL = respipe[0]; |
269 | RETVAL = respipe[0]; |
270 | OUTPUT: |
270 | OUTPUT: |
271 | RETVAL |
271 | RETVAL |
272 | |
272 | |
273 | int |
273 | int |
274 | poll_cb() |
274 | poll_cb(...) |
275 | PROTOTYPE: |
275 | PROTOTYPE: |
276 | CODE: |
276 | CODE: |
277 | RETVAL = poll_cb (aTHX); |
277 | RETVAL = poll_cb (aTHX); |
278 | OUTPUT: |
278 | OUTPUT: |
279 | RETVAL |
279 | RETVAL |