Your test case doesn't build, but I've attached a trivially tweaked one that does. Valgrind's report (valgrind --leak-check=full ./test) on my Ubuntu 9.04 machine with Pg 8.3.7 is: ==23382== 156 (36 direct, 120 indirect) bytes in 1 blocks are definitely lost in loss record 1 of 4 ==23382== at 0x4026FDE: malloc (vg_replace_malloc.c:207) ==23382== by 0x4211548: nss_parse_service_list (nsswitch.c:547) ==23382== by 0x4211E25: __nss_database_lookup (nsswitch.c:134) ==23382== by 0x4B61F5B: ??? ==23382== by 0x4B6400C: ??? ==23382== by 0x41B7A51: getpwuid_r@@GLIBC_2.1.2 (getXXbyYY_r.c:253) ==23382== by 0x42A87DD: (within /usr/lib/libpq.so.5.1) ==23382== by 0x4292955: (within /usr/lib/libpq.so.5.1) ==23382== by 0x429749E: (within /usr/lib/libpq.so.5.1) ==23382== by 0x4297528: (within /usr/lib/libpq.so.5.1) ==23382== by 0x4297E24: PQsetdbLogin (in /usr/lib/libpq.so.5.1) ==23382== by 0x4053563: ECPGconnect (in /usr/lib/libecpg.so.6.0) ==23382== ==23382== LEAK SUMMARY: ==23382== definitely lost: 36 bytes in 1 blocks. ==23382== indirectly lost: 120 bytes in 10 blocks. ==23382== possibly lost: 0 bytes in 0 blocks. ==23382== still reachable: 220 bytes in 1 blocks. ==23382== suppressed: 0 bytes in 0 blocks. If you're seeing the same output, then the issue you're running into is libnss caching NSS services list ( /etc/services, plus LDAP/NIS services etc) when it's first used. This memory is "leaked" in the sense that it's not free()d when the program exits, but that doesn't matter _at_ _all_. When the program exits, the OS cleans up its allocations anyway, so the free() would only be wasting CPU doing work that's about to be thrown away and slowing down the program's exit in the process. It'd also open up all sorts of exciting issues if another atexit hook tried to use NSS... This "leak" should be added to your valgrind suppressions file and ignored. You can re-run valgrind with: valgrind --leak-check=full --gen-suppressions=all ./test to generate a suppressions file, but you'll usually want to edit it to make it a bit less specific. For example, this suppressions entry should do the trick: { libnss_service_cache Memcheck:Leak fun:malloc fun:nss_parse_service_list fun:__nss_database_lookup } If I re-run valgrind with the suppressions entry (in the file "ecpg_suppressions") valgrind --leak-check=full --suppressions=ecpg_suppressions ./test I get no reported leaks. Valgrind is a great tool, but you must learn how to identify false positives and tell the difference between a leak that matters (say 1kb allocated and not freed in a loop that runs once per second) and a leak that doesn't. -- Craig Ringer
all: test test.c: test.pgc ecpg $< test: test.c gcc -g3 -o test test.c -I /usr/include/postgresql/ -lecpg clean: rm test.c test
int OpenDataBase(void) { int i_ret = 0; EXEC SQL CONNECT TO test_db; if(sqlca.sqlcode == 0){ i_ret = 1; } return i_ret; } int CloseDataBase(void) { int i_ret = !0; EXEC SQL disconnect all; if(sqlca.sqlcode == 0){ i_ret = 0; } return i_ret; } int main() { OpenDataBase(); CloseDataBase(); }
-- Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general