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

Comparing EV-ADNS/ADNS.xs (file contents):
Revision 1.6 by root, Sat Dec 1 20:52:30 2007 UTC vs.
Revision 1.9 by root, Sat Dec 1 22:36:10 2007 UTC

48 c = (struct ctx *)ctx; 48 c = (struct ctx *)ctx;
49 cb = c->cb; 49 cb = c->cb;
50 c->cb = 0; 50 c->cb = 0;
51 ev_unref (); 51 ev_unref ();
52 SvREFCNT_dec (c->self); 52 SvREFCNT_dec (c->self);
53 printf ("refrefclr\n");
54 53
55 PUSHMARK (SP); 54 PUSHMARK (SP);
56 55
57 EXTEND (SP, a->nrrs + 2); 56 EXTEND (SP, a->nrrs + 2);
58 PUSHs (sv_2mortal (newSViv (a->status))); 57 PUSHs (sv_2mortal (newSViv (a->status)));
70 case adns_r_ptr_raw: 69 case adns_r_ptr_raw:
71 sv = newSVpv (a->rrs.str [i], 0); 70 sv = newSVpv (a->rrs.str [i], 0);
72 break; 71 break;
73 72
74 case adns_r_txt: 73 case adns_r_txt:
75 sv = newSVpvn (a->rrs.manyistr [i]->str, a->rrs.manyistr [i]->i); 74 {
75 AV *av = newAV ();
76 adns_rr_intstr *rr = a->rrs.manyistr [i];
77
78 while (rr->str)
79 {
80 av_push (av, newSVpvn (rr->str, rr->i));
81 ++rr;
82 }
83
84 sv = newRV_noinc ((SV *)av);
85 }
76 break; 86 break;
77 87
78 case adns_r_a: 88 case adns_r_a:
79 sv = newSVpv (inet_ntoa (a->rrs.inaddr [i]), 0); 89 sv = newSVpv (inet_ntoa (a->rrs.inaddr [i]), 0);
80 break; 90 break;
85 95
86 case adns_r_hinfo: 96 case adns_r_hinfo:
87 { 97 {
88 /* untested */ 98 /* untested */
89 AV *av = newAV (); 99 AV *av = newAV ();
90 sv = newRV_noinc ((SV *)av);
91 adns_rr_intstrpair *rr = a->rrs.intstrpair + i; 100 adns_rr_intstrpair *rr = a->rrs.intstrpair + i;
92 101
93 av_push (av, newSVpvn (rr->array [0].str, rr->array [0].i)); 102 av_push (av, newSVpvn (rr->array [0].str, rr->array [0].i));
94 av_push (av, newSVpvn (rr->array [1].str, rr->array [1].i)); 103 av_push (av, newSVpvn (rr->array [1].str, rr->array [1].i));
104
105 sv = newRV_noinc ((SV *)av);
95 } 106 }
96 break; 107 break;
97 108
98 case adns_r_rp: 109 case adns_r_rp:
99 case adns_r_rp_raw: 110 case adns_r_rp_raw:
100 { 111 {
101 /* untested */ 112 /* untested */
102 AV *av = newAV (); 113 AV *av = newAV ();
103 sv = newRV_noinc ((SV *)av);
104 adns_rr_strpair *rr = a->rrs.strpair + i; 114 adns_rr_strpair *rr = a->rrs.strpair + i;
105 115
106 av_push (av, newSVpv (rr->array [0], 0)); 116 av_push (av, newSVpv (rr->array [0], 0));
107 av_push (av, newSVpv (rr->array [1], 0)); 117 av_push (av, newSVpv (rr->array [1], 0));
118
119 sv = newRV_noinc ((SV *)av);
108 } 120 }
109 break; 121 break;
110 122
111 case adns_r_mx: 123 case adns_r_mx:
112 { 124 {
113 AV *av = newAV (); 125 AV *av = newAV ();
114 sv = newRV_noinc ((SV *)av);
115 adns_rr_inthostaddr *rr = a->rrs.inthostaddr + i; 126 adns_rr_inthostaddr *rr = a->rrs.inthostaddr + i;
116 127
117 av_push (av, newSViv (rr->i)); 128 av_push (av, newSViv (rr->i));
118 av_push (av, ha2sv (&rr->ha)); 129 av_push (av, ha2sv (&rr->ha));
130
131 sv = newRV_noinc ((SV *)av);
119 } 132 }
120 break; 133 break;
121 134
122 case adns_r_mx_raw: 135 case adns_r_mx_raw:
123 { 136 {
124 AV *av = newAV (); 137 AV *av = newAV ();
125 sv = newRV_noinc ((SV *)av);
126 adns_rr_intstr *rr = a->rrs.intstr + i; 138 adns_rr_intstr *rr = a->rrs.intstr + i;
127 139
128 av_push (av, newSViv (rr->i)); 140 av_push (av, newSViv (rr->i));
129 av_push (av, newSVpv (rr->str, 0)); 141 av_push (av, newSVpv (rr->str, 0));
142
143 sv = newRV_noinc ((SV *)av);
130 } 144 }
131 break; 145 break;
132 146
133 case adns_r_soa: 147 case adns_r_soa:
134 case adns_r_soa_raw: 148 case adns_r_soa_raw:
135 { 149 {
136 AV *av = newAV (); 150 AV *av = newAV ();
137 sv = newRV_noinc ((SV *)av);
138 adns_rr_soa *rr = a->rrs.soa + i; 151 adns_rr_soa *rr = a->rrs.soa + i;
139 152
140 av_push (av, newSVpv (rr->mname, 0)); 153 av_push (av, newSVpv (rr->mname, 0));
141 av_push (av, newSVpv (rr->rname, 0)); 154 av_push (av, newSVpv (rr->rname, 0));
142 av_push (av, newSVuv (rr->serial)); 155 av_push (av, newSVuv (rr->serial));
143 av_push (av, newSVuv (rr->refresh)); 156 av_push (av, newSVuv (rr->refresh));
144 av_push (av, newSVuv (rr->retry)); 157 av_push (av, newSVuv (rr->retry));
145 av_push (av, newSVuv (rr->expire)); 158 av_push (av, newSVuv (rr->expire));
146 av_push (av, newSVuv (rr->minimum)); 159 av_push (av, newSVuv (rr->minimum));
160
161 sv = newRV_noinc ((SV *)av);
147 } 162 }
148 break; 163 break;
149 164
150 case adns_r_srv_raw: 165 case adns_r_srv_raw:
151 { 166 {
152 AV *av = newAV (); 167 AV *av = newAV ();
153 sv = newRV_noinc ((SV *)av);
154 adns_rr_srvraw *rr = a->rrs.srvraw + i; 168 adns_rr_srvraw *rr = a->rrs.srvraw + i;
155 169
156 av_push (av, newSViv (rr->priority)); 170 av_push (av, newSViv (rr->priority));
157 av_push (av, newSViv (rr->weight)); 171 av_push (av, newSViv (rr->weight));
158 av_push (av, newSViv (rr->port)); 172 av_push (av, newSViv (rr->port));
159 av_push (av, newSVpv (rr->host, 0)); 173 av_push (av, newSVpv (rr->host, 0));
174
175 sv = newRV_noinc ((SV *)av);
160 } 176 }
161 break; 177 break;
162 178
163 case adns_r_srv: 179 case adns_r_srv:
164 { 180 {
165 AV *av = newAV (); 181 AV *av = newAV ();
166 sv = newRV_noinc ((SV *)av);
167 adns_rr_srvha *rr = a->rrs.srvha + i; 182 adns_rr_srvha *rr = a->rrs.srvha + i;
168 183
169 av_push (av, newSViv (rr->priority)); 184 av_push (av, newSViv (rr->priority));
170 av_push (av, newSViv (rr->weight)); 185 av_push (av, newSViv (rr->weight));
171 av_push (av, newSViv (rr->port)); 186 av_push (av, newSViv (rr->port));
172 av_push (av, ha2sv (&rr->ha)); 187 av_push (av, ha2sv (&rr->ha));
188
189 sv = newRV_noinc ((SV *)av);
173 } 190 }
174 break; 191 break;
175 192
176 case adns_r_unknown: 193 case adns_r_unknown:
177 sv = newSVpvn (a->rrs.byteblock [i].data, a->rrs.byteblock [i].len); 194 sv = newSVpvn (a->rrs.byteblock [i].data, a->rrs.byteblock [i].len);
198 215
199static struct pollfd *fds; 216static struct pollfd *fds;
200static int nfd, mfd; 217static int nfd, mfd;
201static ev_io *iow; 218static ev_io *iow;
202static ev_timer tw; 219static ev_timer tw;
220static ev_idle iw;
203static ev_prepare prepare_ev; 221static ev_prepare prepare_ev;
204static struct timeval tv_now; 222static struct timeval tv_now;
205 223
206static void 224static void
207update_now (EV_P) 225update_now (EV_P)
208{ 226{
209 ev_tstamp t = ev_now (); 227 ev_tstamp t = ev_now ();
210 228
211 tv_now.tv_sec = (long)t; 229 tv_now.tv_sec = (long)t;
212 tv_now.tv_usec = (long)((t - (ev_tstamp)tv_now.tv_sec) * 1e-6); 230 tv_now.tv_usec = (long)((t - (ev_tstamp)tv_now.tv_sec) * 1e-6);
231}
232
233static void
234idle_cb (EV_P_ ev_idle *w, int revents)
235{
236 ev_idle_stop (EV_A_ w);
213} 237}
214 238
215static void 239static void
216timer_cb (EV_P_ ev_timer *w, int revents) 240timer_cb (EV_P_ ev_timer *w, int revents)
217{ 241{
237 { 261 {
238 ev_ref (); 262 ev_ref ();
239 ev_timer_stop (EV_A_ &tw); 263 ev_timer_stop (EV_A_ &tw);
240 } 264 }
241 265
266 if (ev_is_active (&iw))
267 ev_idle_stop (EV_A_ &iw);
268
242 for (i = 0; i < nfd; ++i) 269 for (i = 0; i < nfd; ++i)
243 { 270 {
244 ev_ref (); 271 ev_ref ();
245 ev_io_stop (EV_A_ iow + i); 272 ev_io_stop (EV_A_ iow + i);
246 } 273 }
253 280
254 while (adns_beforepoll (ads, fds, &nfd, &timeout, &tv_now)) 281 while (adns_beforepoll (ads, fds, &nfd, &timeout, &tv_now))
255 { 282 {
256 mfd = nfd; 283 mfd = nfd;
257 284
285 free (iow); iow = malloc (mfd * sizeof (ev_io));
258 free (iow); iow = malloc (mfd * sizeof (struct pollfd)); 286 free (fds); fds = malloc (mfd * sizeof (struct pollfd));
259 free (fds); fds = malloc (mfd * sizeof (ev_io));
260 } 287 }
261 288
262 ev_timer_set (&tw, timeout * 1e-3, 0.); 289 ev_timer_set (&tw, timeout * 1e-3, 0.);
263 ev_timer_start (EV_A_ &tw); 290 ev_timer_start (EV_A_ &tw);
264 ev_unref (); 291 ev_unref ();
369 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 396 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
370 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 397 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
371 398
372 I_EV_API ("EV::ADNS"); 399 I_EV_API ("EV::ADNS");
373 400
374 ev_prepare_init (&prepare_ev, prepare_cb); ev_prepare_start (EV_DEFAULT_ &prepare_ev); 401 ev_prepare_init (&prepare_ev, prepare_cb);
402 ev_prepare_start (EV_DEFAULT_ &prepare_ev);
375 ev_unref (); 403 ev_unref ();
376 404
405 ev_init (&iw, idle_cb);
377 ev_init (&tw, timer_cb); 406 ev_init (&tw, timer_cb);
378 407
379 adns_init (&ads, adns_if_noenv | adns_if_noerrprint | adns_if_noserverwarn | adns_if_noautosys, 0); 408 adns_init (&ads, adns_if_noenv | adns_if_noerrprint | adns_if_noserverwarn | adns_if_noautosys, 0);
380} 409}
381 410
399 SvCUR_set (csv, sizeof (struct ctx)); 428 SvCUR_set (csv, sizeof (struct ctx));
400 429
401 c->self = csv; 430 c->self = csv;
402 c->cb = newSVsv (cb); 431 c->cb = newSVsv (cb);
403 432
433 if (!ev_is_active (&iw))
434 ev_idle_start (EV_A_ &iw);
435
404 if (GIMME_V != G_VOID) 436 if (GIMME_V != G_VOID)
405 { 437 {
406 csv = sv_2mortal (newRV_inc (csv)); 438 csv = sv_2mortal (newRV_inc (csv));
407 sv_bless (csv, stash); 439 sv_bless (csv, stash);
408 XPUSHs (csv); 440 XPUSHs (csv);
415 cancel = 1 447 cancel = 1
416 CODE: 448 CODE:
417{ 449{
418 struct ctx *c; 450 struct ctx *c;
419 451
420 printf ("destroy\n");
421 if (!(SvROK (req) && SvOBJECT (SvRV (req)) 452 if (!(SvROK (req) && SvOBJECT (SvRV (req))
422 && (SvSTASH (SvRV (req)) == stash))) 453 && (SvSTASH (SvRV (req)) == stash)))
423 croak ("object is not of type EV::ADNS"); 454 croak ("object is not of type EV::ADNS");
424 455
425 c = (struct ctx *)SvPVX (SvRV (req)); 456 c = (struct ctx *)SvPVX (SvRV (req));
429 ev_unref (); 460 ev_unref ();
430 SvREFCNT_dec (c->cb); 461 SvREFCNT_dec (c->cb);
431 c->cb = 0; 462 c->cb = 0;
432 adns_cancel (c->query); 463 adns_cancel (c->query);
433 SvREFCNT_dec (c->self); 464 SvREFCNT_dec (c->self);
434 printf ("refrefcl2\n");
435 } 465 }
436} 466}
437 467
438 468
439 469

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines