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.48 by root, Sun Oct 22 10:33:19 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];
147 146
148 errno = req->errorno; 147 errno = req->errorno;
149 148
150 ENTER; 149 ENTER;
151 PUSHMARK (SP); 150 PUSHMARK (SP);
151 EXTEND (SP, 1);
152 152
153 switch (req->type) 153 switch (req->type)
154 { 154 {
155 case REQ_READDIR: 155 case REQ_READDIR:
156 { 156 {
171 } 171 }
172 172
173 rv = sv_2mortal (newRV_noinc ((SV *)av)); 173 rv = sv_2mortal (newRV_noinc ((SV *)av));
174 } 174 }
175 175
176 XPUSHs (rv); 176 PUSHs (rv);
177 } 177 }
178 break; 178 break;
179 179
180 case REQ_OPEN: 180 case REQ_OPEN:
181 { 181 {
182 /* convert fd to fh */ 182 /* convert fd to fh */
183 SV *fh; 183 SV *fh;
184 184
185 XPUSHs (sv_2mortal (newSViv (req->result))); 185 PUSHs (sv_2mortal (newSViv (req->result)));
186 PUTBACK; 186 PUTBACK;
187 call_pv ("IO::AIO::_fd2fh", G_SCALAR | G_EVAL); 187 call_pv ("IO::AIO::_fd2fh", G_SCALAR | G_EVAL);
188 SPAGAIN; 188 SPAGAIN;
189 189
190 fh = SvREFCNT_inc (POPs); 190 fh = SvREFCNT_inc (POPs);
192 PUSHMARK (SP); 192 PUSHMARK (SP);
193 XPUSHs (sv_2mortal (fh)); 193 XPUSHs (sv_2mortal (fh));
194 } 194 }
195 break; 195 break;
196 196
197 case REQ_GROUP:
198 if (req->data)
199 {
200 int i;
201 AV *av = (AV *)req->data;
202
203 EXTEND (SP, AvFILL (av) + 1);
204 for (i = 0; i <= AvFILL (av); ++i)
205 PUSHs (*av_fetch (av, i, 0));
206 }
207 break;
208
197 case REQ_SLEEP: 209 case REQ_SLEEP:
198 case REQ_GROUP:
199 break; 210 break;
200 211
201 default: 212 default:
202 XPUSHs (sv_2mortal (newSViv (req->result))); 213 PUSHs (sv_2mortal (newSViv (req->result)));
203 break; 214 break;
204 } 215 }
205 216
206 217
207 PUTBACK; 218 PUTBACK;
227 238
228 /* unlink request */ 239 /* unlink request */
229 req->grp_next->grp_prev = req->grp_prev; 240 req->grp_next->grp_prev = req->grp_prev;
230 req->grp_prev->grp_next = req->grp_next; 241 req->grp_prev->grp_next = req->grp_next;
231 242
232 if (grp->grp_next == grp) 243 if (grp->grp_next == grp && grp->fd)
233 { 244 {
234 req_invoke (grp); 245 req_invoke (grp);
235 req_free (grp); 246 req_free (grp);
236 } 247 }
237 } 248 }
311 nreqs--; 322 nreqs--;
312 323
313 if (req->type == REQ_QUIT) 324 if (req->type == REQ_QUIT)
314 started--; 325 started--;
315 else if (req->type == REQ_GROUP && req->grp_next != req) 326 else if (req->type == REQ_GROUP && req->grp_next != req)
327 {
328 req->fd = 1; /* mark request as delayed */
316 continue; 329 continue;
330 }
317 else 331 else
318 { 332 {
319 if (req->type == REQ_READ) 333 if (req->type == REQ_READ)
320 SvCUR_set (req->data, req->dataoffset + (req->result > 0 ? req->result : 0)); 334 SvCUR_set (req->data, req->dataoffset + (req->result > 0 ? req->result : 0));
321 335
1142} 1156}
1143 1157
1144void 1158void
1145aio_group (callback=&PL_sv_undef) 1159aio_group (callback=&PL_sv_undef)
1146 SV * callback 1160 SV * callback
1147 PROTOTYPE: ;& 1161 PROTOTYPE: ;$
1148 PPCODE: 1162 PPCODE:
1149{ 1163{
1150 dREQ; 1164 dREQ;
1151 req->type = REQ_GROUP; 1165 req->type = REQ_GROUP;
1152 req->grp_next = req; 1166 req->grp_next = req;
1205 CODE: 1219 CODE:
1206 RETVAL = nreqs; 1220 RETVAL = nreqs;
1207 OUTPUT: 1221 OUTPUT:
1208 RETVAL 1222 RETVAL
1209 1223
1224PROTOTYPES: DISABLE
1225
1210MODULE = IO::AIO PACKAGE = IO::AIO::REQ 1226MODULE = IO::AIO PACKAGE = IO::AIO::REQ
1211 1227
1212void 1228void
1213cancel (aio_req_ornot req) 1229cancel (aio_req_ornot req)
1214 PROTOTYPE: 1230 PROTOTYPE:
1217 1233
1218MODULE = IO::AIO PACKAGE = IO::AIO::GRP 1234MODULE = IO::AIO PACKAGE = IO::AIO::GRP
1219 1235
1220void 1236void
1221add (aio_req grp, ...) 1237add (aio_req grp, ...)
1222 PROTOTYPE: $;@
1223 PPCODE: 1238 PPCODE:
1224{ 1239{
1225 int i; 1240 int i;
1226 1241
1227 for (i = 1; i < items; ++i ) 1242 for (i = 1; i < items; ++i )
1228 { 1243 {
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) 1244 if (GIMME_V != G_VOID)
1239 XPUSHs (sv_2mortal (newSVsv (ST (i)))); 1245 XPUSHs (sv_2mortal (newSVsv (ST (i))));
1246
1247 aio_req req = SvAIO_REQ (ST (i));
1248
1249 if (req)
1250 {
1251 req->grp_prev = grp;
1252 req->grp_next = grp->grp_next;
1253 grp->grp_next->grp_prev = req;
1254 grp->grp_next = req;
1255
1256 req->grp = grp;
1257 }
1240 } 1258 }
1241} 1259}
1242 1260
1261void
1262result (aio_req grp, ...)
1263 CODE:
1264{
1265 int i;
1266 AV *av = newAV ();
1267
1268 if (grp->data)
1269 SvREFCNT_dec (grp->data);
1270
1271 for (i = 1; i < items; ++i )
1272 av_push (av, newSVsv (ST (i)));
1273
1274 grp->data = (SV *)av;
1275}
1276

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines