copying the latest Sys.Web.Services from trunk.
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / XEventQueue.cs
1 //
2 // System.Windows.Forms.XEventQueue
3 //
4 // Author(s):
5 //  Jackson Harper (jackson@ximian.com)
6 //
7 // Copyright (C) Novell, Inc (http://www.novell.com)
8 //
9
10 using System;
11 using System.Threading;
12 using System.Collections;
13
14
15 namespace System.Windows.Forms {
16
17         internal class XEventQueue {
18
19                 private XQueue xqueue;
20                 private XQueue lqueue;  // Events inserted from threads other then the main X thread
21
22                 private static readonly int InitialXEventSize = 50;
23                 private static readonly int InitialLXEventSize = 10;
24
25                 public XEventQueue ()
26                 {
27                         xqueue = new XQueue (InitialXEventSize);
28                         lqueue = new XQueue (InitialLXEventSize);
29                 }
30
31                 public int Count {
32                         get {
33                                 lock (lqueue) {
34                                         return xqueue.Count + lqueue.Count;
35                                 }
36                         }
37                 }
38
39                 public void Enqueue (XEvent xevent)
40                 {
41                         xqueue.Enqueue (xevent);
42                 }
43
44                 public void EnqueueLocked (XEvent xevent)
45                 {
46                         lock (lqueue) {
47                                 lqueue.Enqueue (xevent);
48                         }
49                 }
50
51                 public XEvent Dequeue ()
52                 {
53                         if (xqueue.Count == 0) {
54                                 lock (lqueue) {
55                                         return lqueue.Dequeue ();
56                                 }
57                         }
58                         return xqueue.Dequeue ();
59                 }
60
61                 private class XQueue {
62
63                         private XEvent [] xevents;
64                         private int head;
65                         private int tail;
66                         private int size;
67                         
68                         public XQueue (int size)
69                         {
70                                 xevents = new XEvent [size];
71                         }
72
73                         public int Count {
74                                 get { return size; }
75                         }
76
77                         public void Enqueue (XEvent xevent)
78                         {
79                                 if (size == xevents.Length)
80                                         Grow ();
81                                 
82                                 xevents [tail] = xevent;
83                                 tail = (tail + 1) % xevents.Length;
84                                 size++;
85                         }
86
87                         public XEvent Dequeue ()
88                         {
89                                 if (size < 1)
90                                         throw new Exception ("Attempt to dequeue empty queue.");
91                                 XEvent res = xevents [head];
92                                 head = (head + 1) % xevents.Length;
93                                 size--;
94                                 return res;
95                         }
96
97                         private void Grow ()
98                         {
99                                 int newcap = (xevents.Length * 2);
100                                 XEvent [] na = new XEvent [newcap];
101                                 xevents.CopyTo (na, 0);
102                                 xevents = na;
103                                 head = 0;
104                                 tail = head + size;
105                         }
106                 }
107         }
108 }
109