ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/IO-AIO/AIO.xs
(Generate patch)

Comparing IO-AIO/AIO.xs (file contents):
Revision 1.140 by root, Wed Jun 3 12:24:49 2009 UTC vs.
Revision 1.141 by root, Sat Jun 6 17:25:13 2009 UTC

235 235
236 av_extend (av, req->result - 1); 236 av_extend (av, req->result - 1);
237 237
238 for (i = 0; i < req->result; ++i) 238 for (i = 0; i < req->result; ++i)
239 { 239 {
240 if (req->int1 & EIO_READDIR_DENTS)
241 {
242 eio_dirent *ent = (eio_dirent *)buf;
243 SV *namesv = newSVpvn (ent->name, ent->namelen);
244
245 if (req->int1 & EIO_READDIR_CUSTOM2)
246 {
247 static SV *sv_type [EIO_DT_MAX + 1]; /* type sv cache */
248 AV *avent = newAV ();
249
250 av_extend (avent, 2);
251
252 if (!sv_type [ent->type])
253 {
254 sv_type [ent->type] = newSViv (ent->type);
255 SvREADONLY_on (sv_type [ent->type]);
256 }
257
258 av_store (avent, 0, namesv);
259 av_store (avent, 1, IVSIZE >= 8 ? newSVuv (ent->inode) : newSVnv (ent->inode));
260 av_store (avent, 2, SvREFCNT_inc (sv_type [ent->type]));
261
262 av_store (av, i, newRV_noinc ((SV *)avent));
263 }
264 else
265 av_store (av, i, namesv);
266
267 buf += sizeof (eio_dirent);
268 }
269 else
270 {
240 SV *sv = newSVpv (buf, 0); 271 SV *name = newSVpv (buf, 0);
241
242 av_store (av, i, sv); 272 av_store (av, i, name);
243 buf += SvCUR (sv) + 1; 273 buf += SvCUR (name) + 1;
274 }
244 } 275 }
245 276
246 rv = sv_2mortal (newRV_noinc ((SV *)av)); 277 rv = sv_2mortal (newRV_noinc ((SV *)av));
247 } 278 }
248 279
249 PUSHs (rv); 280 PUSHs (rv);
281
282 if (req->int1 & EIO_READDIR_CUSTOM1)
283 XPUSHs (sv_2mortal (newSViv (req->int1 & ~(EIO_READDIR_CUSTOM1 | EIO_READDIR_CUSTOM2))));
250 } 284 }
251 break; 285 break;
252 286
253 case EIO_OPEN: 287 case EIO_OPEN:
254 { 288 {
521 555
522PROTOTYPES: ENABLE 556PROTOTYPES: ENABLE
523 557
524BOOT: 558BOOT:
525{ 559{
526 stash = gv_stashpv ("IO::AIO", 1); 560 stash = gv_stashpv ("IO::AIO", 1);
527 561
528 newCONSTSUB (stash, "EXDEV", newSViv (EXDEV)); 562 static const struct {
529 newCONSTSUB (stash, "ENOSYS", newSViv (ENOSYS)); 563 const char *name;
530 newCONSTSUB (stash, "O_RDONLY", newSViv (O_RDONLY)); 564 IV iv;
531 newCONSTSUB (stash, "O_WRONLY", newSViv (O_WRONLY)); 565 } *civ, const_iv[] = {
532 newCONSTSUB (stash, "O_CREAT", newSViv (O_CREAT)); 566# define const_iv(name, value) { # name, (IV) value },
533 newCONSTSUB (stash, "O_TRUNC", newSViv (O_TRUNC)); 567# define const_eio(name) { # name, (IV) EIO_ ## name },
568 const_iv (EXDEV , EXDEV)
569 const_iv (ENOSYS , ENOSYS)
570 const_iv (O_RDONLY, O_RDONLY)
571 const_iv (O_WRONLY, O_WRONLY)
572 const_iv (O_CREAT , O_CREAT)
573 const_iv (O_TRUNC , O_TRUNC)
534#ifndef _WIN32 574#ifndef _WIN32
535 newCONSTSUB (stash, "S_IFIFO", newSViv (S_IFIFO)); 575 const_iv (S_IFIFO , S_IFIFO)
536#endif 576#endif
537 newCONSTSUB (stash, "S_IFIFO", newSViv (S_IFIFO)); 577 const_eio (SYNC_FILE_RANGE_WAIT_BEFORE)
538 newCONSTSUB (stash, "SYNC_FILE_RANGE_WAIT_BEFORE", newSViv (EIO_SYNC_FILE_RANGE_WAIT_BEFORE)); 578 const_eio (SYNC_FILE_RANGE_WRITE)
539 newCONSTSUB (stash, "SYNC_FILE_RANGE_WRITE" , newSViv (EIO_SYNC_FILE_RANGE_WRITE)); 579 const_eio (SYNC_FILE_RANGE_WAIT_AFTER)
540 newCONSTSUB (stash, "SYNC_FILE_RANGE_WAIT_AFTER" , newSViv (EIO_SYNC_FILE_RANGE_WAIT_AFTER));
541 580
581 const_eio (READDIR_DENTS)
582 const_eio (READDIR_DIRS_FIRST)
583 const_eio (READDIR_STAT_ORDER)
584 const_eio (READDIR_FOUND_UNKNOWN)
585
586 const_eio (DT_UNKNOWN)
587 const_eio (DT_FIFO)
588 const_eio (DT_CHR)
589 const_eio (DT_DIR)
590 const_eio (DT_BLK)
591 const_eio (DT_REG)
592 const_eio (DT_LNK)
593 const_eio (DT_SOCK)
594 const_eio (DT_WHT)
595 };
596
597 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
598 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
599
542 create_respipe (); 600 create_respipe ();
543 601
544 if (eio_init (want_poll, done_poll) < 0) 602 if (eio_init (want_poll, done_poll) < 0)
545 croak ("IO::AIO: unable to initialise eio library"); 603 croak ("IO::AIO: unable to initialise eio library");
546 604
547 /* atfork child called in fifo order, so before eio's handler */ 605 /* atfork child called in fifo order, so before eio's handler */
548 X_THREAD_ATFORK (0, 0, atfork_child); 606 X_THREAD_ATFORK (0, 0, atfork_child);
549} 607}
550 608
551void 609void
552max_poll_reqs (int nreqs) 610max_poll_reqs (int nreqs)
553 PROTOTYPE: $ 611 PROTOTYPE: $
889 req->type = EIO_FCHOWN; 947 req->type = EIO_FCHOWN;
890 req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh_or_path))); 948 req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh_or_path)));
891 } 949 }
892 950
893 REQ_SEND; 951 REQ_SEND;
952}
953
954void
955aio_readdirx (SV8 *pathname, IV flags, SV *callback=&PL_sv_undef)
956 PPCODE:
957{
958 dREQ;
959
960 req->type = EIO_READDIR;
961 req->sv1 = newSVsv (pathname);
962 req->ptr1 = SvPVbyte_nolen (req->sv1);
963 req->int1 = flags | EIO_READDIR_DENTS | EIO_READDIR_CUSTOM1;
964
965 if (flags & EIO_READDIR_DENTS)
966 flags |= EIO_READDIR_CUSTOM2;
967
968 REQ_SEND;
894} 969}
895 970
896void 971void
897aio_unlink (SV8 *pathname, SV *callback=&PL_sv_undef) 972aio_unlink (SV8 *pathname, SV *callback=&PL_sv_undef)
898 ALIAS: 973 ALIAS:
1146 AV *av; 1221 AV *av;
1147 1222
1148 grp->errorno = errno; 1223 grp->errorno = errno;
1149 1224
1150 av = newAV (); 1225 av = newAV ();
1226 av_extend (av, items - 1);
1151 1227
1152 for (i = 1; i < items; ++i ) 1228 for (i = 1; i < items; ++i )
1153 av_push (av, newSVsv (ST (i))); 1229 av_push (av, newSVsv (ST (i)));
1154 1230
1155 SvREFCNT_dec (grp->sv1); 1231 SvREFCNT_dec (grp->sv1);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines