… | |
… | |
1178 | res = -1; |
1178 | res = -1; |
1179 | |
1179 | |
1180 | req->result = res; |
1180 | req->result = res; |
1181 | } |
1181 | } |
1182 | |
1182 | |
|
|
1183 | static int |
|
|
1184 | aio_close (int fd) |
|
|
1185 | { |
|
|
1186 | static int close_pipe = -1; /* dummy fd to close fds via dup2 */ |
|
|
1187 | |
|
|
1188 | X_LOCK (wrklock); |
|
|
1189 | |
|
|
1190 | if (close_pipe < 0) |
|
|
1191 | { |
|
|
1192 | int pipefd [2]; |
|
|
1193 | |
|
|
1194 | if (pipe (pipefd) < 0 |
|
|
1195 | || close (pipefd [1]) < 0 |
|
|
1196 | || fcntl (pipefd [0], F_SETFD, FD_CLOEXEC) < 0) |
|
|
1197 | { |
|
|
1198 | X_UNLOCK (wrklock); |
|
|
1199 | return -1; |
|
|
1200 | } |
|
|
1201 | |
|
|
1202 | close_pipe = pipefd [0]; |
|
|
1203 | } |
|
|
1204 | |
|
|
1205 | X_UNLOCK (wrklock); |
|
|
1206 | |
|
|
1207 | return dup2 (close_pipe, fd) < 0 ? -1 : 0; |
|
|
1208 | } |
|
|
1209 | |
1183 | /*****************************************************************************/ |
1210 | /*****************************************************************************/ |
1184 | |
1211 | |
1185 | X_THREAD_PROC (aio_proc) |
1212 | X_THREAD_PROC (aio_proc) |
1186 | { |
1213 | { |
1187 | aio_req req; |
1214 | aio_req req; |
… | |
… | |
1256 | case REQ_FCHMOD: req->result = fchmod (req->int1, req->mode); break; |
1283 | case REQ_FCHMOD: req->result = fchmod (req->int1, req->mode); break; |
1257 | case REQ_TRUNCATE: req->result = truncate (req->ptr1, req->offs); break; |
1284 | case REQ_TRUNCATE: req->result = truncate (req->ptr1, req->offs); break; |
1258 | case REQ_FTRUNCATE: req->result = ftruncate (req->int1, req->offs); break; |
1285 | case REQ_FTRUNCATE: req->result = ftruncate (req->int1, req->offs); break; |
1259 | |
1286 | |
1260 | case REQ_OPEN: req->result = open (req->ptr1, req->int1, req->mode); break; |
1287 | case REQ_OPEN: req->result = open (req->ptr1, req->int1, req->mode); break; |
1261 | case REQ_CLOSE: req->result = close (req->int1); break; |
1288 | case REQ_CLOSE: req->result = aio_close (req->int1); break; |
1262 | case REQ_UNLINK: req->result = unlink (req->ptr1); break; |
1289 | case REQ_UNLINK: req->result = unlink (req->ptr1); break; |
1263 | case REQ_RMDIR: req->result = rmdir (req->ptr1); break; |
1290 | case REQ_RMDIR: req->result = rmdir (req->ptr1); break; |
1264 | case REQ_MKDIR: req->result = mkdir (req->ptr1, req->mode); break; |
1291 | case REQ_MKDIR: req->result = mkdir (req->ptr1, req->mode); break; |
1265 | case REQ_RENAME: req->result = rename (req->ptr2, req->ptr1); break; |
1292 | case REQ_RENAME: req->result = rename (req->ptr2, req->ptr1); break; |
1266 | case REQ_LINK: req->result = link (req->ptr2, req->ptr1); break; |
1293 | case REQ_LINK: req->result = link (req->ptr2, req->ptr1); break; |
… | |
… | |
1534 | req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh))); |
1561 | req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh))); |
1535 | |
1562 | |
1536 | REQ_SEND (req); |
1563 | REQ_SEND (req); |
1537 | } |
1564 | } |
1538 | |
1565 | |
1539 | int |
|
|
1540 | _dup (int fd) |
|
|
1541 | PROTOTYPE: $ |
|
|
1542 | CODE: |
|
|
1543 | RETVAL = dup (fd); |
|
|
1544 | OUTPUT: |
|
|
1545 | RETVAL |
|
|
1546 | |
|
|
1547 | void |
1566 | void |
1548 | _aio_close (int fd, SV *callback=&PL_sv_undef) |
1567 | aio_close (SV *fh, SV *callback=&PL_sv_undef) |
1549 | PROTOTYPE: $;$ |
1568 | PROTOTYPE: $;$ |
1550 | PPCODE: |
1569 | PPCODE: |
1551 | { |
1570 | { |
1552 | dREQ; |
1571 | dREQ; |
1553 | |
1572 | |
1554 | req->type = REQ_CLOSE; |
1573 | req->type = REQ_CLOSE; |
1555 | req->int1 = fd; |
1574 | req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh))); |
1556 | |
1575 | |
1557 | REQ_SEND (req); |
1576 | REQ_SEND (req); |
1558 | } |
1577 | } |
1559 | |
1578 | |
1560 | void |
1579 | void |