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.45 by root, Sun Oct 22 00:19:05 2006 UTC vs.
Revision 1.46 by root, Sun Oct 22 00:49:29 2006 UTC

88 unsigned char cancelled; 88 unsigned char cancelled;
89} aio_cb; 89} aio_cb;
90 90
91typedef aio_cb *aio_req; 91typedef aio_cb *aio_req;
92typedef aio_cb *aio_req_ornot; 92typedef aio_cb *aio_req_ornot;
93typedef aio_cb *aio_group;
94 93
95static int started, wanted; 94static int started, wanted;
96static volatile int nreqs; 95static volatile int nreqs;
97static int max_outstanding = 1<<30; 96static int max_outstanding = 1<<30;
98static int respipe [2]; 97static int respipe [2];
227 226
228 /* unlink request */ 227 /* unlink request */
229 req->grp_next->grp_prev = req->grp_prev; 228 req->grp_next->grp_prev = req->grp_prev;
230 req->grp_prev->grp_next = req->grp_next; 229 req->grp_prev->grp_next = req->grp_next;
231 230
232 if (grp->grp_next == grp) 231 if (grp->grp_next == grp && grp->fd)
233 { 232 {
234 req_invoke (grp); 233 req_invoke (grp);
235 req_free (grp); 234 req_free (grp);
236 } 235 }
237 } 236 }
311 nreqs--; 310 nreqs--;
312 311
313 if (req->type == REQ_QUIT) 312 if (req->type == REQ_QUIT)
314 started--; 313 started--;
315 else if (req->type == REQ_GROUP && req->grp_next != req) 314 else if (req->type == REQ_GROUP && req->grp_next != req)
315 {
316 req->fd = 1; /* mark request as delayed */
316 continue; 317 continue;
318 }
317 else 319 else
318 { 320 {
319 if (req->type == REQ_READ) 321 if (req->type == REQ_READ)
320 SvCUR_set (req->data, req->dataoffset + (req->result > 0 ? req->result : 0)); 322 SvCUR_set (req->data, req->dataoffset + (req->result > 0 ? req->result : 0));
321 323
1142} 1144}
1143 1145
1144void 1146void
1145aio_group (callback=&PL_sv_undef) 1147aio_group (callback=&PL_sv_undef)
1146 SV * callback 1148 SV * callback
1147 PROTOTYPE: ;& 1149 PROTOTYPE: ;$
1148 PPCODE: 1150 PPCODE:
1149{ 1151{
1150 dREQ; 1152 dREQ;
1151 req->type = REQ_GROUP; 1153 req->type = REQ_GROUP;
1152 req->grp_next = req; 1154 req->grp_next = req;
1224{ 1226{
1225 int i; 1227 int i;
1226 1228
1227 for (i = 1; i < items; ++i ) 1229 for (i = 1; i < items; ++i )
1228 { 1230 {
1229 aio_req req = SvAIO_REQ (ST (i));
1230
1231 req->grp_prev = grp;
1232 req->grp_next = grp->grp_next;
1233 grp->grp_next->grp_prev = req;
1234 grp->grp_next = req;
1235
1236 req->grp = grp;
1237
1238 if (GIMME_V != G_VOID) 1231 if (GIMME_V != G_VOID)
1239 XPUSHs (sv_2mortal (newSVsv (ST (i)))); 1232 XPUSHs (sv_2mortal (newSVsv (ST (i))));
1233
1234 aio_req req = SvAIO_REQ (ST (i));
1235 printf ("req = %p\n", req);//D
1236
1237 if (req)
1238 {
1239 req->grp_prev = grp;
1240 req->grp_next = grp->grp_next;
1241 grp->grp_next->grp_prev = req;
1242 grp->grp_next = req;
1243
1244 req->grp = grp;
1245 }
1240 } 1246 }
1241} 1247}
1242 1248

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines