44c44 < /// A queue with an extra Int32 for keeping track of busy connections. --- > /// Keeps track of available and busy connections. 46c46 < private class ConnectorQueue : Queue --- > private class ConnectorQueue 49,50c49 < /// The number of pooled Connectors that belong to this queue but < /// are currently in use. --- > /// Connections available to the end user 52c51,56 < public Int32 UseCount = 0; --- > public Queue Available = new Queue(); > > /// > /// Connections currently in use > /// > public HashSet Busy = new HashSet(); 85c89 < if (Queue.Count > 0) --- > if (Queue.Available.Count > 0) 87c91 < if (Queue.Count + Queue.UseCount > Queue.MinPoolSize) --- > if (Queue.Available.Count + Queue.Busy.Count > Queue.MinPoolSize) 91c95 < Int32 diff = Queue.Count + Queue.UseCount - Queue.MinPoolSize; --- > Int32 diff = Queue.Available.Count + Queue.Busy.Count - Queue.MinPoolSize; 93c97 < toBeClosed = Math.Min(toBeClosed, Queue.Count); --- > toBeClosed = Math.Min(toBeClosed, Queue.Available.Count); 102c106 < Connector = Queue.Dequeue(); --- > Connector = Queue.Available.Dequeue(); 341,348c345 < // Fix queue use count. Use count may be dropped below zero if Queue was cleared and there were connections open. < if (Queue.UseCount < 0) < { < Queue.UseCount = 0; < } < < < if (Queue.Count > 0) --- > if (Queue.Available.Count > 0) 354c351 < Connector = Queue.Dequeue(); --- > Connector = Queue.Available.Dequeue(); 398c395 < Queue.UseCount++; --- > Queue.Busy.Add(Connector); 400c397 < else if (Queue.Count + Queue.UseCount < Connection.MaxPoolSize) --- > else if (Queue.Available.Count + Queue.Busy.Count < Connection.MaxPoolSize) 427c424 < Queue.UseCount++; --- > Queue.Busy.Add(Connector); 433c430 < while (Queue.Count + Queue.UseCount < Connection.MinPoolSize) --- > while (Queue.Available.Count + Queue.Busy.Count < Connection.MinPoolSize) 449c446 < Queue.Enqueue(Spare); --- > Queue.Available.Enqueue(Spare); 491c488 < Queue.UseCount--; --- > Queue.Busy.Remove(Connection.Connector); 526a524 > Connector.Close(); // Release connection to postgres 535c533,534 < Queue.UseCount--; --- > bool InQueue = Queue.Busy.Contains(Connector); > Queue.Busy.Remove(Connector); 567c566,569 < Queue.Enqueue(Connector); --- > if (InQueue) > Queue.Available.Enqueue(Connector); > else > Connector.Close(); 589c591 < while (Queue.Count > 0) --- > while (Queue.Available.Count > 0) 591c593 < NpgsqlConnector connector = Queue.Dequeue(); --- > NpgsqlConnector connector = Queue.Available.Dequeue(); 601a604,606 > > // Only connections in busy list will be re-added to pool; connections currently in use should be closed > Queue.Busy.Clear();