diff options
author | Alexander Köplinger <alex.koeplinger@outlook.com> | 2018-08-10 22:47:14 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-10 22:47:14 +0300 |
commit | 22c9616fe2d23d11d12b883cb39020a5495c0e16 (patch) | |
tree | 5c94d6adf8a7c6af48e0739374cb4ab704c774b8 /mcs/class/System.ServiceModel | |
parent | b15f577ef3e8ccb0b235db0e744f93557e68e4ea (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')
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 |