From e302b66745a3fb41c343573d160da5e8b16b937e Mon Sep 17 00:00:00 2001 From: "Stephen R. van den Berg" <srb@cuci.nl> Date: Fri, 14 Nov 2014 16:23:05 +0100 Subject: [PATCH] pgsql: Release all locks early upon error. --- lib/modules/Sql.pmod/pgsql_util.pmod | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod index 5b02577c08..9ca7a5f176 100644 --- a/lib/modules/Sql.pmod/pgsql_util.pmod +++ b/lib/modules/Sql.pmod/pgsql_util.pmod @@ -743,7 +743,7 @@ class pgsql_result { } final void _purgeportal() { - _unnamedportalkey=0; + _unnamedportalkey=_unnamedstatementkey=0; Thread.MutexKey lock=closemux->lock(); _fetchlimit=0; // disables further Executes switch(_state) { @@ -754,6 +754,7 @@ class pgsql_result { } _state=closed; lock=0; + releaseconditions(); } final sctype _closeportal(PGplugbuffer plugbuffer) { @@ -768,6 +769,7 @@ class pgsql_result { */ switch(_state) { case portalinit: + _unnamedstatementkey=0; _state=closed; break; case copyinprogress: @@ -818,12 +820,8 @@ class pgsql_result { } } - final void _releasesession() { - _inflight=0; - _datarows->write(1); // Signal EOF - PGassist plugbuffer=c->start(1); - plugbuffer->sendcmd(_closeportal(plugbuffer)); - pgsqlsess=UNDEFINED; + private void releaseconditions() { + pgsqlsess=0; Thread.MutexKey lock; if(prepbuffermux) { Thread.MutexKey lock=prepbuffermux->lock(); @@ -832,10 +830,19 @@ class pgsql_result { if(!_datarowdesc) { lock=_ddescribemux->lock(); _ddescribe->broadcast(); + _datarowdesc=({}); } lock=0; } + final void _releasesession() { + _inflight=0; + _datarows->write(1); // Signal EOF + PGassist plugbuffer=c->start(1); + plugbuffer->sendcmd(_closeportal(plugbuffer)); + releaseconditions(); + } + protected void destroy() { catch { // inside destructors, exceptions don't work _releasesession(); -- GitLab