diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Framework/BlockingQueue.cs | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/OpenSim/Framework/BlockingQueue.cs b/OpenSim/Framework/BlockingQueue.cs index 3658161..d11ad11 100644 --- a/OpenSim/Framework/BlockingQueue.cs +++ b/OpenSim/Framework/BlockingQueue.cs | |||
@@ -58,7 +58,7 @@ namespace OpenSim.Framework | |||
58 | { | 58 | { |
59 | lock (m_queueSync) | 59 | lock (m_queueSync) |
60 | { | 60 | { |
61 | if (m_queue.Count < 1 && m_pqueue.Count < 1) | 61 | while (m_queue.Count < 1 && m_pqueue.Count < 1) |
62 | { | 62 | { |
63 | Monitor.Wait(m_queueSync); | 63 | Monitor.Wait(m_queueSync); |
64 | } | 64 | } |
@@ -76,9 +76,10 @@ namespace OpenSim.Framework | |||
76 | { | 76 | { |
77 | lock (m_queueSync) | 77 | lock (m_queueSync) |
78 | { | 78 | { |
79 | if (m_queue.Count < 1 && m_pqueue.Count < 1) | 79 | bool success = true; |
80 | while (m_queue.Count < 1 && m_pqueue.Count < 1 && success) | ||
80 | { | 81 | { |
81 | Monitor.Wait(m_queueSync, msTimeout); | 82 | success = Monitor.Wait(m_queueSync, msTimeout); |
82 | } | 83 | } |
83 | 84 | ||
84 | if (m_pqueue.Count > 0) | 85 | if (m_pqueue.Count > 0) |
@@ -89,28 +90,47 @@ namespace OpenSim.Framework | |||
89 | } | 90 | } |
90 | } | 91 | } |
91 | 92 | ||
93 | /// <summary> | ||
94 | /// Indicate whether this queue contains the given item. | ||
95 | /// </summary> | ||
96 | /// <remarks> | ||
97 | /// This method is not thread-safe. Do not rely on the result without consistent external locking. | ||
98 | /// </remarks> | ||
92 | public bool Contains(T item) | 99 | public bool Contains(T item) |
93 | { | 100 | { |
94 | lock (m_queueSync) | 101 | lock (m_queueSync) |
95 | { | 102 | { |
103 | if (m_queue.Count < 1 && m_pqueue.Count < 1) | ||
104 | return false; | ||
105 | |||
96 | if (m_pqueue.Contains(item)) | 106 | if (m_pqueue.Contains(item)) |
97 | return true; | 107 | return true; |
98 | return m_queue.Contains(item); | 108 | return m_queue.Contains(item); |
99 | } | 109 | } |
100 | } | 110 | } |
101 | 111 | ||
112 | /// <summary> | ||
113 | /// Return a count of the number of requests on this queue. | ||
114 | /// </summary> | ||
102 | public int Count() | 115 | public int Count() |
103 | { | 116 | { |
104 | lock (m_queueSync) | 117 | lock (m_queueSync) |
105 | { | 118 | return m_queue.Count + m_pqueue.Count; |
106 | return m_queue.Count+m_pqueue.Count; | ||
107 | } | ||
108 | } | 119 | } |
109 | 120 | ||
121 | /// <summary> | ||
122 | /// Return the array of items on this queue. | ||
123 | /// </summary> | ||
124 | /// <remarks> | ||
125 | /// This method is not thread-safe. Do not rely on the result without consistent external locking. | ||
126 | /// </remarks> | ||
110 | public T[] GetQueueArray() | 127 | public T[] GetQueueArray() |
111 | { | 128 | { |
112 | lock (m_queueSync) | 129 | lock (m_queueSync) |
113 | { | 130 | { |
131 | if (m_queue.Count < 1 && m_pqueue.Count < 1) | ||
132 | return new T[0]; | ||
133 | |||
114 | return m_queue.ToArray(); | 134 | return m_queue.ToArray(); |
115 | } | 135 | } |
116 | } | 136 | } |