ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/EV-ADNS/ADNS.xs
(Generate patch)

Comparing cvsroot/EV-ADNS/ADNS.xs (file contents):
Revision 1.12 by root, Fri Dec 7 23:54:13 2007 UTC vs.
Revision 1.14 by root, Sat Dec 8 22:35:31 2007 UTC

43 break; 43 break;
44 44
45 c = (struct ctx *)ctx; 45 c = (struct ctx *)ctx;
46 cb = c->cb; 46 cb = c->cb;
47 c->cb = 0; 47 c->cb = 0;
48 ev_unref (); 48 ev_unref (EV_A);
49 SvREFCNT_dec (c->self); 49 SvREFCNT_dec (c->self);
50 50
51 PUSHMARK (SP); 51 PUSHMARK (SP);
52 52
53 EXTEND (SP, a->nrrs + 2); 53 EXTEND (SP, a->nrrs + 2);
219static struct timeval tv_now; 219static struct timeval tv_now;
220 220
221static void 221static void
222update_now (EV_P) 222update_now (EV_P)
223{ 223{
224 ev_tstamp t = ev_now (); 224 ev_tstamp t = ev_now (EV_A);
225 225
226 tv_now.tv_sec = (long)t; 226 tv_now.tv_sec = (long)t;
227 tv_now.tv_usec = (long)((t - (ev_tstamp)tv_now.tv_sec) * 1e6); 227 tv_now.tv_usec = (long)((t - (ev_tstamp)tv_now.tv_sec) * 1e6);
228} 228}
229 229
235 235
236static void 236static void
237timer_cb (EV_P_ ev_timer *w, int revents) 237timer_cb (EV_P_ ev_timer *w, int revents)
238{ 238{
239 adns_state ads = (adns_state)w->data; 239 adns_state ads = (adns_state)w->data;
240 update_now (); 240 update_now (EV_A);
241 241
242 adns_processtimeouts (ads, &tv_now); 242 adns_processtimeouts (ads, &tv_now);
243} 243}
244 244
245static void 245static void
260 int timeout = 3600000; 260 int timeout = 3600000;
261 adns_state ads = (adns_state)w->data; 261 adns_state ads = (adns_state)w->data;
262 262
263 if (ev_is_active (&tw)) 263 if (ev_is_active (&tw))
264 { 264 {
265 ev_ref (); 265 ev_ref (EV_A);
266 ev_timer_stop (EV_A_ &tw); 266 ev_timer_stop (EV_A_ &tw);
267 } 267 }
268 268
269 if (ev_is_active (&iw)) 269 if (ev_is_active (&iw))
270 ev_idle_stop (EV_A_ &iw); 270 ev_idle_stop (EV_A_ &iw);
271 271
272 for (i = 0; i < nfd; ++i) 272 for (i = 0; i < nfd; ++i)
273 { 273 {
274 ev_ref (); 274 ev_ref (EV_A);
275 ev_io_stop (EV_A_ iow + i); 275 ev_io_stop (EV_A_ iow + i);
276 } 276 }
277 277
278 process (ads); 278 process (ads);
279 update_now (EV_A); 279 update_now (EV_A);
288 free (fds); fds = malloc (mfd * sizeof (struct pollfd)); 288 free (fds); fds = malloc (mfd * sizeof (struct pollfd));
289 } 289 }
290 290
291 ev_timer_set (&tw, timeout * 1e-3, 0.); 291 ev_timer_set (&tw, timeout * 1e-3, 0.);
292 ev_timer_start (EV_A_ &tw); 292 ev_timer_start (EV_A_ &tw);
293 ev_unref (); 293 ev_unref (EV_A);
294 294
295 // create one ev_io per pollfd 295 // create one ev_io per pollfd
296 for (i = 0; i < nfd; ++i) 296 for (i = 0; i < nfd; ++i)
297 { 297 {
298 ev_io *w = iow + i;
299
298 ev_io_init (iow + i, io_cb, fds [i].fd, 300 ev_io_init (w, io_cb, fds [i].fd,
299 ((fds [i].events & POLLIN ? EV_READ : 0) 301 ((fds [i].events & POLLIN ? EV_READ : 0)
300 | (fds [i].events & POLLOUT ? EV_WRITE : 0))); 302 | (fds [i].events & POLLOUT ? EV_WRITE : 0)));
301 303
304 w->data = (void *)ads;
302 ev_io_start (EV_A_ iow + i); 305 ev_io_start (EV_A_ w);
303 ev_unref (); 306 ev_unref (EV_A);
304 } 307 }
305} 308}
306 309
307static HV *stash; 310static HV *stash;
308static adns_state ads; 311static adns_state ads;
406 adns_init (&ads, adns_if_noenv | adns_if_noerrprint | adns_if_noserverwarn | adns_if_noautosys, 0); 409 adns_init (&ads, adns_if_noenv | adns_if_noerrprint | adns_if_noserverwarn | adns_if_noautosys, 0);
407 410
408 ev_prepare_init (&pw, prepare_cb); 411 ev_prepare_init (&pw, prepare_cb);
409 pw.data = (void *)ads; 412 pw.data = (void *)ads;
410 ev_prepare_start (EV_DEFAULT_ &pw); 413 ev_prepare_start (EV_DEFAULT_ &pw);
411 ev_unref (); 414 ev_unref (EV_A);
412 415
413 ev_init (&iw, idle_cb); ev_set_priority (&iw, EV_MINPRI); 416 ev_init (&iw, idle_cb); ev_set_priority (&iw, EV_MINPRI);
414 iw.data = (void *)ads; 417 iw.data = (void *)ads;
415 ev_init (&tw, timer_cb); 418 ev_init (&tw, timer_cb);
416 tw.data = (void *)ads; 419 tw.data = (void *)ads;
429 errno = r; 432 errno = r;
430 XSRETURN_EMPTY; 433 XSRETURN_EMPTY;
431 } 434 }
432 else 435 else
433 { 436 {
434 ev_ref (); 437 ev_ref (EV_A);
435 SvPOK_only (csv); 438 SvPOK_only (csv);
436 SvCUR_set (csv, sizeof (struct ctx)); 439 SvCUR_set (csv, sizeof (struct ctx));
437 440
438 c->self = csv; 441 c->self = csv;
439 c->cb = newSVsv (cb); 442 c->cb = newSVsv (cb);
463 466
464 c = (struct ctx *)SvPVX (SvRV (req)); 467 c = (struct ctx *)SvPVX (SvRV (req));
465 468
466 if (c->cb) 469 if (c->cb)
467 { 470 {
468 ev_unref (); 471 ev_unref (EV_A);
469 SvREFCNT_dec (c->cb); 472 SvREFCNT_dec (c->cb);
470 c->cb = 0; 473 c->cb = 0;
471 adns_cancel (c->query); 474 adns_cancel (c->query);
472 SvREFCNT_dec (c->self); 475 SvREFCNT_dec (c->self);
473 } 476 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines