Branch: Tag:

2016-02-25

2016-02-25 12:12:21 by Stephen R. van den Berg <srb@cuci.nl>

pgsql: Delay close always to avoid thread races in destructed objects.

340:       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"); +  PD("%d>Delayed close, flush write\n",socket->query_fd());    i->read_cb(socket->query_id(),0);    return ret;    } -  lock=0; -  } +     destruct(nostash);    PD("%d>Close socket\n",socket->query_fd());    ret=socket->close();
363:    }       protected void destroy() { -  termlock=termthread->lock(); +     catch(close()); // Exceptions don't work inside destructors    connectfail=0;    termthread->lock(1);