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