Fix free-slot search in PgSetResultId so it actually works.

This commit is contained in:
Tom Lane 2002-10-17 14:53:32 +00:00
parent e313eb8098
commit 3e4978b72b

View File

@ -13,7 +13,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclId.c,v 1.36 2002/09/23 01:43:23 momjian Exp $ * $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclId.c,v 1.37 2002/10/17 14:53:32 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -340,30 +340,34 @@ PgSetResultId(Tcl_Interp *interp, char *connid_c, PGresult *res)
return TCL_ERROR; return TCL_ERROR;
connid = (Pg_ConnectionId *) Tcl_GetChannelInstanceData(conn_chan); connid = (Pg_ConnectionId *) Tcl_GetChannelInstanceData(conn_chan);
for (resid = connid->res_last + 1; resid != connid->res_last; resid++) /* search, starting at slot after the last one used */
resid = connid->res_last;
for (;;)
{ {
if (resid == connid->res_max) /* advance, with wraparound */
{ if (++resid >= connid->res_max)
resid = 0; resid = 0;
break; /* this slot empty? */
}
if (!connid->results[resid]) if (!connid->results[resid])
{ {
connid->res_last = resid; connid->res_last = resid;
break; break; /* success exit */
} }
/* checked all slots? */
if (resid == connid->res_last)
break; /* failure exit */
} }
if (connid->results[resid]) if (connid->results[resid])
{ {
if (connid->res_max == connid->res_hardmax) /* no free slot found, so try to enlarge array */
if (connid->res_max >= connid->res_hardmax)
{ {
Tcl_SetResult(interp, "hard limit on result handles reached", Tcl_SetResult(interp, "hard limit on result handles reached",
TCL_STATIC); TCL_STATIC);
return TCL_ERROR; return TCL_ERROR;
} }
connid->res_last = connid->res_max; connid->res_last = resid = connid->res_max;
resid = connid->res_max;
connid->res_max *= 2; connid->res_max *= 2;
if (connid->res_max > connid->res_hardmax) if (connid->res_max > connid->res_hardmax)
connid->res_max = connid->res_hardmax; connid->res_max = connid->res_hardmax;