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:
authorbarkerm <michael.barker@lmax.com>2011-01-16 16:34:05 +0300
committerMiguel de Icaza <miguel@gnome.org>2011-01-16 20:07:06 +0300
commit0f7a69d568455a6935ab8fde77c613a518862ca6 (patch)
tree126d34dee5f0e56d253206d09aca6467388d778a /mcs/class/Mono.Messaging
parent2b516ade6dfef6edb139fc2d5b936f00c31e9b99 (diff)
Add missing files for connection pool changes
Diffstat (limited to 'mcs/class/Mono.Messaging')
-rw-r--r--mcs/class/Mono.Messaging/Mono.Messaging/ConcurrentLinkedQueue.cs127
-rw-r--r--mcs/class/Mono.Messaging/Test/Mono.Messaging/ConcurrentLinkedQueueTest.cs67
2 files changed, 194 insertions, 0 deletions
diff --git a/mcs/class/Mono.Messaging/Mono.Messaging/ConcurrentLinkedQueue.cs b/mcs/class/Mono.Messaging/Mono.Messaging/ConcurrentLinkedQueue.cs
new file mode 100644
index 00000000000..a9fc25d2736
--- /dev/null
+++ b/mcs/class/Mono.Messaging/Mono.Messaging/ConcurrentLinkedQueue.cs
@@ -0,0 +1,127 @@
+//
+// Mono.Messaging
+//
+// Authors:
+// Michael Barker (mike@middlesoft.co.uk)
+//
+// (C) 2008 Michael Barker
+//
+
+//
+// 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.Threading;
+
+namespace Mono.Messaging {
+
+ public class ConcurrentLinkedQueue<T>
+ {
+ private Node<T> head;
+ private Node<T> tail;
+
+ public ConcurrentLinkedQueue ()
+ {
+ Node<T> node = new Node<T> (default (T));
+ head = node;
+ tail = node;
+ }
+
+ public void Enqueue (T context)
+ {
+ Console.WriteLine ("Insert: " + context);
+ Node<T> newNode = new Node<T>(context);
+
+ while (true) {
+ Node<T> tail = this.tail;
+ Node<T> next = tail.Next;
+
+ if (tail == this.tail) {
+ if (null == next) {
+ if (tail.CAS (newNode, next))
+ break;
+
+ } else {
+ Interlocked.CompareExchange<Node<T>> (ref this.tail, next, tail);
+ }
+ }
+ }
+ }
+
+ public T Dequeue ()
+ {
+ while (true) {
+ Node<T> head = this.head;
+ Node<T> tail = this.tail;
+ Node<T> next = head.Next;
+
+ if (head == this.head) {
+ if (head == tail) {
+ if (null == next)
+ return default(T);
+
+ Interlocked.CompareExchange<Node<T>> (ref this.tail, next, tail);
+
+ } else {
+ T t = next.Value;
+
+ if (Interlocked.CompareExchange(ref this.head, next, head) == head)
+ return t;
+ }
+ }
+ }
+ }
+
+ public override String ToString ()
+ {
+ return "Head: " + head;
+ }
+
+ internal class Node<N>
+ {
+ private readonly N context;
+ private Node<N> next = null;
+
+ public Node (N context)
+ {
+ this.context = context;
+ }
+
+ public Node<N> Next {
+ get { return next; }
+ }
+
+ public N Value {
+ get { return context; }
+ }
+
+ public bool CAS (Node<N> newNode, Node<N> oldNode)
+ {
+ return Interlocked.CompareExchange (ref next, newNode, oldNode) == oldNode;
+ }
+
+ public override String ToString ()
+ {
+ return "context: " + context + ", Next: " + next;
+ }
+ }
+ }
+}
diff --git a/mcs/class/Mono.Messaging/Test/Mono.Messaging/ConcurrentLinkedQueueTest.cs b/mcs/class/Mono.Messaging/Test/Mono.Messaging/ConcurrentLinkedQueueTest.cs
new file mode 100644
index 00000000000..945e8f51a2e
--- /dev/null
+++ b/mcs/class/Mono.Messaging/Test/Mono.Messaging/ConcurrentLinkedQueueTest.cs
@@ -0,0 +1,67 @@
+//
+// Mono.Messaging
+//
+// Authors:
+// Michael Barker (mike@middlesoft.co.uk)
+//
+// (C) 2008 Michael Barker
+//
+
+//
+// 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 Mono.Messaging;
+using NUnit.Framework;
+
+namespace MonoTests.Mono.Messaging {
+
+ [TestFixture]
+ public class ConcurrentLinkedQueueTest
+ {
+
+ [Test]
+ public void ShouldEnqueueAndDequeue ()
+ {
+ ConcurrentLinkedQueue<int> pool = new ConcurrentLinkedQueue<int>();
+
+ pool.Enqueue (1);
+
+ Assert.AreEqual (1, pool.Dequeue ());
+ }
+
+
+ [Test]
+ public void ShouldEnqueueAndDequeueMultiple ()
+ {
+ ConcurrentLinkedQueue<int> pool = new ConcurrentLinkedQueue<int>();
+
+ for (int i = 1; i <= 10; i++) {
+ pool.Enqueue (i);
+ }
+
+ for (int i = 1; i <= 10; i++) {
+ Assert.AreEqual (i, pool.Dequeue ());
+ }
+ }
+ }
+}