From fe85abf2fea9ad86340c68150f239973085ea307 Mon Sep 17 00:00:00 2001
From: "Stephen R. van den Berg" <srb@cuci.nl>
Date: Thu, 25 Feb 2016 12:43:49 +0100
Subject: [PATCH] pgsql: Delay close always to avoid thread races in destructed
 objects.

---
 lib/modules/Sql.pmod/pgsql_util.pmod | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod
index 79fa3a9209..9fe6b5b2fa 100644
--- a/lib/modules/Sql.pmod/pgsql_util.pmod
+++ b/lib/modules/Sql.pmod/pgsql_util.pmod
@@ -340,17 +340,17 @@ outer:
 
   final int close() {
     int ret;
-    { Thread.MutexKey lock=i->fillreadmux->lock();
+    if(!termlock && nostash)
+    { termlock=termthread->lock();
+      Thread.MutexKey lock=i->fillreadmux->lock();
       if(i->fillread) {	 // Delayed close() after flushing the output buffer
         i->fillread.signal();
         i->fillread=0;
-        lock=0;
-        PD("%d>Close socket read, flush write\n",socket->query_fd());
-        ret=socket->close("r");
-        i->read_cb(socket->query_id(),0);
-        return ret;
       }
       lock=0;
+      PD("%d>Delayed close, flush write\n",socket->query_fd());
+      i->read_cb(socket->query_id(),0);
+      return ret;
     }
     destruct(nostash);
     PD("%d>Close socket\n",socket->query_fd());
@@ -363,7 +363,6 @@ outer:
   }
 
   protected void destroy() {
-    termlock=termthread->lock();
     catch(close());		// Exceptions don't work inside destructors
     connectfail=0;
     termthread->lock(1);
-- 
GitLab