##// END OF EJS Templates
fixed blocking queue
cin -
r139:041b77711262 v2
parent child
Show More
@@ -23,10 +23,13 namespace Implab.Parallels {
23
23
24 public T GetItem(int timeout) {
24 public T GetItem(int timeout) {
25 T item;
25 T item;
26
27 if (!TryDequeue(out item)) {
26 var t1 = Environment.TickCount;
28 var t1 = Environment.TickCount;
27 var dt = timeout;
29 var dt = timeout;
30
31 lock (m_lock) {
28 while (!TryDequeue(out item)) {
32 while (!TryDequeue(out item)) {
29 lock (m_lock)
30 if (!Monitor.Wait(m_lock, dt))
33 if (!Monitor.Wait(m_lock, dt))
31 throw new TimeoutException();
34 throw new TimeoutException();
32 if (timeout >= 0) {
35 if (timeout >= 0) {
@@ -35,14 +38,18 namespace Implab.Parallels {
35 throw new TimeoutException();
38 throw new TimeoutException();
36 }
39 }
37 }
40 }
41 }
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;
48 if (!TryDequeue(out item))
49 lock (m_lock) {
43 while (!TryDequeue(out item))
50 while (!TryDequeue(out item))
44 lock (m_lock)
45 Monitor.Wait(m_lock);
51 Monitor.Wait(m_lock);
52 }
46 return item;
53 return item;
47 }
54 }
48
55
@@ -51,18 +58,24 namespace Implab.Parallels {
51
58
52 var buffer = new T[max];
59 var buffer = new T[max];
53 int actual;
60 int actual;
61 if (!TryDequeueRange(buffer, 0, max, out actual)) {
54 var t1 = Environment.TickCount;
62 var t1 = Environment.TickCount;
55 var dt = timeout;
63 var dt = timeout;
64
65 lock (m_lock) {
56 while (!TryDequeueRange(buffer,0,max,out actual)) {
66 while (!TryDequeueRange(buffer, 0, max, out actual)) {
57 lock (m_lock)
67
58 if (!Monitor.Wait(m_lock, dt))
68 if (!Monitor.Wait(m_lock, dt))
59 throw new TimeoutException();
69 throw new TimeoutException();
70
60 if (timeout >= 0) {
71 if (timeout >= 0) {
61 dt = timeout - Environment.TickCount + t1;
72 dt = timeout - Environment.TickCount + t1;
62 if (dt < 0)
73 if (dt < 0)
63 throw new TimeoutException();
74 throw new TimeoutException();
64 }
75 }
65 }
76 }
77 }
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);
@@ -74,8 +87,9 namespace Implab.Parallels {
74
87
75 var buffer = new T[max];
88 var buffer = new T[max];
76 int actual;
89 int actual;
90 if (!TryDequeueRange(buffer, 0, max, out actual))
91 lock (m_lock)
77 while (!TryDequeueRange(buffer, 0, max, out actual))
92 while (!TryDequeueRange(buffer, 0, max, out actual))
78 lock (m_lock)
79 Monitor.Wait(m_lock);
93 Monitor.Wait(m_lock);
80
94
81 var data = new T[actual];
95 var data = new T[actual];
General Comments 0
You need to be logged in to leave comments. Login now