// (C) 2003 Ximian, Inc (http://www.ximian.com)
//
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
using System;
using System.Collections;
-using System.Configuration;
using System.Net.Configuration;
using System.Net.Sockets;
ServicePoint sPoint;
string name;
ArrayList connections;
- static ConnectionManagementData manager;
- const string configKey = "system.net/connectionManagement";
- int maxConnections;
Random rnd;
-
- static WebConnectionGroup ()
- {
- manager = (ConnectionManagementData) ConfigurationSettings.GetConfig (configKey);
- }
+ Queue queue;
public WebConnectionGroup (ServicePoint sPoint, string name)
{
this.sPoint = sPoint;
this.name = name;
connections = new ArrayList (1);
- maxConnections = (int) manager.GetMaxConnections (sPoint.Address.Host);
+ queue = new Queue ();
}
- public WebConnection GetConnection (string name)
+ public WebConnection GetConnection ()
{
WebConnection cnc = null;
lock (connections) {
WeakReference cncRef;
int count = connections.Count;
- if (maxConnections > count) {
+ for (int i = 0; i < count; i++) {
+ WeakReference wr = connections [i] as WeakReference;
+ cnc = wr.Target as WebConnection;
+ if (cnc == null) {
+ connections.RemoveAt (i);
+ count--;
+ i--;
+ continue;
+ }
+
+ if (cnc.Busy)
+ continue;
+
+ return cnc;
+ }
+
+ if (sPoint.ConnectionLimit > count) {
cnc = new WebConnection (this, sPoint);
connections.Add (new WeakReference (cnc));
return cnc;
if (rnd == null)
rnd = new Random ();
- foreach (WeakReference wr in connections) {
- cnc = wr.Target as WebConnection;
- if (cnc.Busy)
- continue;
-
- return cnc;
- }
-
int idx = (count > 1) ? rnd.Next (0, count - 1) : 0;
cncRef = (WeakReference) connections [idx];
cnc = cncRef.Target as WebConnection;
public string Name {
get { return name; }
}
+
+ internal Queue Queue {
+ get { return queue; }
+ }
}
}