aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2003-02-01 00:07:03 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2003-02-01 00:07:03 +0000
commit032235cafebdedcbf30c45e3944af2da8a6edc4d (patch)
treec0b1eb69cd5f182ce19aa2ac3902c09e28e25919 /src
parentf51c7ca18257e497768a733591c7faf66c83980b (diff)
downloadpostgresql-032235cafebdedcbf30c45e3944af2da8a6edc4d.tar.gz
postgresql-032235cafebdedcbf30c45e3944af2da8a6edc4d.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/libpgtcl/pgtclId.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/interfaces/libpgtcl/pgtclId.c b/src/interfaces/libpgtcl/pgtclId.c
index ecf1e362e80..7ab1b9e24dc 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,18 +295,20 @@ 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
/*
* We must use Tcl_EventuallyFree because we don't want the connid