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.50 by root, Sun Oct 22 21:13:47 2006 UTC vs.
Revision 1.56 by root, Mon Oct 23 14:49:51 2006 UTC

55 REQ_STAT, REQ_LSTAT, REQ_FSTAT, 55 REQ_STAT, REQ_LSTAT, REQ_FSTAT,
56 REQ_FSYNC, REQ_FDATASYNC, 56 REQ_FSYNC, REQ_FDATASYNC,
57 REQ_UNLINK, REQ_RMDIR, REQ_RENAME, 57 REQ_UNLINK, REQ_RMDIR, REQ_RENAME,
58 REQ_READDIR, 58 REQ_READDIR,
59 REQ_LINK, REQ_SYMLINK, 59 REQ_LINK, REQ_SYMLINK,
60 REQ_GROUP, REQ_NOP,
60 REQ_SLEEP, 61 REQ_SLEEP,
61 REQ_GROUP,
62}; 62};
63 63
64#define AIO_REQ_KLASS "IO::AIO::REQ" 64#define AIO_REQ_KLASS "IO::AIO::REQ"
65#define AIO_GRP_KLASS "IO::AIO::GRP" 65#define AIO_GRP_KLASS "IO::AIO::GRP"
66 66
118 return sv_2mortal (sv_bless (newRV_inc (req->self), gv_stashpv (klass, 1))); 118 return sv_2mortal (sv_bless (newRV_inc (req->self), gv_stashpv (klass, 1)));
119} 119}
120 120
121static aio_req SvAIO_REQ (SV *sv) 121static aio_req SvAIO_REQ (SV *sv)
122{ 122{
123 MAGIC *mg;
124
123 if (!sv_derived_from (sv, AIO_REQ_KLASS) || !SvROK (sv)) 125 if (!sv_derived_from (sv, AIO_REQ_KLASS) || !SvROK (sv))
124 croak ("object of class " AIO_REQ_KLASS " expected"); 126 croak ("object of class " AIO_REQ_KLASS " expected");
125 127
126 MAGIC *mg = mg_find (SvRV (sv), PERL_MAGIC_ext); 128 mg = mg_find (SvRV (sv), PERL_MAGIC_ext);
127 129
128 return mg ? (aio_req)mg->mg_ptr : 0; 130 return mg ? (aio_req)mg->mg_ptr : 0;
129} 131}
130 132
131static void aio_grp_feed (aio_req grp) 133static void aio_grp_feed (aio_req grp)
257 for (i = 0; i <= AvFILL (av); ++i) 259 for (i = 0; i <= AvFILL (av); ++i)
258 PUSHs (*av_fetch (av, i, 0)); 260 PUSHs (*av_fetch (av, i, 0));
259 } 261 }
260 break; 262 break;
261 263
264 case REQ_NOP:
262 case REQ_SLEEP: 265 case REQ_SLEEP:
263 break; 266 break;
264 267
265 default: 268 default:
266 PUSHs (sv_2mortal (newSViv (req->result))); 269 PUSHs (sv_2mortal (newSViv (req->result)));
270 273
271 PUTBACK; 274 PUTBACK;
272 call_sv (req->callback, G_VOID | G_EVAL); 275 call_sv (req->callback, G_VOID | G_EVAL);
273 SPAGAIN; 276 SPAGAIN;
274 277
278 FREETMPS;
279 LEAVE;
280
281 errno = errorno;
282
275 if (SvTRUE (ERRSV)) 283 if (SvTRUE (ERRSV))
276 { 284 {
277 req_free (req); 285 req_free (req);
278 croak (0); 286 croak (0);
279 } 287 }
280
281 FREETMPS;
282 LEAVE;
283
284 errno = errorno;
285} 288}
286 289
287static void req_free (aio_req req) 290static void req_free (aio_req req)
288{ 291{
289 if (req->grp) 292 if (req->grp)
818 tv.tv_usec = req->fd2; 821 tv.tv_usec = req->fd2;
819 822
820 req->result = select (0, 0, 0, 0, &tv); 823 req->result = select (0, 0, 0, 0, &tv);
821 } 824 }
822 825
826 case REQ_GROUP:
827 case REQ_NOP:
823 case REQ_QUIT: 828 case REQ_QUIT:
824 break; 829 break;
825 830
826 default: 831 default:
827 req->result = ENOSYS; 832 req->result = ENOSYS;
1210 req_send (req); 1215 req_send (req);
1211 XPUSHs (req_sv (req, AIO_GRP_KLASS)); 1216 XPUSHs (req_sv (req, AIO_GRP_KLASS));
1212} 1217}
1213 1218
1214void 1219void
1220aio_nop (callback=&PL_sv_undef)
1221 SV * callback
1222 PPCODE:
1223{
1224 dREQ;
1225
1226 req->type = REQ_NOP;
1227
1228 REQ_SEND;
1229}
1230
1231void
1215flush () 1232flush ()
1216 PROTOTYPE: 1233 PROTOTYPE:
1217 CODE: 1234 CODE:
1218 while (nreqs) 1235 while (nreqs)
1219 { 1236 {
1270cancel (aio_req_ornot req) 1287cancel (aio_req_ornot req)
1271 PROTOTYPE: 1288 PROTOTYPE:
1272 CODE: 1289 CODE:
1273 req_cancel (req); 1290 req_cancel (req);
1274 1291
1292void
1293cb (aio_req req, SV *callback=&PL_sv_undef)
1294 CODE:
1295 SvREFCNT_dec (req->callback);
1296 req->callback = newSVsv (callback);
1297
1275MODULE = IO::AIO PACKAGE = IO::AIO::GRP 1298MODULE = IO::AIO PACKAGE = IO::AIO::GRP
1276 1299
1277void 1300void
1278add (aio_req grp, ...) 1301add (aio_req grp, ...)
1279 PPCODE: 1302 PPCODE:
1280{ 1303{
1281 int i; 1304 int i;
1305 aio_req req;
1282 1306
1283 if (grp->fd == 2) 1307 if (grp->fd == 2)
1284 croak ("cannot add requests to IO::AIO::GRP after the group finished"); 1308 croak ("cannot add requests to IO::AIO::GRP after the group finished");
1285 1309
1286 for (i = 1; i < items; ++i ) 1310 for (i = 1; i < items; ++i )
1287 { 1311 {
1288 if (GIMME_V != G_VOID) 1312 if (GIMME_V != G_VOID)
1289 XPUSHs (sv_2mortal (newSVsv (ST (i)))); 1313 XPUSHs (sv_2mortal (newSVsv (ST (i))));
1290 1314
1291 aio_req req = SvAIO_REQ (ST (i)); 1315 req = SvAIO_REQ (ST (i));
1292 1316
1293 if (req) 1317 if (req)
1294 { 1318 {
1295 ++grp->length; 1319 ++grp->length;
1296 req->grp = grp; 1320 req->grp = grp;
1305 } 1329 }
1306 } 1330 }
1307} 1331}
1308 1332
1309void 1333void
1310lock (aio_req grp) 1334result (aio_req grp, ...)
1311 CODE: 1335 CODE:
1312 ++grp->length; 1336{
1337 int i;
1338 AV *av = newAV ();
1313 1339
1314void 1340 for (i = 1; i < items; ++i )
1315unlock (aio_req grp) 1341 av_push (av, newSVsv (ST (i)));
1316 CODE:
1317 aio_grp_dec (grp);
1318 1342
1343 SvREFCNT_dec (grp->data);
1344 grp->data = (SV *)av;
1345}
1346
1319void 1347void
1320feeder_limit (aio_req grp, int limit) 1348feed_limit (aio_req grp, int limit)
1321 CODE: 1349 CODE:
1322 grp->fd2 = limit; 1350 grp->fd2 = limit;
1323 aio_grp_feed (grp); 1351 aio_grp_feed (grp);
1324 1352
1325void 1353void
1326set_feeder (aio_req grp, SV *callback=&PL_sv_undef) 1354feed (aio_req grp, SV *callback=&PL_sv_undef)
1327 CODE: 1355 CODE:
1328{ 1356{
1329 SvREFCNT_dec (grp->fh2); 1357 SvREFCNT_dec (grp->fh2);
1330 grp->fh2 = newSVsv (callback); 1358 grp->fh2 = newSVsv (callback);
1331 1359

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines