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.203 by root, Thu Sep 29 23:06:24 2011 UTC vs.
Revision 1.209 by root, Sun Apr 1 17:46:02 2012 UTC

62 #undef dup 62 #undef dup
63 #undef dup2 63 #undef dup2
64 #undef abort 64 #undef abort
65 #undef pipe 65 #undef pipe
66 66
67 #define EIO_STRUCT_STAT struct _stati64
68 #define EIO_STRUCT_STATI64
69
67#else 70#else
68 71
69 #include <sys/time.h> 72 #include <sys/time.h>
70 #include <sys/select.h> 73 #include <sys/select.h>
71 #include <unistd.h> 74 #include <unistd.h>
72 #include <utime.h> 75 #include <utime.h>
73 #include <signal.h> 76 #include <signal.h>
74 77
75#endif
76
77#define EIO_STRUCT_STAT Stat_t 78 #define EIO_STRUCT_STAT Stat_t
79
80#endif
78 81
79/* use NV for 32 bit perls as it allows larger offsets */ 82/* use NV for 32 bit perls as it allows larger offsets */
80#if IVSIZE >= 8 83#if IVSIZE >= 8
81# define VAL64 IV 84# define VAL64 IV
82# define SvVAL64 SvIV 85# define SvVAL64 SvIV
380SvAIO_REQ (SV *sv) 383SvAIO_REQ (SV *sv)
381{ 384{
382 MAGIC *mg; 385 MAGIC *mg;
383 386
384 if (!SvROK (sv) 387 if (!SvROK (sv)
388 /* for speed reasons, we do not verify that SvROK actually has a stash ptr */
385 || (SvSTASH (SvRV (sv)) != aio_grp_stash 389 || (SvSTASH (SvRV (sv)) != aio_grp_stash
386 && SvSTASH (SvRV (sv)) != aio_req_stash 390 && SvSTASH (SvRV (sv)) != aio_req_stash
387 && !sv_derived_from (sv, "IO::AIO::REQ"))) 391 && !sv_derived_from (sv, "IO::AIO::REQ")))
388 croak ("object of class IO::AIO::REQ expected"); 392 croak ("object of class IO::AIO::REQ expected");
389 393
394 398
395static aio_wd 399static aio_wd
396SvAIO_WD (SV *sv) 400SvAIO_WD (SV *sv)
397{ 401{
398 if (!SvROK (sv) 402 if (!SvROK (sv)
403 || SvTYPE (SvRV (sv)) != SVt_PVMG
399 || SvSTASH (SvRV (sv)) != aio_wd_stash 404 || SvSTASH (SvRV (sv)) != aio_wd_stash)
400 || SvTYPE (SvRV (sv)) != SVt_PVMG)
401 croak ("IO::AIO: expected a working directory object as returned by aio_wd"); 405 croak ("IO::AIO: expected a working directory object as returned by aio_wd");
402 406
403 return (aio_wd)(long)SvIVX (SvRV (sv)); 407 return (aio_wd)(long)SvIVX (SvRV (sv));
404} 408}
405 409
634 PL_statcache = *(EIO_STRUCT_STAT *)(req->ptr2); 638 PL_statcache = *(EIO_STRUCT_STAT *)(req->ptr2);
635 639
636 PUSHs (sv_result); 640 PUSHs (sv_result);
637 break; 641 break;
638 642
643 case EIO_SEEK:
644 PUSHs (req->result ? sv_result : sv_2mortal (newSVval64 (req->offs)));
645 break;
646
639 case EIO_READ: 647 case EIO_READ:
640 { 648 {
641 SvCUR_set (req->sv2, req->stroffset + (req->result > 0 ? req->result : 0)); 649 SvCUR_set (req->sv2, req->stroffset + (req->result > 0 ? req->result : 0));
642 *SvEND (req->sv2) = 0; 650 *SvEND (req->sv2) = 0;
643 SvPOK_only (req->sv2); 651 SvPOK_only (req->sv2);
689 SvREFCNT_dec (req->sv2); 697 SvREFCNT_dec (req->sv2);
690 SvREFCNT_dec (req->sv3); 698 SvREFCNT_dec (req->sv3);
691 SvREFCNT_dec (req->sv4); 699 SvREFCNT_dec (req->sv4);
692 SvREFCNT_dec (req->callback); 700 SvREFCNT_dec (req->callback);
693 701
694 Safefree (req); 702 free (req);
695} 703}
696 704
697static void 705static void
698req_cancel_subs (aio_req grp) 706req_cancel_subs (aio_req grp)
699{ 707{
819 int req_pri = next_pri; 827 int req_pri = next_pri;
820 next_pri = EIO_PRI_DEFAULT; 828 next_pri = EIO_PRI_DEFAULT;
821 829
822 cb_cv = get_cb (callback); 830 cb_cv = get_cb (callback);
823 831
824 Newz (0, req, 1, eio_req); 832 req = calloc (sizeof (*req), 1);
825 if (!req) 833 if (!req)
826 croak ("out of memory during eio_req allocation"); 834 croak ("out of memory during eio_req allocation");
827 835
828 req->callback = SvREFCNT_inc (cb_cv); 836 req->callback = SvREFCNT_inc (cb_cv);
829 req->pri = req_pri; 837 req->pri = req_pri;
845ecb_inline void 853ecb_inline void
846req_set_path (aio_req req, SV *path, SV **wdsv, SV **pathsv, eio_wd *wd, void **ptr) 854req_set_path (aio_req req, SV *path, SV **wdsv, SV **pathsv, eio_wd *wd, void **ptr)
847{ 855{
848 if (expect_false (SvROK (path))) 856 if (expect_false (SvROK (path)))
849 { 857 {
850 AV *av = (AV *)SvRV (path); 858 SV *rv = SvRV (path);
851 SV *wdob; 859 SV *wdob;
852 860
853 if (SvTYPE (av) != SVt_PVAV || AvFILLp (av) != 1) 861 if (SvTYPE (rv) == SVt_PVAV && AvFILLp (rv) == 1)
854 croak ("IO::AIO: pathname arguments must be specified as strings or [wd, path] arrayrefs");
855
856 path = AvARRAY (av)[1];
857 wdob = AvARRAY (av)[0];
858
859 if (SvOK (wdob))
860 { 862 {
863 path = AvARRAY (rv)[1];
864 wdob = AvARRAY (rv)[0];
865
866 if (SvOK (wdob))
867 {
861 *wd = SvAIO_WD (wdob); 868 *wd = SvAIO_WD (wdob);
862 *wdsv = SvREFCNT_inc_NN (SvRV (wdob)); 869 *wdsv = SvREFCNT_inc_NN (SvRV (wdob));
870 }
871 else
872 *wd = EIO_INVALID_WD;
873 }
874 else if (SvTYPE (rv) == SVt_PVMG && SvSTASH (rv) == aio_wd_stash)
875 {
876 *wd = (aio_wd)(long)SvIVX (rv);
877 *wdsv = SvREFCNT_inc_NN (rv);
878 *ptr = ".";
879 return; /* path set to "." */
863 } 880 }
864 else 881 else
865 *wd = EIO_INVALID_WD; 882 croak ("IO::AIO: pathname arguments must be specified as a string, an IO::AIO::WD object or a [IO::AIO::WD, path] pair");
866 } 883 }
867 884
868 *pathsv = newSVsv (path); 885 *pathsv = newSVsv (path);
869 *ptr = SvPVbyte_nolen (*pathsv); 886 *ptr = SvPVbyte_nolen (*pathsv);
870} 887}
989 const_iv (MAP_LOCKED) 1006 const_iv (MAP_LOCKED)
990 const_iv (MAP_NORESERVE) 1007 const_iv (MAP_NORESERVE)
991 const_iv (MAP_POPULATE) 1008 const_iv (MAP_POPULATE)
992 const_iv (MAP_NONBLOCK) 1009 const_iv (MAP_NONBLOCK)
993 1010
1011 const_eio (SEEK_SET)
1012 const_eio (SEEK_CUR)
1013 const_eio (SEEK_END)
1014
994 const_eio (MCL_FUTURE) 1015 const_eio (MCL_FUTURE)
995 const_eio (MCL_CURRENT) 1016 const_eio (MCL_CURRENT)
996 1017
997 const_eio (MS_ASYNC) 1018 const_eio (MS_ASYNC)
998 const_eio (MS_INVALIDATE) 1019 const_eio (MS_INVALIDATE)
1120 1141
1121 req->type = ix; 1142 req->type = ix;
1122 req->sv1 = newSVsv (fh); 1143 req->sv1 = newSVsv (fh);
1123 req->int1 = fd; 1144 req->int1 = fd;
1124 1145
1125 REQ_SEND (req); 1146 REQ_SEND;
1126} 1147}
1127 1148
1128void 1149void
1129aio_sync_file_range (SV *fh, off_t offset, size_t nbytes, UV flags, SV *callback=&PL_sv_undef) 1150aio_sync_file_range (SV *fh, off_t offset, size_t nbytes, UV flags, SV *callback=&PL_sv_undef)
1130 PPCODE: 1151 PPCODE:
1137 req->int1 = fd; 1158 req->int1 = fd;
1138 req->offs = offset; 1159 req->offs = offset;
1139 req->size = nbytes; 1160 req->size = nbytes;
1140 req->int2 = flags; 1161 req->int2 = flags;
1141 1162
1142 REQ_SEND (req); 1163 REQ_SEND;
1143} 1164}
1144 1165
1145void 1166void
1146aio_fallocate (SV *fh, int mode, off_t offset, size_t len, SV *callback=&PL_sv_undef) 1167aio_fallocate (SV *fh, int mode, off_t offset, size_t len, SV *callback=&PL_sv_undef)
1147 PPCODE: 1168 PPCODE:
1154 req->int1 = fd; 1175 req->int1 = fd;
1155 req->int2 = mode; 1176 req->int2 = mode;
1156 req->offs = offset; 1177 req->offs = offset;
1157 req->size = len; 1178 req->size = len;
1158 1179
1159 REQ_SEND (req); 1180 REQ_SEND;
1160} 1181}
1161 1182
1162void 1183void
1163aio_close (SV *fh, SV *callback=&PL_sv_undef) 1184aio_close (SV *fh, SV *callback=&PL_sv_undef)
1164 PPCODE: 1185 PPCODE:
1188 req->type = EIO_DUP2; 1209 req->type = EIO_DUP2;
1189 req->int1 = close_fd; 1210 req->int1 = close_fd;
1190 req->sv2 = newSVsv (fh); 1211 req->sv2 = newSVsv (fh);
1191 req->int2 = fd; 1212 req->int2 = fd;
1192 1213
1193 REQ_SEND (req); 1214 REQ_SEND;
1215}
1216
1217void
1218aio_seek (SV *fh, SV *offset, int whence, SV *callback=&PL_sv_undef)
1219 PPCODE:
1220{
1221 STRLEN svlen;
1222 int fd = s_fileno_croak (fh, 0);
1223 dREQ;
1224
1225 req->type = EIO_SEEK;
1226 req->sv1 = newSVsv (fh);
1227 req->int1 = fd;
1228 req->offs = SvVAL64 (offset);
1229 req->int2 = whence;
1230
1231 REQ_SEND;
1194} 1232}
1195 1233
1196void 1234void
1197aio_read (SV *fh, SV *offset, SV *length, SV8 *data, IV dataoffset, SV *callback=&PL_sv_undef) 1235aio_read (SV *fh, SV *offset, SV *length, SV8 *data, IV dataoffset, SV *callback=&PL_sv_undef)
1198 ALIAS: 1236 ALIAS:
1429 aio_link = EIO_LINK 1467 aio_link = EIO_LINK
1430 aio_symlink = EIO_SYMLINK 1468 aio_symlink = EIO_SYMLINK
1431 aio_rename = EIO_RENAME 1469 aio_rename = EIO_RENAME
1432 PPCODE: 1470 PPCODE:
1433{ 1471{
1472 eio_wd wd2 = 0;
1434 dREQ; 1473 dREQ;
1435 eio_wd wd2 = 0;
1436 1474
1437 req->type = ix; 1475 req->type = ix;
1438 req_set_path1 (req, oldpath); 1476 req_set_path1 (req, oldpath);
1439 req_set_path (req, newpath, &req->sv2, &req->sv4, &wd2, &req->ptr2); 1477 req_set_path (req, newpath, &req->sv2, &req->sv4, &wd2, &req->ptr2);
1440 req->int3 = (long)wd2; 1478 req->int3 = (long)wd2;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines