diff options
Diffstat (limited to 'mcs/class/Managed.Windows.Forms/System.Windows.Forms/XEventQueue.cs')
-rw-r--r-- | mcs/class/Managed.Windows.Forms/System.Windows.Forms/XEventQueue.cs | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XEventQueue.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XEventQueue.cs new file mode 100644 index 00000000000..313bafd8b05 --- /dev/null +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XEventQueue.cs @@ -0,0 +1,109 @@ +// +// System.Windows.Forms.XEventQueue +// +// Author(s): +// Jackson Harper (jackson@ximian.com) +// +// Copyright (C) Novell, Inc (http://www.novell.com) +// + +using System; +using System.Threading; +using System.Collections; + + +namespace System.Windows.Forms { + + internal class XEventQueue { + + private XQueue xqueue; + private XQueue lqueue; // Events inserted from threads other then the main X thread + + private static readonly int InitialXEventSize = 100; + private static readonly int InitialLXEventSize = 10; + + public XEventQueue () + { + xqueue = new XQueue (InitialXEventSize); + lqueue = new XQueue (InitialLXEventSize); + } + + public int Count { + get { + lock (lqueue) { + return xqueue.Count + lqueue.Count; + } + } + } + + public void Enqueue (XEvent xevent) + { + xqueue.Enqueue (xevent); + } + + public void EnqueueLocked (XEvent xevent) + { + lock (lqueue) { + lqueue.Enqueue (xevent); + } + } + + public XEvent Dequeue () + { + if (xqueue.Count == 0) { + lock (lqueue) { + return lqueue.Dequeue (); + } + } + return xqueue.Dequeue (); + } + + private class XQueue { + + private XEvent [] xevents; + private int head; + private int tail; + private int size; + + public XQueue (int size) + { + xevents = new XEvent [size]; + } + + public int Count { + get { return size; } + } + + public void Enqueue (XEvent xevent) + { + if (size == xevents.Length) + Grow (); + + xevents [tail] = xevent; + tail = (tail + 1) % xevents.Length; + size++; + } + + public XEvent Dequeue () + { + if (size < 1) + throw new Exception ("Attempt to dequeue empty queue."); + XEvent res = xevents [head]; + head = (head + 1) % xevents.Length; + size--; + return res; + } + + private void Grow () + { + int newcap = (xevents.Length * 2); + XEvent [] na = new XEvent [newcap]; + xevents.CopyTo (na, 0); + xevents = na; + head = 0; + tail = head + size; + } + } + } +} + |