|
|
1 | /* solaris */ |
|
|
2 | #define _POSIX_PTHREAD_SEMANTICS 1 |
|
|
3 | |
1 | #if __linux |
4 | #if __linux |
2 | # define _GNU_SOURCE |
5 | # define _GNU_SOURCE |
3 | #endif |
6 | #endif |
4 | |
7 | |
5 | #define _REENTRANT 1 |
8 | #define _REENTRANT 1 |
… | |
… | |
73 | REQ_FSYNC, REQ_FDATASYNC, |
76 | REQ_FSYNC, REQ_FDATASYNC, |
74 | REQ_UNLINK, REQ_RMDIR, REQ_RENAME, |
77 | REQ_UNLINK, REQ_RMDIR, REQ_RENAME, |
75 | REQ_READDIR, |
78 | REQ_READDIR, |
76 | REQ_LINK, REQ_SYMLINK, |
79 | REQ_LINK, REQ_SYMLINK, |
77 | REQ_GROUP, REQ_NOP, |
80 | REQ_GROUP, REQ_NOP, |
78 | REQ_SLEEP, |
81 | REQ_BUSY, |
79 | }; |
82 | }; |
80 | |
83 | |
81 | #define AIO_REQ_KLASS "IO::AIO::REQ" |
84 | #define AIO_REQ_KLASS "IO::AIO::REQ" |
82 | #define AIO_GRP_KLASS "IO::AIO::GRP" |
85 | #define AIO_GRP_KLASS "IO::AIO::GRP" |
83 | |
86 | |
… | |
… | |
361 | PUSHs (*av_fetch (av, i, 0)); |
364 | PUSHs (*av_fetch (av, i, 0)); |
362 | } |
365 | } |
363 | break; |
366 | break; |
364 | |
367 | |
365 | case REQ_NOP: |
368 | case REQ_NOP: |
366 | case REQ_SLEEP: |
369 | case REQ_BUSY: |
367 | break; |
370 | break; |
368 | |
371 | |
369 | default: |
372 | default: |
370 | PUSHs (sv_2mortal (newSViv (req->result))); |
373 | PUSHs (sv_2mortal (newSViv (req->result))); |
371 | break; |
374 | break; |
… | |
… | |
905 | |
908 | |
906 | case REQ_FDATASYNC: req->result = fdatasync (req->fd); break; |
909 | case REQ_FDATASYNC: req->result = fdatasync (req->fd); break; |
907 | case REQ_FSYNC: req->result = fsync (req->fd); break; |
910 | case REQ_FSYNC: req->result = fsync (req->fd); break; |
908 | case REQ_READDIR: req->result = scandir_ (req->dataptr, &req->data2ptr); break; |
911 | case REQ_READDIR: req->result = scandir_ (req->dataptr, &req->data2ptr); break; |
909 | |
912 | |
910 | case REQ_SLEEP: |
913 | case REQ_BUSY: |
911 | { |
914 | { |
912 | struct timeval tv; |
915 | struct timeval tv; |
913 | |
916 | |
914 | tv.tv_sec = req->fd; |
917 | tv.tv_sec = req->fd; |
915 | tv.tv_usec = req->fd2; |
918 | tv.tv_usec = req->fd2; |
… | |
… | |
1262 | |
1265 | |
1263 | REQ_SEND; |
1266 | REQ_SEND; |
1264 | } |
1267 | } |
1265 | |
1268 | |
1266 | void |
1269 | void |
1267 | aio_sleep (delay,callback=&PL_sv_undef) |
1270 | aio_busy (delay,callback=&PL_sv_undef) |
1268 | double delay |
1271 | double delay |
1269 | SV * callback |
1272 | SV * callback |
1270 | PPCODE: |
1273 | PPCODE: |
1271 | { |
1274 | { |
1272 | dREQ; |
1275 | dREQ; |
1273 | |
1276 | |
1274 | req->type = REQ_SLEEP; |
1277 | req->type = REQ_BUSY; |
1275 | req->fd = delay < 0. ? 0 : delay; |
1278 | req->fd = delay < 0. ? 0 : delay; |
1276 | req->fd2 = delay < 0. ? 0 : 1000. * (delay - req->fd); |
1279 | req->fd2 = delay < 0. ? 0 : 1000. * (delay - req->fd); |
1277 | |
1280 | |
1278 | REQ_SEND; |
1281 | REQ_SEND; |
1279 | } |
1282 | } |
… | |
… | |
1304 | REQ_SEND; |
1307 | REQ_SEND; |
1305 | } |
1308 | } |
1306 | |
1309 | |
1307 | void |
1310 | void |
1308 | aioreq_pri (int pri = DEFAULT_PRI) |
1311 | aioreq_pri (int pri = DEFAULT_PRI) |
1309 | CODE: |
1312 | CODE: |
1310 | if (pri < PRI_MIN) pri = PRI_MIN; |
1313 | if (pri < PRI_MIN) pri = PRI_MIN; |
1311 | if (pri > PRI_MAX) pri = PRI_MAX; |
1314 | if (pri > PRI_MAX) pri = PRI_MAX; |
1312 | next_pri = pri + PRI_BIAS; |
1315 | next_pri = pri + PRI_BIAS; |
|
|
1316 | |
|
|
1317 | void |
|
|
1318 | aioreq_nice (int nice = 0) |
|
|
1319 | CODE: |
|
|
1320 | nice = next_pri - nice; |
|
|
1321 | if (nice < PRI_MIN) nice = PRI_MIN; |
|
|
1322 | if (nice > PRI_MAX) nice = PRI_MAX; |
|
|
1323 | next_pri = nice + PRI_BIAS; |
1313 | |
1324 | |
1314 | void |
1325 | void |
1315 | flush () |
1326 | flush () |
1316 | PROTOTYPE: |
1327 | PROTOTYPE: |
1317 | CODE: |
1328 | CODE: |