pike.git/
lib/
modules/
Protocols.pmod/
DNS.pmod
Branch:
Tag:
Non-build tags
All tags
No tags
1998-07-18
1998-07-18 02:05:47 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>
75c66dbae5a6420eb1b445a6f009f49005583091 (
88
lines) (+
25
/-
63
)
[
Show
|
Annotate
]
Branch:
7.9
optimized
Rev: lib/modules/Protocols.pmod/DNS.pmod:1.23
477:
{ inherit client; inherit spider.dumUDP : udp;
-
int id;
+
async_client next_client;
-
#if constant(thread_create)
-
static private inherit Thread.Mutex : lock;
-
#endif /* constant(thread_create) */
-
+
class Request { string req;
526:
function(string,mapping,mixed...:void) callback, mixed ... args) {
-
int lid;
-
#if constant(thread_create)
-
object key=lock::lock();
-
#endif /* constant(thread_create) */
-
for(int e=next_client ? 5 :
1024
;e>=0;e--)
+
for(int e=next_client ? 5 :
256
;e>=0;e--)
{
-
id++;
-
id&
=
65535;
-
lid=id
;
-
-
if(requests[lid])
+
int
lid
=
random(65536)
;
+
if(!catch
{
requests[lid]
++; }
)
{
-
if(time() - requests[lid]->timestamp > GIVE_UP_DELAY)
-
{
-
#if constant(thread_create)
-
// We need to unlock the lock for the remove operation...
-
destruct(key);
-
#endif /* constant(thread_create) */
-
remove(requests[lid]);
-
#if constant(thread_create)
-
key=lock::lock();
-
#endif /* constant(thread_create) */
-
if(requests[lid]) continue; /* Another thread has stolen lid */
-
}else{
-
continue;
-
}
-
}
-
break;
-
}
-
-
if(requests[lid])
-
{
-
/* We failed miserably to find a request id to use,
-
* so we create a second UDP port to be able to have more
-
* requests 'in the air'. /Hubbe
-
*/
-
if(!next_client)
-
{
-
next_client=async_client(nameservers,domains);
-
next_client->nameservers=nameservers;
-
next_client->domains=domains;
-
}
-
-
#if constant(thread_create)
-
key=0;
-
#endif /* constant(thread_create) */
-
-
next_client->do_query(domain, cl, type, callback, @args);
-
return;
-
}
-
+
string req=low_mkquery(lid,domain,cl,type); object r=Request();
588:
requests[lid]=r; udp::send(nameservers[0],53,r->req); call_out(retry,RETRY_DELAY,r,1);
+
return;
}
-
+
}
-
+
/* We failed miserably to find a request id to use,
+
* so we create a second UDP port to be able to have more
+
* requests 'in the air'. /Hubbe
+
*/
+
if(!next_client)
+
next_client=async_client(nameservers,domains);
+
+
next_client->do_query(domain, cl, type, callback, @args);
+
}
+
static private void rec_data() { mixed err;