Imported Upstream version 4.3.2.467

Former-commit-id: 9c2cb47f45fa221e661ab616387c9cda183f283d
This commit is contained in:
Xamarin Public Jenkins
2016-02-22 11:00:01 -05:00
parent f302175246
commit f3e3aab35a
4097 changed files with 122406 additions and 82300 deletions

View File

@@ -48,24 +48,29 @@ namespace System.ServiceModel.Channels.Http
Entries = new List<HttpChannelListenerEntry> ();
}
public List<HttpChannelListenerEntry> Entries { get; private set; }
protected List<HttpChannelListenerEntry> Entries { get; private set; }
object entries_lock = new object ();
public abstract void RegisterListener (ChannelDispatcher channel, HttpTransportBindingElement element, TimeSpan timeout);
public abstract void UnregisterListener (ChannelDispatcher channel, TimeSpan timeout);
protected void RegisterListenerCommon (ChannelDispatcher channel, TimeSpan timeout)
{
Entries.Add (new HttpChannelListenerEntry (channel, new AutoResetEvent (false)));
lock (entries_lock) {
Entries.Add (new HttpChannelListenerEntry (channel, new AutoResetEvent (false)));
Entries.Sort (HttpChannelListenerEntry.CompareEntries);
Entries.Sort (HttpChannelListenerEntry.CompareEntries);
}
}
protected void UnregisterListenerCommon (ChannelDispatcher channel, TimeSpan timeout)
{
var entry = Entries.First (e => e.ChannelDispatcher == channel);
Entries.Remove (entry);
lock (entries_lock) {
var entry = Entries.First (e => e.ChannelDispatcher == channel);
Entries.Remove (entry);
entry.WaitHandle.Set (); // make sure to finish pending requests.
entry.WaitHandle.Set (); // make sure to finish pending requests.
}
}
public void ProcessNewContext (HttpContextInfo ctxi)
@@ -79,9 +84,11 @@ namespace System.ServiceModel.Channels.Http
HttpChannelListenerEntry SelectChannel (HttpContextInfo ctx)
{
foreach (var e in Entries)
if (e.FilterHttpContext (ctx))
return e;
lock (entries_lock) {
foreach (var e in Entries)
if (e.FilterHttpContext (ctx))
return e;
}
return null;
}
@@ -90,7 +97,10 @@ namespace System.ServiceModel.Channels.Http
DateTime start = DateTime.Now;
context = null;
var ce = Entries.FirstOrDefault (e => e.ChannelDispatcher == channel);
HttpChannelListenerEntry ce = null;
lock (entries_lock) {
ce = Entries.FirstOrDefault (e => e.ChannelDispatcher == channel);
}
if (ce == null)
return false;
lock (ce.RetrieverLock) {

View File

@@ -92,8 +92,8 @@ namespace System.ServiceModel.Channels.Http
AbortConnections (timeout);
// FIXME: this wait is sort of hack (because it should not be required), but without it some tests are blocked.
// This hack even had better be moved to base.CancelAsync().
if (CurrentAsyncResult != null)
CurrentAsyncResult.AsyncWaitHandle.WaitOne (TimeSpan.FromMilliseconds (300));
// if (CurrentAsyncResult != null)
// CurrentAsyncResult.AsyncWaitHandle.WaitOne (TimeSpan.FromMilliseconds (300));
return base.CancelAsync (timeout);
}
@@ -104,12 +104,15 @@ namespace System.ServiceModel.Channels.Http
}
bool close_started;
object close_lock = new object ();
protected override void OnClose (TimeSpan timeout)
{
if (close_started)
return;
close_started = true;
lock (close_lock) {
if (close_started)
return;
close_started = true;
}
DateTime start = DateTime.Now;
// FIXME: consider timeout