From 032235cafebdedcbf30c45e3944af2da8a6edc4d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 1 Feb 2003 00:07:03 +0000 Subject: [PATCH] Apply ljb's patch to prevent both memory leak and core dump during connection shutdown. This is a grotty workaround for a Tcl bug, but said bug has been there long enough that I'm not holding my breath for a real fix. Per discussions and testing from ljb and g.hintermayer. --- src/interfaces/libpgtcl/pgtclId.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/interfaces/libpgtcl/pgtclId.c b/src/interfaces/libpgtcl/pgtclId.c index ecf1e362e8..7ab1b9e24d 100644 --- a/src/interfaces/libpgtcl/pgtclId.c +++ b/src/interfaces/libpgtcl/pgtclId.c @@ -13,7 +13,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclId.c,v 1.38 2002/12/30 22:10:54 tgl Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclId.c,v 1.39 2003/02/01 00:07:03 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -295,17 +295,19 @@ PgDelConnectionId(DRIVER_DEL_PROTO) * the socket itself! * * XXX Unfortunately, while this works fine if we are closing due to - * explicit pg_disconnect, Tcl versions through 8.3.3 dump core if we - * try to do it during interpreter shutdown. Not clear why, or if - * there is a workaround. For now, accept leakage of the (fairly - * small) amount of memory taken for the channel state representation. - * Note we are not leaking a socket, since libpq closed that already. + * explicit pg_disconnect, all Tcl versions through 8.4.1 dump core + * if we try to do it during interpreter shutdown. Not clear why. + * For now, we kill the channel during pg_disconnect, but during interp + * shutdown we just accept leakage of the (fairly small) amount of memory + * taken for the channel state representation. + * (Note we are not leaking a socket, since libpq closed that already.) + * We tell the difference between pg_disconnect and interpreter shutdown + * by testing for interp != NULL, which is an undocumented but apparently + * safe way to tell. */ -#ifdef NOT_USED #if TCL_MAJOR_VERSION >= 8 - if (connid->notifier_channel != NULL) + if (connid->notifier_channel != NULL && interp != NULL) Tcl_UnregisterChannel(NULL, connid->notifier_channel); -#endif #endif /*