… | |
… | |
101 | #include "libeio/eio.c" |
101 | #include "libeio/eio.c" |
102 | |
102 | |
103 | typedef eio_req *aio_req; |
103 | typedef eio_req *aio_req; |
104 | typedef eio_req *aio_req_ornot; |
104 | typedef eio_req *aio_req_ornot; |
105 | |
105 | |
106 | static int max_outstanding = 0; |
106 | static SV *on_next_submit; |
107 | |
|
|
108 | static int next_pri = EIO_DEFAULT_PRI + EIO_PRI_BIAS; |
107 | static int next_pri = EIO_DEFAULT_PRI + EIO_PRI_BIAS; |
|
|
108 | static int max_outstanding; |
109 | |
109 | |
110 | static int respipe_osf [2], respipe [2] = { -1, -1 }; |
110 | static int respipe_osf [2], respipe [2] = { -1, -1 }; |
111 | |
111 | |
112 | static void req_destroy (aio_req req); |
112 | static void req_destroy (aio_req req); |
113 | static void req_cancel (aio_req req); |
113 | static void req_cancel (aio_req req); |
… | |
… | |
163 | PUTBACK; |
163 | PUTBACK; |
164 | call_sv (grp->sv2, G_VOID | G_EVAL | G_KEEPERR); |
164 | call_sv (grp->sv2, G_VOID | G_EVAL | G_KEEPERR); |
165 | SPAGAIN; |
165 | SPAGAIN; |
166 | FREETMPS; |
166 | FREETMPS; |
167 | LEAVE; |
167 | LEAVE; |
|
|
168 | } |
|
|
169 | } |
|
|
170 | |
|
|
171 | static void req_submit (eio_req *req) |
|
|
172 | { |
|
|
173 | eio_submit (req); |
|
|
174 | |
|
|
175 | if (on_next_submit) |
|
|
176 | { |
|
|
177 | dSP; |
|
|
178 | SV *cb = sv_2mortal (on_next_submit); |
|
|
179 | |
|
|
180 | on_next_submit = 0; |
|
|
181 | |
|
|
182 | PUSHMARK (SP); |
|
|
183 | PUTBACK; |
|
|
184 | call_sv (cb, G_DISCARD | G_EVAL); |
168 | } |
185 | } |
169 | } |
186 | } |
170 | |
187 | |
171 | static int req_invoke (eio_req *req) |
188 | static int req_invoke (eio_req *req) |
172 | { |
189 | { |
… | |
… | |
440 | \ |
457 | \ |
441 | req->callback = newSVsv (callback); \ |
458 | req->callback = newSVsv (callback); \ |
442 | req->pri = req_pri |
459 | req->pri = req_pri |
443 | |
460 | |
444 | #define REQ_SEND \ |
461 | #define REQ_SEND \ |
445 | eio_submit (req); \ |
462 | req_submit (req); \ |
446 | \ |
463 | \ |
447 | if (GIMME_V != G_VOID) \ |
464 | if (GIMME_V != G_VOID) \ |
448 | XPUSHs (req_sv (req, AIO_REQ_KLASS)); |
465 | XPUSHs (req_sv (req, AIO_REQ_KLASS)); |
449 | |
466 | |
450 | MODULE = IO::AIO PACKAGE = IO::AIO |
467 | MODULE = IO::AIO PACKAGE = IO::AIO |
… | |
… | |
1003 | RETVAL = started; |
1020 | RETVAL = started; |
1004 | if (WORDACCESS_UNSAFE) X_UNLOCK (wrklock); |
1021 | if (WORDACCESS_UNSAFE) X_UNLOCK (wrklock); |
1005 | OUTPUT: |
1022 | OUTPUT: |
1006 | RETVAL |
1023 | RETVAL |
1007 | |
1024 | |
|
|
1025 | void _on_next_submit (SV *cb) |
|
|
1026 | CODE: |
|
|
1027 | SvREFCNT_dec (on_next_submit); |
|
|
1028 | on_next_submit = SvOK (cb) ? newSVsv (cb) : 0; |
|
|
1029 | |
1008 | PROTOTYPES: DISABLE |
1030 | PROTOTYPES: DISABLE |
1009 | |
1031 | |
1010 | MODULE = IO::AIO PACKAGE = IO::AIO::REQ |
1032 | MODULE = IO::AIO PACKAGE = IO::AIO::REQ |
1011 | |
1033 | |
1012 | void |
1034 | void |