On 20-2-2007 4:42 Tom Lane wrote:
"Arjen van der Meijden" <[EMAIL PROTECTED]> writes:
I'm not sure whether this is a php-issue or a postgresql-client-api one, but
when connecting gdb to that process and doing a 'bt' it displays:
#0 0xa7c36d9f in free () from /lib/tls/libc.so.6
#1 0xa7c38c4f in malloc () from /lib/tls/libc.so.6
#2 0xa7f58bdb in PQmakeEmptyPGresult () from /usr/lib/libpq.so.5
#3 0xa7f59941 in PQgetResult () from /usr/lib/libpq.so.5
#4 0x08086fd0 in _close_pgsql_link (rsrc=0x81e42bc) at
/usr/src/php-4.4.2/ext/pgsql/pgsql.c:276
Given that stack trace, you'd better complain to the PHP folk. There is
no loop in that path in libpq, so the looping must be occurring
somewhere in the PHP code.
I had a look at that _close_pgsql_link-function and this it the code:
static void _close_pgsql_link(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
PGconn *link = (PGconn *)rsrc->ptr;
PGresult *res;
while ((res = PQgetResult(link))) {
PQclear(res);
}
PQfinish(link);
PGG(num_links)--;
}
So there is indeed a very clear loop. But I'm not sure whether this code
is incorrect as a generic "close the connection cleanly without memory
leaks"-function? If I duplicate that while-loop to my c-test code it
indeed keeps getting a non-null/false result from PQgetResult and thus
will loop indefinitely.
Do you know a clean example that displays how to close a link cleanly,
including this COPY-situation? Or can you indicate which commands should
be added to do so? My knowledge of the C-api is very limited, so I don't
know what's wrong here.
Best regards,
Arjen
---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?
http://archives.postgresql.org