From 32b7b507a9b12c3054c5b0d2acaee0b384b797e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?= <grubba@grubba.org> Date: Fri, 17 Jul 1998 20:42:01 +0200 Subject: [PATCH] The async_client should now be thread-safe. Rev: lib/modules/Protocols.pmod/DNS.pmod:1.12 --- lib/modules/Protocols.pmod/DNS.pmod | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/modules/Protocols.pmod/DNS.pmod b/lib/modules/Protocols.pmod/DNS.pmod index 6b44adff9e..ffa0b52f26 100644 --- a/lib/modules/Protocols.pmod/DNS.pmod +++ b/lib/modules/Protocols.pmod/DNS.pmod @@ -436,6 +436,10 @@ class async_client inherit spider.dumUDP : udp; int id; +#if constant(thread_create) + object lock = Thread.Mutex(); +#endif /* constant(thread_create) */ + class Request { string req; @@ -478,18 +482,28 @@ class async_client function(string,mapping,mixed...:void) callback, mixed ... args) { +#if constant(thread_create) + object key = lock->lock(); +#endif /* constant(thread_create) */ id++; id&=65535; - string req=low_mkquery(id,domain,cl,type); + int lid = id; + +#if constant(thread_create) + key = 0; +#endif /* constant(thread_create) */ - if(requests[id]) + if(requests[lid]) throw(({"Cannot find an empty request slot.\n",backtrace()})); + + string req=low_mkquery(lid,domain,cl,type); + object r=Request(); r->req=req; r->domain=domain; r->callback=callback; r->args=args; - requests[id]=r; + requests[lid]=r; udp::send(nameservers[0],53,r->req); call_out(retry,5,r,1); } -- GitLab