Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Köplinger <alex.koeplinger@outlook.com>2018-08-10 22:47:14 +0300
committerGitHub <noreply@github.com>2018-08-10 22:47:14 +0300
commit22c9616fe2d23d11d12b883cb39020a5495c0e16 (patch)
tree5c94d6adf8a7c6af48e0739374cb4ab704c774b8 /mcs/class/System.ServiceModel
parentb15f577ef3e8ccb0b235db0e744f93557e68e4ea (diff)
[System.ServiceModel] Replace SynchronizedCollection with referencesource (#10021)
* [System.ServiceModel] Replace SynchronizedCollection with referencesource This fixes a bug in the old implementation where we didn't have proper locking in Add(). Fixes https://bugzilla.xamarin.com/show_bug.cgi?id=43447 Closes https://github.com/mono/mono/pull/10007 * Bump API snapshot submodule * [csproj] Update project files
Diffstat (limited to 'mcs/class/System.ServiceModel')
-rw-r--r--mcs/class/System.ServiceModel/Dummy_2_1.cs47
-rw-r--r--mcs/class/System.ServiceModel/Dummy_XM_4_5.cs34
-rw-r--r--mcs/class/System.ServiceModel/ReferenceSources/SR.cs12
-rw-r--r--mcs/class/System.ServiceModel/System.Collections.Generic/KeyedByTypeCollection.cs93
-rw-r--r--mcs/class/System.ServiceModel/System.Collections.Generic/SynchronizedCollection.cs261
-rw-r--r--mcs/class/System.ServiceModel/System.Collections.Generic/SynchronizedKeyedCollection.cs142
-rw-r--r--mcs/class/System.ServiceModel/System.Collections.Generic/SynchronizedReadOnlyCollection.cs223
-rw-r--r--mcs/class/System.ServiceModel/System.IO/PipeException.cs41
-rw-r--r--mcs/class/System.ServiceModel/System.ServiceModel.csproj11
-rw-r--r--mcs/class/System.ServiceModel/System.ServiceModel.dll.sources11
-rw-r--r--mcs/class/System.ServiceModel/System.ServiceModel_test.dll.sources1
-rw-r--r--mcs/class/System.ServiceModel/Test/System.ServiceModel/SynchronizedCollectionTest.cs51
-rw-r--r--mcs/class/System.ServiceModel/Test/System.ServiceModel/SynchronizedReadOnlyCollectionTest.cs2
-rw-r--r--mcs/class/System.ServiceModel/mobile_System.ServiceModel.dll.sources9
14 files changed, 137 insertions, 801 deletions
diff --git a/mcs/class/System.ServiceModel/Dummy_2_1.cs b/mcs/class/System.ServiceModel/Dummy_2_1.cs
index 0c50b70aa05..bc5e5100424 100644
--- a/mcs/class/System.ServiceModel/Dummy_2_1.cs
+++ b/mcs/class/System.ServiceModel/Dummy_2_1.cs
@@ -177,39 +177,34 @@ namespace System.ServiceModel
// introduced for silverlight sdk compatibility
internal interface IDuplexHelper { }
- [FriendAccessAllowed ()]
- internal class DiagnosticUtility
+ internal static class DiagnosticUtility
{
- [FriendAccessAllowed ()]
- internal class ExceptionUtility
+ internal static class ExceptionUtility
{
- public static Exception ThrowHelperArgument (string message) { throw new NotImplementedException (); }
-
- public static Exception ThrowHelperArgument (string paramName, string message) { throw new NotImplementedException (); }
-
- public static Exception ThrowHelperArgumentNull (string arg)
+ internal static ArgumentException ThrowHelperArgument (string message)
{
- return new ArgumentNullException (arg);
+ return (ArgumentException)ThrowHelperError (new ArgumentException (message));
}
- [FriendAccessAllowed]
- internal static Exception ThrowHelperCallback (Exception e) { throw new NotImplementedException (); }
-
- [FriendAccessAllowed]
- internal static Exception ThrowHelperCallback (string message, Exception innerException) { throw new NotImplementedException (); }
-
- public static Exception ThrowHelperError (Exception error)
+ internal static ArgumentException ThrowHelperArgument (string paramName, string message)
{
- return error;
+ return (ArgumentException)ThrowHelperError (new ArgumentException (message, paramName));
+ }
+
+ internal static ArgumentNullException ThrowHelperArgumentNull (string paramName)
+ {
+ return (ArgumentNullException)ThrowHelperError (new ArgumentNullException (paramName));
+ }
+
+ internal static Exception ThrowHelperError (Exception exception)
+ {
+ return exception;
+ }
+
+ internal static Exception ThrowHelperWarning (Exception exception)
+ {
+ return exception;
}
-
- [FriendAccessAllowed]
- internal static Exception ThrowHelperFatal (string message, Exception innerException) { throw new NotImplementedException (); }
-
- [FriendAccessAllowed]
- internal static Exception ThrowHelperInternal (bool fatal) { throw new NotImplementedException (); }
-
- public static Exception ThrowHelperWarning (Exception e) { throw new NotImplementedException (); }
}
}
}
diff --git a/mcs/class/System.ServiceModel/Dummy_XM_4_5.cs b/mcs/class/System.ServiceModel/Dummy_XM_4_5.cs
index 989c4dddc52..d21ed9eaeaf 100644
--- a/mcs/class/System.ServiceModel/Dummy_XM_4_5.cs
+++ b/mcs/class/System.ServiceModel/Dummy_XM_4_5.cs
@@ -149,4 +149,38 @@ namespace System.ServiceModel.Description
namespace System.ServiceModel.Channels
{
public interface ITransportTokenAssertionProvider {}
+}
+
+namespace System.ServiceModel
+{
+ internal static class DiagnosticUtility
+ {
+ internal static class ExceptionUtility
+ {
+ internal static ArgumentException ThrowHelperArgument (string message)
+ {
+ return (ArgumentException)ThrowHelperError (new ArgumentException (message));
+ }
+
+ internal static ArgumentException ThrowHelperArgument (string paramName, string message)
+ {
+ return (ArgumentException)ThrowHelperError (new ArgumentException (message, paramName));
+ }
+
+ internal static ArgumentNullException ThrowHelperArgumentNull (string paramName)
+ {
+ return (ArgumentNullException)ThrowHelperError (new ArgumentNullException (paramName));
+ }
+
+ internal static Exception ThrowHelperError (Exception exception)
+ {
+ return exception;
+ }
+
+ internal static Exception ThrowHelperWarning (Exception exception)
+ {
+ return exception;
+ }
+ }
+ }
} \ No newline at end of file
diff --git a/mcs/class/System.ServiceModel/ReferenceSources/SR.cs b/mcs/class/System.ServiceModel/ReferenceSources/SR.cs
new file mode 100644
index 00000000000..25a5f10ae55
--- /dev/null
+++ b/mcs/class/System.ServiceModel/ReferenceSources/SR.cs
@@ -0,0 +1,12 @@
+partial class SR
+{
+ public const string CannotAddTwoItemsWithTheSameKeyToSynchronizedKeyedCollection0 = "Cannot add two items with the same key to SynchronizedKeyedCollection.";
+ public const string DuplicateBehavior1 = "The value could not be added to the collection, as the collection already contains an item of the same type: '{0}'. This collection only supports one instance of each type.";
+ public const string ItemDoesNotExistInSynchronizedKeyedCollection0 = "Item does not exist in SynchronizedKeyedCollection.";
+ public const string SFxCollectionReadOnly = "This operation is not supported because the collection is read-only.";
+ public const string SFxCollectionWrongType2 = "The collection of type {0} does not support values of type {1}.";
+ public const string SFxCopyToRequiresICollection = "SynchronizedReadOnlyCollection's CopyTo only works if the underlying list implements ICollection.";
+ public const string SynchronizedCollectionWrongType1 = "A value of type '{0}' cannot be added to the generic collection, because the collection has been parameterized with a different type.";
+ public const string SynchronizedCollectionWrongTypeNull = "A null value cannot be added to the generic collection, because the collection has been parameterized with a value type.";
+ public const string ValueMustBeInRange = "The value of this argument must fall within the range {0} to {1}.";
+}
diff --git a/mcs/class/System.ServiceModel/System.Collections.Generic/KeyedByTypeCollection.cs b/mcs/class/System.ServiceModel/System.Collections.Generic/KeyedByTypeCollection.cs
deleted file mode 100644
index dc046928ad3..00000000000
--- a/mcs/class/System.ServiceModel/System.Collections.Generic/KeyedByTypeCollection.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-//
-// KeyedByTypeCollection.cs
-//
-// Author:
-// Atsushi Enomoto <atsushi@ximian.com>
-//
-// Copyright (C) 2005 Novell, Inc. http://www.novell.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.ObjectModel;
-
-namespace System.Collections.Generic
-{
- public class KeyedByTypeCollection<TItem>
- : KeyedCollection<Type, TItem>
- {
- public KeyedByTypeCollection ()
- {
- }
-
- public KeyedByTypeCollection (IEnumerable<TItem> items)
- {
- foreach (TItem item in items)
- Add (item);
- }
-
- protected override Type GetKeyForItem (TItem item)
- {
- return item.GetType ();
- }
-
- public T Find<T> ()
- {
- foreach (TItem k in this)
- if (k is T)
- return (T) (object) k;
- return default (T);
- }
-
- public Collection<T> FindAll<T> ()
- {
- Collection<T> list = new Collection<T> ();
- foreach (TItem k in this)
- if (k is T)
- list.Add ((T) (object) k);
- return list;
- }
-
- protected override void InsertItem (int index, TItem item)
- {
- base.InsertItem (index, item);
- }
-
- protected override void SetItem (int index, TItem item)
- {
- base.SetItem (index, item);
- }
-
- public T Remove<T> ()
- {
- foreach (TItem k in this)
- if (k is T) {
- Remove (k);
- return (T) (object) k;
- }
- return default (T);
- }
-
- public Collection<T> RemoveAll<T> ()
- {
- return RemoveAll<T> ();
- }
- }
-}
diff --git a/mcs/class/System.ServiceModel/System.Collections.Generic/SynchronizedCollection.cs b/mcs/class/System.ServiceModel/System.Collections.Generic/SynchronizedCollection.cs
deleted file mode 100644
index 39d102a9e05..00000000000
--- a/mcs/class/System.ServiceModel/System.Collections.Generic/SynchronizedCollection.cs
+++ /dev/null
@@ -1,261 +0,0 @@
-//
-// SynchronizedCollection.cs
-//
-// Author:
-// Atsushi Enomoto <atsushi@ximian.com>
-//
-// Copyright (C) 2005 Novell, Inc. http://www.novell.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.Collections.Generic;
-using System.Collections.ObjectModel;
-using System.Runtime.InteropServices;
-
-namespace System.Collections.Generic
-{
- [ComVisibleAttribute (false)]
- public class SynchronizedCollection<T> : IList<T>, ICollection<T>,
- IEnumerable<T>, IList, ICollection, IEnumerable
- {
- object root;
- List<T> list;
-
- public SynchronizedCollection ()
- : this (new object (), null, false)
- {
- }
-
- public SynchronizedCollection (object syncRoot)
- : this (syncRoot, null, false)
- {
- }
-
- public SynchronizedCollection (object syncRoot,
- IEnumerable<T> list)
- : this (syncRoot, new List<T> (list), false)
- {
- }
-
- public SynchronizedCollection (object syncRoot,
- params T [] list)
- : this (syncRoot, new List<T> (list), false)
- {
- }
-
- public SynchronizedCollection (object syncRoot,
- List<T> list, bool makeCopy)
- {
- if (syncRoot == null)
- syncRoot = new object ();
- root = syncRoot;
- if (list == null)
- this.list = new List<T> ();
- else if (makeCopy)
- this.list = new List<T> (list);
- else
- this.list = list;
- }
-
- public int Count {
- get {
- lock (root) {
- return list.Count;
- }
- }
- }
-
- public T this [int index] {
- get {
- lock (root) {
- return list [index];
- }
- }
- set {
- SetItem (index, value);
- }
- }
-
- public object SyncRoot {
- get { return root; }
- }
-
- protected List<T> Items {
- get { return list; }
- }
-
- public void Add (T item)
- {
- InsertItem (list.Count, item);
- }
-
- public void Clear ()
- {
- ClearItems ();
- }
-
- public bool Contains (T item)
- {
- lock (root) {
- return list.Contains (item);
- }
- }
-
- public void CopyTo (T [] array, int index)
- {
- lock (root) {
- list.CopyTo (array, index);
- }
- }
-
- [MonoTODO ("Should be synchronized enumerator?")]
- public IEnumerator<T> GetEnumerator ()
- {
- lock (root) {
- return list.GetEnumerator ();
- }
- }
-
- public int IndexOf (T item)
- {
- lock (root) {
- return list.IndexOf (item);
- }
- }
-
- public void Insert (int index, T item)
- {
- InsertItem (index, item);
- }
-
- public bool Remove (T item)
- {
- lock (root) {
- int index = IndexOf (item);
- if (index < 0)
- return false;
- RemoveAt (index);
- return true;
- }
- }
-
- public void RemoveAt (int index)
- {
- RemoveItem (index);
- }
-
- protected virtual void ClearItems ()
- {
- lock (root) {
- list.Clear ();
- }
- }
-
- protected virtual void InsertItem (int index, T item)
- {
- lock (root) {
- list.Insert (index, item);
- }
- }
-
- protected virtual void RemoveItem (int index)
- {
- lock (root) {
- list.RemoveAt (index);
- }
- }
-
- protected virtual void SetItem (int index, T item)
- {
- lock (root) {
- list [index] = item;
- }
- }
-
- #region Explicit interface implementations
-
- void ICollection.CopyTo (Array array, int index)
- {
- CopyTo ((T []) array, index);
- }
-
- IEnumerator IEnumerable.GetEnumerator ()
- {
- return GetEnumerator ();
- }
-
- int IList.Add (object value)
- {
- lock (root) {
- Add ((T) value);
- return list.Count - 1;
- }
- }
-
- bool IList.Contains (object value)
- {
- return Contains ((T) value);
- }
-
- int IList.IndexOf (object value)
- {
- return IndexOf ((T) value);
- }
-
- void IList.Insert (int index, object value)
- {
- Insert (index, (T) value);
- }
-
- void IList.Remove (object value)
- {
- Remove ((T) value);
- }
-
- bool ICollection<T>.IsReadOnly {
- get { return false; }
- }
-
- bool ICollection.IsSynchronized {
- get { return true; }
- }
-
- object ICollection.SyncRoot {
- get { return root; }
- }
-
- bool IList.IsFixedSize {
- get { return false; }
- }
-
- bool IList.IsReadOnly {
- get { return false; }
- }
-
- object IList.this [int index] {
- get { return this [index]; }
- set { this [index] = (T) value; }
- }
-
- #endregion
- }
-}
diff --git a/mcs/class/System.ServiceModel/System.Collections.Generic/SynchronizedKeyedCollection.cs b/mcs/class/System.ServiceModel/System.Collections.Generic/SynchronizedKeyedCollection.cs
deleted file mode 100644
index b110d15f243..00000000000
--- a/mcs/class/System.ServiceModel/System.Collections.Generic/SynchronizedKeyedCollection.cs
+++ /dev/null
@@ -1,142 +0,0 @@
-//
-// SynchronizedKeyedCollection.cs
-//
-// Author:
-// Atsushi Enomoto <atsushi@ximian.com>
-//
-// Copyright (C) 2005 Novell, Inc. http://www.novell.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.Generic;
-using System.Runtime.InteropServices;
-using System.ServiceModel.Channels;
-
-namespace System.Collections.Generic
-{
- [ComVisibleAttribute (false)]
- public abstract class SynchronizedKeyedCollection<K, T>
- : SynchronizedCollection<T>
- {
- Dictionary<K, T> dict;
-
- protected SynchronizedKeyedCollection ()
- : this (new object ())
- {
- }
-
- protected SynchronizedKeyedCollection (object syncRoot)
- : base (syncRoot)
- {
- dict = new Dictionary<K, T> ();
- }
-
- protected SynchronizedKeyedCollection (object syncRoot,
- IEqualityComparer<K> comparer)
- : base (syncRoot)
- {
- dict = new Dictionary<K, T> (comparer);
- }
-
- protected SynchronizedKeyedCollection (object syncRoot,
- IEqualityComparer<K> comparer, int dictionaryCreationThreshold)
- : base (syncRoot)
- {
- dict = new Dictionary<K, T> (dictionaryCreationThreshold, comparer);
- }
-
- // see bug #76417
- /*
- public T this [int index] {
- get { return base [index]; }
- set { base [index] = value; }
- }
- */
-
- public T this [K key] {
- get {
- lock (SyncRoot) {
- return dict [key];
- }
- }
- }
-
- protected IDictionary<K, T> Dictionary {
- get { return dict; }
- }
-
- public bool Contains (K key)
- {
- lock (SyncRoot) {
- return dict.ContainsKey (key);
- }
- }
-
- public bool Remove (K key)
- {
- lock (SyncRoot) {
- return dict.Remove (key);
- }
- }
-
- protected void ChangeItemKey (T item, K newKey)
- {
- lock (SyncRoot) {
- K old = GetKeyForItem (item);
- dict [old] = default (T);
- dict [newKey] = item;
- }
- }
-
- [MonoTODO ("This lock is not an atomic.")]
- protected override void ClearItems ()
- {
- base.ClearItems ();
- lock (SyncRoot) {
- dict.Clear ();
- }
- }
-
- protected abstract K GetKeyForItem (T item);
-
- [MonoTODO ("This lock is not an atomic.")]
- protected override void InsertItem (int index, T item)
- {
- base.InsertItem (index, item);
- dict.Add (GetKeyForItem (item), item);
- }
-
- [MonoTODO ("This lock is not an atomic.")]
- protected override void RemoveItem (int index)
- {
- K key = GetKeyForItem (base [index]);
- base.RemoveItem (index);
- dict.Remove (key);
- }
-
- [MonoTODO ("This lock is not an atomic.")]
- protected override void SetItem (int index, T item)
- {
- base.SetItem (index, item);
- dict [GetKeyForItem (item)] = item;
- }
- }
-}
diff --git a/mcs/class/System.ServiceModel/System.Collections.Generic/SynchronizedReadOnlyCollection.cs b/mcs/class/System.ServiceModel/System.Collections.Generic/SynchronizedReadOnlyCollection.cs
deleted file mode 100644
index b7924ff5a78..00000000000
--- a/mcs/class/System.ServiceModel/System.Collections.Generic/SynchronizedReadOnlyCollection.cs
+++ /dev/null
@@ -1,223 +0,0 @@
-//
-// System.ServiceModel.SynchronizedReadOnlyCollection.cs
-//
-// Author: Duncan Mak (duncan@novell.com)
-//
-// Copyright (C) 2005 Novell, Inc (http://www.novell.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.Runtime.InteropServices;
-
-namespace System.Collections.Generic
-{
- [ComVisible (false)]
- public class SynchronizedReadOnlyCollection<T>
- : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable
- {
- List<T> l;
- object sync_root;
-
- public SynchronizedReadOnlyCollection ()
- : this (new object ())
- {
- }
-
- public SynchronizedReadOnlyCollection (object syncRoot)
- : this (syncRoot, new List<T> ())
- {
- }
-
- public SynchronizedReadOnlyCollection (object syncRoot, IEnumerable<T> list)
- {
- if (syncRoot == null)
- throw new ArgumentNullException ("syncRoot");
-
- if (list == null)
- throw new ArgumentNullException ("list");
-
- this.sync_root = syncRoot;
- this.l = new List<T> (list);
- }
-
- public SynchronizedReadOnlyCollection (object syncRoot, params T [] list)
- : this (syncRoot, (IEnumerable<T>) list)
- {
- }
-
- public SynchronizedReadOnlyCollection (object sync_root, List<T> list, bool make_copy)
- : this (sync_root,
- list == null ? null : make_copy ? new List<T> (list) : list)
- {
- }
-
- public bool Contains (T value)
- {
- bool retval;
-
- lock (sync_root) {
- retval = l.Contains (value);
- }
-
- return retval;
- }
-
- public void CopyTo (T [] array, int index)
- {
- lock (sync_root) {
- l.CopyTo (array, index);
- }
- }
-
- public IEnumerator<T> GetEnumerator ()
- {
- IEnumerator<T> retval;
-
- lock (sync_root) {
- retval = l.GetEnumerator ();
- }
-
- return retval;
- }
-
- public int IndexOf (T value)
- {
- int retval;
-
- lock (sync_root) {
- retval = l.IndexOf (value);
- }
-
- return retval;
- }
-
- void ICollection<T>.Add (T value) { throw new NotSupportedException (); }
- void ICollection<T>.Clear () { throw new NotSupportedException (); }
- bool ICollection<T>.Remove (T value) { throw new NotSupportedException (); }
-
- void IList<T>.Insert (int index, T value) { throw new NotSupportedException (); }
- void IList<T>.RemoveAt (int index) { throw new NotSupportedException (); }
-
- void ICollection.CopyTo (Array array, int index)
- {
- ICollection<T> a = array as ICollection<T>;
-
- if (a == null)
- throw new ArgumentException ("The array type is not compatible.");
-
- lock (sync_root) {
- ((ICollection) l).CopyTo (array, index);
- }
- }
-
- IEnumerator IEnumerable.GetEnumerator ()
- {
- return GetEnumerator ();
- }
-
- int IList.Add (object value) { throw new NotSupportedException (); }
- void IList.Clear () { throw new NotSupportedException (); }
-
- bool IList.Contains (object value)
- {
- if (typeof (T).IsValueType)
- throw new ArgumentException ("This is a collection of ValueTypes.");
-
- // null always gets thru
- if (value is T == false && value != null)
- throw new ArgumentException ("value is not of the same type as this collection.");
-
- bool retval;
- T val = (T) value;
- lock (sync_root) {
- retval = l.Contains (val);
- }
-
- return retval;
- }
-
- int IList.IndexOf (object value)
- {
- if (typeof (T).IsValueType)
- throw new ArgumentException ("This is a collection of ValueTypes.");
-
- if (value is T == false)
- throw new ArgumentException ("value is not of the same type as this collection.");
-
- int retval;
- T val = (T) value;
- lock (sync_root) {
- retval = l.IndexOf (val);
- }
-
- return retval;
- }
-
- void IList.Insert (int index, object value) { throw new NotSupportedException (); }
- void IList.Remove (object value) { throw new NotSupportedException (); }
- void IList.RemoveAt (int index) { throw new NotSupportedException (); }
-
- public int Count {
- get {
- int retval;
- lock (sync_root) {
- retval = l.Count;
- }
- return retval;
- }
- }
-
- public T this [int index] {
- get {
- T retval;
- lock (sync_root) {
- retval = l [index];
- }
- return retval;
- }
- }
-
- protected IList<T> Items {
- get { return l; }
- }
-
-
- bool ICollection<T>.IsReadOnly { get { return true; }}
-
- bool ICollection.IsSynchronized { get { return true; }}
- object ICollection.SyncRoot { get { return sync_root; }}
-
- bool IList.IsFixedSize { get { return true; }}
- bool IList.IsReadOnly { get { return true; }}
-
- T IList<T>.this [int index] {
- get { return this [index]; }
- set { throw new NotSupportedException (); }
- }
-
- object IList.this [int index] {
- get { return this [index]; }
- set { throw new NotSupportedException (); }
- }
- }
-} \ No newline at end of file
diff --git a/mcs/class/System.ServiceModel/System.IO/PipeException.cs b/mcs/class/System.ServiceModel/System.IO/PipeException.cs
deleted file mode 100644
index 48f1b3a8014..00000000000
--- a/mcs/class/System.ServiceModel/System.IO/PipeException.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System;
-using System.IO;
-using System.Runtime.Serialization;
-using System.ServiceModel.Channels;
-
-namespace System.IO
-{
- public class PipeException : IOException
- {
- public PipeException ()
- {
- }
-
- public PipeException (string message): base (message)
- {
- }
-
- protected PipeException (SerializationInfo info, StreamingContext context)
- : base (info, context)
- {
- }
-
- public PipeException (string message, Exception inner)
- : base (message, inner)
- {
- }
-
- public PipeException (string message, int errorCode)
- : base (message, errorCode)
- {
- }
-
- public virtual int ErrorCode {
- get {
- // we re-use the HResult for the error code here.
- return HResult;
- }
- }
- }
-}
-
diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.csproj b/mcs/class/System.ServiceModel/System.ServiceModel.csproj
index 62fc5329ade..743ece91a5b 100644
--- a/mcs/class/System.ServiceModel/System.ServiceModel.csproj
+++ b/mcs/class/System.ServiceModel/System.ServiceModel.csproj
@@ -108,6 +108,10 @@
<Compile Include="..\..\build\common\Consts.cs" />
<Compile Include="..\..\build\common\MonoTODOAttribute.cs" />
<Compile Include="..\..\build\common\SR.cs" />
+ <Compile Include="..\referencesource\System.ServiceModel\System\ServiceModel\KeyedByTypeCollection.cs" />
+ <Compile Include="..\referencesource\System.ServiceModel\System\ServiceModel\SynchronizedCollection.cs" />
+ <Compile Include="..\referencesource\System.ServiceModel\System\ServiceModel\SynchronizedKeyedCollection.cs" />
+ <Compile Include="..\referencesource\System.ServiceModel\System\ServiceModel\SynchronizedReadOnlyCollection.cs" />
<Compile Include="Assembly\AssemblyInfo.cs" />
<Compile Include="Mono.CodeGeneration\CodeAdd.cs" />
<Compile Include="Mono.CodeGeneration\CodeAnd.cs" />
@@ -157,10 +161,7 @@
<Compile Include="Mono.CodeGeneration\CodeWhile.cs" />
<Compile Include="Mono.CodeGeneration\CodeWriter.cs" />
<Compile Include="Mono.CodeGeneration\Exp.cs" />
- <Compile Include="System.Collections.Generic\KeyedByTypeCollection.cs" />
- <Compile Include="System.Collections.Generic\SynchronizedCollection.cs" />
- <Compile Include="System.Collections.Generic\SynchronizedKeyedCollection.cs" />
- <Compile Include="System.Collections.Generic\SynchronizedReadOnlyCollection.cs" />
+ <Compile Include="ReferenceSources\SR.cs" />
<Compile Include="System.ServiceModel.Channels\AddressHeader.cs" />
<Compile Include="System.ServiceModel.Channels\AddressHeaderCollection.cs" />
<Compile Include="System.ServiceModel.Channels\AddressingVersion.cs" />
@@ -490,6 +491,7 @@
<Compile Include="..\System.ServiceModel.Web\System\UriTemplateMatch.cs" />
<Compile Include="..\System.ServiceModel.Web\System\UriTemplateMatchException.cs" />
<Compile Include="..\System.ServiceModel.Web\System\UriTemplateTable.cs" />
+ <Compile Include="..\referencesource\System.ServiceModel\System\ServiceModel\Channels\PipeException.cs" />
<Compile Include="..\referencesource\System.ServiceModel\System\ServiceModel\Description\UseRequestHeadersForMetadataAddressBehavior.cs" />
<Compile Include="Mono.Security.Protocol.Ntlm\BitConverterLE.cs" />
<Compile Include="Mono.Security.Protocol.Ntlm\ChallengeResponse.cs" />
@@ -505,7 +507,6 @@
<Compile Include="Mono.Xml.XPath\DTMXPathDocumentWriter2.cs" />
<Compile Include="Mono.Xml.XPath\DTMXPathNavigator2.cs" />
<Compile Include="Mono.Xml.XPath\DTMXPathNode2.cs" />
- <Compile Include="System.IO\PipeException.cs" />
<Compile Include="System.ServiceModel.Activation\AspNetIntegrationRequirementsAttribute.cs" />
<Compile Include="System.ServiceModel.Activation\ServiceHostFactoryBase.cs" />
<Compile Include="System.ServiceModel.Activation\VirtualPathExtension.cs" />
diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.dll.sources b/mcs/class/System.ServiceModel/System.ServiceModel.dll.sources
index a2834ac0493..994b7712e0a 100644
--- a/mcs/class/System.ServiceModel/System.ServiceModel.dll.sources
+++ b/mcs/class/System.ServiceModel/System.ServiceModel.dll.sources
@@ -3,6 +3,7 @@
../../build/common/SR.cs
../../build/common/MonoTODOAttribute.cs
corefx/SR.cs
+ReferenceSources/SR.cs
Assembly/AssemblyInfo.cs
Mono.CodeGeneration/CodeAdd.cs
Mono.CodeGeneration/CodeAnd.cs
@@ -66,11 +67,11 @@ Mono.Xml.XPath/DTMXPathDocumentBuilder2.cs
Mono.Xml.XPath/DTMXPathDocumentWriter2.cs
Mono.Xml.XPath/DTMXPathNavigator2.cs
Mono.Xml.XPath/DTMXPathNode2.cs
-System.Collections.Generic/KeyedByTypeCollection.cs
-System.Collections.Generic/SynchronizedCollection.cs
-System.Collections.Generic/SynchronizedKeyedCollection.cs
-System.Collections.Generic/SynchronizedReadOnlyCollection.cs
-System.IO/PipeException.cs
+../referencesource/System.ServiceModel/System/ServiceModel/KeyedByTypeCollection.cs
+../referencesource/System.ServiceModel/System/ServiceModel/SynchronizedCollection.cs
+../referencesource/System.ServiceModel/System/ServiceModel/SynchronizedKeyedCollection.cs
+../referencesource/System.ServiceModel/System/ServiceModel/SynchronizedReadOnlyCollection.cs
+../referencesource/System.ServiceModel/System/ServiceModel/Channels/PipeException.cs
System.ServiceModel.Activation/AspNetIntegrationRequirementsAttribute.cs
System.ServiceModel.Activation/ServiceHostFactoryBase.cs
System.ServiceModel.Activation/VirtualPathExtension.cs
diff --git a/mcs/class/System.ServiceModel/System.ServiceModel_test.dll.sources b/mcs/class/System.ServiceModel/System.ServiceModel_test.dll.sources
index d19ab6a0560..7b0555e3ed0 100644
--- a/mcs/class/System.ServiceModel/System.ServiceModel_test.dll.sources
+++ b/mcs/class/System.ServiceModel/System.ServiceModel_test.dll.sources
@@ -198,6 +198,7 @@ System.ServiceModel/ServiceHostBaseTest.cs
System.ServiceModel/ServiceHostTest.cs
System.ServiceModel/ServiceKnownTypeAttributeTest.cs
System.ServiceModel/SynchronizedReadOnlyCollectionTest.cs
+System.ServiceModel/SynchronizedCollectionTest.cs
System.ServiceModel/TransactionProtocolTest.cs
System.ServiceModel/UriSchemeKeyedCollectionTest.cs
System.ServiceModel/WSFederationHttpBindingTest.cs
diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel/SynchronizedCollectionTest.cs b/mcs/class/System.ServiceModel/Test/System.ServiceModel/SynchronizedCollectionTest.cs
new file mode 100644
index 00000000000..b3577bfad66
--- /dev/null
+++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel/SynchronizedCollectionTest.cs
@@ -0,0 +1,51 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Threading;
+using NUnit.Framework;
+
+namespace MonoTests.System.ServiceModel
+{
+ [TestFixture]
+ public class SynchronizedCollectionTest
+ {
+ [Test] // from https://bugzilla.xamarin.com/show_bug.cgi?id=43447
+ public void TestConcurrentAddRemove ()
+ {
+ var c = new SynchronizedCollection<int> ();
+ for (int i = 0; i < 10000; i++)
+ {
+ c.Add(i);
+ }
+
+ var wait = new CountdownEvent (2);
+ ThreadStart add = () =>
+ {
+ wait.Signal ();
+ wait.Wait ();
+ for (int i = 10000; i < 20000; i++)
+ {
+ c.Add (i);
+ }
+ };
+
+ ThreadStart remove = () =>
+ {
+ wait.Signal ();
+ wait.Wait ();
+ for(int i = 9999; i >= 0; i--)
+ {
+ c.Remove (i);
+ }
+ };
+
+ var t1 = new Thread (add);
+ var t2 = new Thread (remove);
+ t1.Start ();
+ t2.Start ();
+
+ t1.Join ();
+ t2.Join ();
+ }
+ }
+}
diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel/SynchronizedReadOnlyCollectionTest.cs b/mcs/class/System.ServiceModel/Test/System.ServiceModel/SynchronizedReadOnlyCollectionTest.cs
index 2867a63e6b4..ad526d4ead7 100644
--- a/mcs/class/System.ServiceModel/Test/System.ServiceModel/SynchronizedReadOnlyCollectionTest.cs
+++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel/SynchronizedReadOnlyCollectionTest.cs
@@ -37,7 +37,7 @@ namespace MonoTests.System.ServiceModel
Assert.IsFalse (((IList) d).Contains (null));
}
- [Test, ExpectedException (typeof (ArgumentException))]
+ [Test]
public void TestICollectionCopyTo ()
{
SynchronizedReadOnlyCollection<int> c = new SynchronizedReadOnlyCollection<int> ();
diff --git a/mcs/class/System.ServiceModel/mobile_System.ServiceModel.dll.sources b/mcs/class/System.ServiceModel/mobile_System.ServiceModel.dll.sources
index f16d0b952ee..6c8f6fa46ce 100644
--- a/mcs/class/System.ServiceModel/mobile_System.ServiceModel.dll.sources
+++ b/mcs/class/System.ServiceModel/mobile_System.ServiceModel.dll.sources
@@ -1,6 +1,7 @@
../../build/common/Consts.cs
../../build/common/MonoTODOAttribute.cs
../../build/common/SR.cs
+ReferenceSources/SR.cs
Assembly/AssemblyInfo.cs
Mono.CodeGeneration/CodeAdd.cs
Mono.CodeGeneration/CodeAnd.cs
@@ -50,10 +51,10 @@ Mono.CodeGeneration/CodeWhen.cs
Mono.CodeGeneration/CodeWhile.cs
Mono.CodeGeneration/CodeWriter.cs
Mono.CodeGeneration/Exp.cs
-System.Collections.Generic/KeyedByTypeCollection.cs
-System.Collections.Generic/SynchronizedCollection.cs
-System.Collections.Generic/SynchronizedKeyedCollection.cs
-System.Collections.Generic/SynchronizedReadOnlyCollection.cs
+../referencesource/System.ServiceModel/System/ServiceModel/KeyedByTypeCollection.cs
+../referencesource/System.ServiceModel/System/ServiceModel/SynchronizedCollection.cs
+../referencesource/System.ServiceModel/System/ServiceModel/SynchronizedKeyedCollection.cs
+../referencesource/System.ServiceModel/System/ServiceModel/SynchronizedReadOnlyCollection.cs
System.ServiceModel.Channels/AddressHeader.cs
System.ServiceModel.Channels/AddressHeaderCollection.cs
System.ServiceModel.Channels/AddressingVersion.cs