From 58d0b04fdf3d96c606181bed7b42466928804cd3 Mon Sep 17 00:00:00 2001 From: "Stephen R. van den Berg" <srb@cuci.nl> Date: Fri, 1 Apr 2016 03:26:08 +0200 Subject: [PATCH] pgsql: Ensure queries have been fully started before closing the fd. --- lib/modules/Sql.pmod/pgsql.pike | 10 +++++----- lib/modules/Sql.pmod/pgsql_util.pmod | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/modules/Sql.pmod/pgsql.pike b/lib/modules/Sql.pmod/pgsql.pike index e4ee797793..3661637f89 100644 --- a/lib/modules/Sql.pmod/pgsql.pike +++ b/lib/modules/Sql.pmod/pgsql.pike @@ -63,7 +63,7 @@ final int _fetchlimit=FETCHLIMIT; final Thread.Mutex _unnamedportalmux; -private Thread.Mutex unnamedstatement,termthread; +private Thread.Mutex unnamedstatement; private Thread.MutexKey termlock; final int _portalsinflight; @@ -1201,9 +1201,9 @@ private void procmessage() { /*semi*/final void close() { if(qportals && qportals->size()) catch(cancelquery()); - termlock=(termthread=Thread.Mutex())->lock(); + termlock=unnamedstatement->lock(1); c->close(); - termthread->lock(1); + unnamedstatement->lock(1); destruct(c);destruct(waitforauthready); } @@ -1258,9 +1258,9 @@ private int reconnect() { #ifdef PG_STATS prepstmtused=0; #endif - termlock=(termthread=Thread.Mutex())->lock(); + termlock=unnamedstatement->lock(1); c->close(); - termthread->lock(1); + unnamedstatement->lock(1); destruct(c); PD("Flushing old cache\n"); foreach(_prepareds;;mapping tp) diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod index b554a60946..944c81a3dd 100644 --- a/lib/modules/Sql.pmod/pgsql_util.pmod +++ b/lib/modules/Sql.pmod/pgsql_util.pmod @@ -356,12 +356,12 @@ outer: protected void destroy() { if(nostash) { catch { + while(sizeof(closecallbacks)) + foreach(closecallbacks;function(void|mixed:void) closecb;) + closecb(); destruct(nostash); PD("%d>Close socket\n",socket->query_fd()); socket->close(); - foreach(closecallbacks;function(void|mixed:void) closecb;) - closecb(); - closecallbacks=(<>); }; } connectfail=0; @@ -515,7 +515,6 @@ class sql_result { _ddescribe=Thread.Condition(); _ddescribemux=Thread.Mutex(); closemux=Thread.Mutex(); - c->closecallbacks+=(<destroy>); portalbuffersize=_portalbuffersize; alltext = !alltyped; _params = params; @@ -523,6 +522,7 @@ class sql_result { _state = PORTALINIT; timeout = _timeout; gottimeout = _pgsqlsess->cancelquery; + c->closecallbacks+=(<destroy>); } //! Returns the command-complete status for this query. -- GitLab