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.139 by root, Tue Apr 21 20:12:56 2009 UTC vs.
Revision 1.142 by root, Sat Jun 6 18:19:35 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, "O_RDONLY", newSViv (O_RDONLY)); 563 const char *name;
530 newCONSTSUB (stash, "O_WRONLY", newSViv (O_WRONLY)); 564 IV iv;
531 newCONSTSUB (stash, "O_CREAT", newSViv (O_CREAT)); 565 } *civ, const_iv[] = {
532 newCONSTSUB (stash, "O_TRUNC", newSViv (O_TRUNC)); 566# define const_iv(name, value) { # name, (IV) value },
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)
533#ifndef _WIN32 574#ifndef _WIN32
534 newCONSTSUB (stash, "S_IFIFO", newSViv (S_IFIFO)); 575 const_iv (S_IFIFO , S_IFIFO)
535#endif 576#endif
536 newCONSTSUB (stash, "S_IFIFO", newSViv (S_IFIFO)); 577 const_eio (SYNC_FILE_RANGE_WAIT_BEFORE)
537 newCONSTSUB (stash, "SYNC_FILE_RANGE_WAIT_BEFORE", newSViv (EIO_SYNC_FILE_RANGE_WAIT_BEFORE)); 578 const_eio (SYNC_FILE_RANGE_WRITE)
538 newCONSTSUB (stash, "SYNC_FILE_RANGE_WRITE" , newSViv (EIO_SYNC_FILE_RANGE_WRITE)); 579 const_eio (SYNC_FILE_RANGE_WAIT_AFTER)
539 newCONSTSUB (stash, "SYNC_FILE_RANGE_WAIT_AFTER" , newSViv (EIO_SYNC_FILE_RANGE_WAIT_AFTER));
540 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
541 create_respipe (); 600 create_respipe ();
542 601
543 if (eio_init (want_poll, done_poll) < 0) 602 if (eio_init (want_poll, done_poll) < 0)
544 croak ("IO::AIO: unable to initialise eio library"); 603 croak ("IO::AIO: unable to initialise eio library");
545 604
546 /* atfork child called in fifo order, so before eio's handler */ 605 /* atfork child called in fifo order, so before eio's handler */
547 X_THREAD_ATFORK (0, 0, atfork_child); 606 X_THREAD_ATFORK (0, 0, atfork_child);
548} 607}
549 608
550void 609void
551max_poll_reqs (int nreqs) 610max_poll_reqs (int nreqs)
552 PROTOTYPE: $ 611 PROTOTYPE: $
888 req->type = EIO_FCHOWN; 947 req->type = EIO_FCHOWN;
889 req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh_or_path))); 948 req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh_or_path)));
890 } 949 }
891 950
892 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 req->int1 |= EIO_READDIR_CUSTOM2;
967
968 REQ_SEND;
893} 969}
894 970
895void 971void
896aio_unlink (SV8 *pathname, SV *callback=&PL_sv_undef) 972aio_unlink (SV8 *pathname, SV *callback=&PL_sv_undef)
897 ALIAS: 973 ALIAS:
1145 AV *av; 1221 AV *av;
1146 1222
1147 grp->errorno = errno; 1223 grp->errorno = errno;
1148 1224
1149 av = newAV (); 1225 av = newAV ();
1226 av_extend (av, items - 1);
1150 1227
1151 for (i = 1; i < items; ++i ) 1228 for (i = 1; i < items; ++i )
1152 av_push (av, newSVsv (ST (i))); 1229 av_push (av, newSVsv (ST (i)));
1153 1230
1154 SvREFCNT_dec (grp->sv1); 1231 SvREFCNT_dec (grp->sv1);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines