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