diff --git a/lib/modules/Sql.pmod/pgsql.pike b/lib/modules/Sql.pmod/pgsql.pike index 4c997e1abd8a6f9adf921c45e4b996f96e2c5430..adbc103aeb3495066d240d7364e51aa6fb72b810 100644 --- a/lib/modules/Sql.pmod/pgsql.pike +++ b/lib/modules/Sql.pmod/pgsql.pike @@ -612,17 +612,15 @@ final void _processloop(.pgsql_util.conxion ci) { plugbuffer->add_int8(0); PD("%O\n",(string)plugbuffer); if(catch(ci->start()->add_hstring(plugbuffer,4,4)->sendcmd(SENDOUT))) { -#ifdef PG_DEBUG - if(!_options) - PD("_options is zero, %O\n",this); -#endif - if(_options && _options.reconnect) // FIXME why can _options be 0? - _connectfail(); - else - destruct(waitforauthready); - } else // Do not flush at this point, PostgreSQL 9.4 disapproves - procmessage(); - } + if(this) // Only when not destructed yet + if(_options.reconnect) + _connectfail(); + else + destruct(waitforauthready); + return; + } + } // Do not flush at this point, PostgreSQL 9.4 disapproves + procmessage(); } private void procmessage() { @@ -1174,7 +1172,8 @@ private void procmessage() { break; } PD("Closing database processloop %O\n",err); - _delayederror=err; + if(this) + _delayederror=err; for(;objectp(portal);portal=qportals->read()) if(objectp(portal)) { #ifdef PG_DEBUG @@ -1184,9 +1183,9 @@ private void procmessage() { } if(!ci->close() && !terminating && _options.reconnect) _connectfail(); - else + else if(this) destruct(waitforauthready); - if(err && !stringp(err)) + if(this && err && !stringp(err)) throw(err); } diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod index 28faff9a064744fb42c55463359cdc2952bcbac9..19a1bb61c50226572ee127a01c585884cf947c57 100644 --- a/lib/modules/Sql.pmod/pgsql_util.pmod +++ b/lib/modules/Sql.pmod/pgsql_util.pmod @@ -207,8 +207,8 @@ class conxiin { final int read_cb(mixed id,mixed b) { PD("Read callback %O\n",(string)b); Thread.MutexKey lock=fillreadmux->lock(); - if(procmsg) - procmsg=0,lock=0,Thread.Thread(id()); + if(procmsg&&id) + procmsg=0,lock=0,Thread.Thread(id); else if(fillread) didreadcb=1, fillread.signal(); lock=0;