diff --git a/SOPE/GDLContentStore/ChangeLog b/SOPE/GDLContentStore/ChangeLog index 7c787ff69..2aa397409 100644 --- a/SOPE/GDLContentStore/ChangeLog +++ b/SOPE/GDLContentStore/ChangeLog @@ -6,6 +6,8 @@ valid. This fixes a crash because the channel, already autoreleased, would be later released again by the caller (through releaseChannel:). + ([GCSChannelManager -releaseChannel:_channel]): ensure the channel + is closed if we need to release it. 2009-03-17 Wolfgang Sourdeau diff --git a/SOPE/GDLContentStore/GCSChannelManager.m b/SOPE/GDLContentStore/GCSChannelManager.m index 1c51def65..ea5a8e7a9 100644 --- a/SOPE/GDLContentStore/GCSChannelManager.m +++ b/SOPE/GDLContentStore/GCSChannelManager.m @@ -379,6 +379,7 @@ static NSTimeInterval ChannelCollectionTimer = 5 * 60; - (void) releaseChannel: (EOAdaptorChannel *) _channel { GCSChannelHandle *handle; + BOOL keepOpen; #if defined(THREADSAFE) [channelLock lock]; @@ -391,8 +392,10 @@ static NSTimeInterval ChannelCollectionTimer = 5 * 60; ASSIGN (handle->lastReleaseTime, [NSCalendarDate date]); [busyChannels removeObject: handle]; + keepOpen = NO; if ([_channel isOpen] && [handle age] < ChannelExpireAge) { + keepOpen = YES; // TODO: consider age [availableChannels addObject: handle]; if (debugPools) @@ -404,9 +407,13 @@ static NSTimeInterval ChannelCollectionTimer = 5 * 60; _channel]; } else if (debugPools) - [self logWithFormat: - @"DBPOOL: freeing old channel (age %ds, %p) ", (int) - [handle age], _channel]; + { + [self logWithFormat: + @"DBPOOL: freeing old channel (age %ds, %p) ", (int) + [handle age], _channel]; + } + if (!keepOpen && [_channel isOpen]) + [_channel closeChannel]; [handle release]; } else