From 366e6d30a8ad9d29ecd4c2542fc5b19d91bf2fff 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:39:05 +0200
Subject: [PATCH] The async_client should now be thread-safe.

Rev: lib/modules/Protocols.pmod/DNS.pmod:1.17
---
 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 dbca38c7e4..57338ac33e 100644
--- a/lib/modules/Protocols.pmod/DNS.pmod
+++ b/lib/modules/Protocols.pmod/DNS.pmod
@@ -465,6 +465,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;
@@ -507,18 +511,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