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:
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.cs109
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;
+ }
+ }
+ }
+}
+