@ -14,7 +14,7 @@
*
*
*
*
* IDENTIFICATION
* IDENTIFICATION
* $ PostgreSQL : pgsql / src / backend / utils / resowner / resowner . c , v 1.10 2005 / 03 / 04 20 : 21 : 06 tgl Exp $
* $ PostgreSQL : pgsql / src / backend / utils / resowner / resowner . c , v 1.11 2005 / 03 / 25 18 : 30 : 27 tgl Exp $
*
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
*/
@ -87,6 +87,7 @@ static void ResourceOwnerReleaseInternal(ResourceOwner owner,
ResourceReleasePhase phase ,
ResourceReleasePhase phase ,
bool isCommit ,
bool isCommit ,
bool isTopLevel ) ;
bool isTopLevel ) ;
static void PrintRelCacheLeakWarning ( Relation rel ) ;
/*****************************************************************************
/*****************************************************************************
@ -231,9 +232,13 @@ ResourceOwnerReleaseInternal(ResourceOwner owner,
* iterate till there are none .
* iterate till there are none .
*/
*/
while ( owner - > nrelrefs > 0 )
while ( owner - > nrelrefs > 0 )
{
if ( isCommit )
PrintRelCacheLeakWarning ( owner - > relrefs [ owner - > nrelrefs - 1 ] ) ;
RelationClose ( owner - > relrefs [ owner - > nrelrefs - 1 ] ) ;
RelationClose ( owner - > relrefs [ owner - > nrelrefs - 1 ] ) ;
}
}
}
}
}
else if ( phase = = RESOURCE_RELEASE_LOCKS )
else if ( phase = = RESOURCE_RELEASE_LOCKS )
{
{
if ( isTopLevel )
if ( isTopLevel )
@ -284,10 +289,18 @@ ResourceOwnerReleaseInternal(ResourceOwner owner,
* to iterate till there are none . Ditto for catcache lists .
* to iterate till there are none . Ditto for catcache lists .
*/
*/
while ( owner - > ncatrefs > 0 )
while ( owner - > ncatrefs > 0 )
{
if ( isCommit )
PrintCatCacheLeakWarning ( owner - > catrefs [ owner - > ncatrefs - 1 ] ) ;
ReleaseCatCache ( owner - > catrefs [ owner - > ncatrefs - 1 ] ) ;
ReleaseCatCache ( owner - > catrefs [ owner - > ncatrefs - 1 ] ) ;
}
while ( owner - > ncatlistrefs > 0 )
while ( owner - > ncatlistrefs > 0 )
{
if ( isCommit )
PrintCatCacheListLeakWarning ( owner - > catlistrefs [ owner - > ncatlistrefs - 1 ] ) ;
ReleaseCatCacheList ( owner - > catlistrefs [ owner - > ncatlistrefs - 1 ] ) ;
ReleaseCatCacheList ( owner - > catlistrefs [ owner - > ncatlistrefs - 1 ] ) ;
}
}
}
/* Clean up index scans too */
/* Clean up index scans too */
ReleaseResources_gist ( ) ;
ReleaseResources_gist ( ) ;
ReleaseResources_hash ( ) ;
ReleaseResources_hash ( ) ;
@ -746,3 +759,13 @@ ResourceOwnerForgetRelationRef(ResourceOwner owner, Relation rel)
elog ( ERROR , " relcache reference %s is not owned by resource owner %s " ,
elog ( ERROR , " relcache reference %s is not owned by resource owner %s " ,
RelationGetRelationName ( rel ) , owner - > name ) ;
RelationGetRelationName ( rel ) , owner - > name ) ;
}
}
/*
* Debugging subroutine
*/
static void
PrintRelCacheLeakWarning ( Relation rel )
{
elog ( WARNING , " relcache reference leak: relation \" %s \" not closed " ,
RelationGetRelationName ( rel ) ) ;
}