comparison Implab/Parallels/BlockingQueue.cs @ 139:041b77711262 v2

fixed blocking queue
author cin
date Wed, 18 Feb 2015 18:02:02 +0300
parents 238e15580926
children d6fe09f5592c
comparison
equal deleted inserted replaced
138:f75cfa58e3d4 139:041b77711262
21 Monitor.Pulse(m_lock); 21 Monitor.Pulse(m_lock);
22 } 22 }
23 23
24 public T GetItem(int timeout) { 24 public T GetItem(int timeout) {
25 T item; 25 T item;
26 var t1 = Environment.TickCount; 26
27 var dt = timeout; 27 if (!TryDequeue(out item)) {
28 while (!TryDequeue(out item)) { 28 var t1 = Environment.TickCount;
29 lock (m_lock) 29 var dt = timeout;
30 if (!Monitor.Wait(m_lock, dt)) 30
31 throw new TimeoutException(); 31 lock (m_lock) {
32 if (timeout >= 0) { 32 while (!TryDequeue(out item)) {
33 dt = timeout - Environment.TickCount + t1; 33 if (!Monitor.Wait(m_lock, dt))
34 if (dt < 0) 34 throw new TimeoutException();
35 throw new TimeoutException(); 35 if (timeout >= 0) {
36 dt = timeout - Environment.TickCount + t1;
37 if (dt < 0)
38 throw new TimeoutException();
39 }
40 }
36 } 41 }
37 } 42 }
38 return item; 43 return item;
39 } 44 }
40 45
41 public T GetItem() { 46 public T GetItem() {
42 T item; 47 T item;
43 while (!TryDequeue(out item)) 48 if (!TryDequeue(out item))
44 lock (m_lock) 49 lock (m_lock) {
45 Monitor.Wait(m_lock); 50 while (!TryDequeue(out item))
51 Monitor.Wait(m_lock);
52 }
46 return item; 53 return item;
47 } 54 }
48 55
49 public T[] GetRange(int max, int timeout) { 56 public T[] GetRange(int max, int timeout) {
50 Safe.ArgumentInRange(max, 1, Int32.MaxValue, "max"); 57 Safe.ArgumentInRange(max, 1, Int32.MaxValue, "max");
51 58
52 var buffer = new T[max]; 59 var buffer = new T[max];
53 int actual; 60 int actual;
54 var t1 = Environment.TickCount; 61 if (!TryDequeueRange(buffer, 0, max, out actual)) {
55 var dt = timeout; 62 var t1 = Environment.TickCount;
56 while (!TryDequeueRange(buffer,0,max,out actual)) { 63 var dt = timeout;
57 lock (m_lock) 64
58 if (!Monitor.Wait(m_lock, dt)) 65 lock (m_lock) {
59 throw new TimeoutException(); 66 while (!TryDequeueRange(buffer, 0, max, out actual)) {
60 if (timeout >= 0) { 67
61 dt = timeout - Environment.TickCount + t1; 68 if (!Monitor.Wait(m_lock, dt))
62 if (dt < 0) 69 throw new TimeoutException();
63 throw new TimeoutException(); 70
71 if (timeout >= 0) {
72 dt = timeout - Environment.TickCount + t1;
73 if (dt < 0)
74 throw new TimeoutException();
75 }
76 }
64 } 77 }
65 } 78 }
66 79
67 var data = new T[actual]; 80 var data = new T[actual];
68 Array.Copy(buffer, data, actual); 81 Array.Copy(buffer, data, actual);
72 public T[] GetRange(int max) { 85 public T[] GetRange(int max) {
73 Safe.ArgumentInRange(max, 1, Int32.MaxValue, "max"); 86 Safe.ArgumentInRange(max, 1, Int32.MaxValue, "max");
74 87
75 var buffer = new T[max]; 88 var buffer = new T[max];
76 int actual; 89 int actual;
77 while (!TryDequeueRange(buffer, 0, max, out actual)) 90 if (!TryDequeueRange(buffer, 0, max, out actual))
78 lock (m_lock) 91 lock (m_lock)
79 Monitor.Wait(m_lock); 92 while (!TryDequeueRange(buffer, 0, max, out actual))
93 Monitor.Wait(m_lock);
80 94
81 var data = new T[actual]; 95 var data = new T[actual];
82 Array.Copy(buffer, data, actual); 96 Array.Copy(buffer, data, actual);
83 return data; 97 return data;
84 } 98 }