]> granicus.if.org Git - postgresql/commitdiff
Apply ljb's patch to prevent both memory leak and core dump during
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 1 Feb 2003 00:07:03 +0000 (00:07 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 1 Feb 2003 00:07:03 +0000 (00:07 +0000)
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

index ecf1e362e80e0e7660da17ff988f83b53f4a6a88..7ab1b9e24dc41316adc825dc8feef7a2a565b47a 100644 (file)
@@ -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
 
        /*