pike.git / lib / modules / Sql.pmod / pgsql_util.pmod

version» Context lines:

pike.git/lib/modules/Sql.pmod/pgsql_util.pmod:542:    //! @seealso    //! @[Sql.sql_result()->fetch_fields()]    array(mapping(string:mixed)) fetch_fields() {    if(!_datarowdesc)    waitfordescribe();    trydelayederror();    return _datarowdesc+({});    }       final void _setrowdesc(array(mapping(string:mixed)) datarowdesc) { -  _datarowdesc=datarowdesc; +     Thread.MutexKey lock=_ddescribemux->lock(); -  +  _datarowdesc=datarowdesc;    _ddescribe->broadcast();    lock=0;    }       final void _preparebind(array dtoid) {    array(string|int) paramValues=_params?_params[2]:({});    if(sizeof(dtoid)!=sizeof(paramValues))    SUSERERROR("Invalid number of bindings, expected %d, got %d\n",    sizeof(dtoid),sizeof(paramValues));   #ifdef PG_DEBUGMORE
pike.git/lib/modules/Sql.pmod/pgsql_util.pmod:677:    break;    case OIDOID:    case INT4OID:    plugbuffer->add_int32(4)->add_int32((int)value);    break;    case INT2OID:    plugbuffer->add_int32(2)->add_int16((int)value);    break;    }    } -  prepbuffer=plugbuffer; -  int skipsignal=0; +     if(_tprepared)    if(_tprepared.datarowdesc) -  skipsignal=1, gotdatarowdesc(); +  prepbuffer=plugbuffer, gotdatarowdesc();    else if(dontcacheprefix->match(_query)) // Don't cache FETCH/COPY    m_delete(pgsqlsess->_prepareds,_query),_tprepared=0; -  if(!skipsignal) { -  Thread.MutexKey lock=prepbuffermux->lock(); +  Thread.MutexKey lock; +  if(!prepbuffer && !catch(lock=prepbuffermux->lock())) { +  prepbuffer=plugbuffer;    prepbufferready->signal();    lock=0;    }    }       final void _processrowdesc(array(mapping(string:mixed)) datarowdesc) {    _setrowdesc(datarowdesc);    mapping(string:mixed) tp=_tprepared; // FIXME Is caching this worthwhile?    if(!tp || !tp.datarowdesc)    Thread.Thread(gotdatarowdesc); // Do not use callout, it deadlocks    if(tp)    tp.datarowdesc=datarowdesc;    }       private void gotdatarowdesc() { -  if(!prepbuffer) { -  Thread.MutexKey lock=prepbuffermux->lock(); +  Thread.MutexKey lock; +  if(catch(lock=prepbuffermux->lock())) +  return; +  if(!prepbuffer)    prepbufferready->wait(lock); -  +  destruct(prepbuffermux);    lock=0;    if(_state==CLOSED)    return; -  prepbuffermux=0; -  } +     Stdio.Buffer plugbuffer=prepbuffer; -  prepbuffer=0; +  prepbuffer=0; // Free memory early    plugbuffer->add_int16(sizeof(_datarowdesc));    if(sizeof(_datarowdesc))    foreach(_datarowdesc;;mapping col)    plugbuffer->add_int16(oidformat(col.type));    else if(commitprefix->match(_query)) {    Thread.MutexKey lock=pgsqlsess->_commitmux->lock();    if(pgsqlsess->_portalsinflight) {    pgsqlsess->_waittocommit++;    PD("Commit waiting for portals to finish\n");    pgsqlsess->_readyforcommit->wait(lock);
pike.git/lib/modules/Sql.pmod/pgsql_util.pmod:835:       private void releaseconditions() {    pgsqlsess=0;    Thread.MutexKey lock;    if(prepbuffermux) {    Thread.MutexKey lock=prepbuffermux->lock();    prepbufferready->signal();    }    if(!_datarowdesc) {    lock=_ddescribemux->lock(); -  _ddescribe->broadcast(); +     _datarowdesc=({}); -  +  _ddescribe->broadcast();    }    lock=0;    }       final void _releasesession() {    _inflight=0;    _datarows->write(1); // Signal EOF    conxion plugbuffer=c->start(1);    plugbuffer->sendcmd(_closeportal(plugbuffer));    releaseconditions();