OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/message.h" | 5 #include "vm/message.h" |
6 | 6 |
7 namespace dart { | 7 namespace dart { |
8 | 8 |
9 DECLARE_FLAG(bool, trace_isolates); | 9 DECLARE_FLAG(bool, trace_isolates); |
10 | 10 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 // We only need to notify if the queue was empty. | 103 // We only need to notify if the queue was empty. |
104 monitor_.Notify(); | 104 monitor_.Notify(); |
105 } else { | 105 } else { |
106 ASSERT(tail_[p] != NULL); | 106 ASSERT(tail_[p] != NULL); |
107 // Append at the tail. | 107 // Append at the tail. |
108 tail_[p]->next_ = msg; | 108 tail_[p]->next_ = msg; |
109 tail_[p] = msg; | 109 tail_[p] = msg; |
110 } | 110 } |
111 } | 111 } |
112 | 112 |
| 113 |
113 Message* MessageQueue::DequeueNoWait() { | 114 Message* MessageQueue::DequeueNoWait() { |
114 MonitorLocker ml(&monitor_); | 115 MonitorLocker ml(&monitor_); |
115 return DequeueNoWaitHoldsLock(); | 116 return DequeueNoWaitHoldsLock(Message::kFirstPriority); |
116 } | 117 } |
117 | 118 |
118 Message* MessageQueue::DequeueNoWaitHoldsLock() { | 119 |
| 120 Message* MessageQueue::DequeueNoWaitWithPriority( |
| 121 Message::Priority min_priority) { |
| 122 MonitorLocker ml(&monitor_); |
| 123 return DequeueNoWaitHoldsLock(min_priority); |
| 124 } |
| 125 |
| 126 |
| 127 Message* MessageQueue::DequeueNoWaitHoldsLock(Message::Priority min_priority) { |
119 // Look for the highest priority available message. | 128 // Look for the highest priority available message. |
120 for (int p = Message::kNumPriorities-1; p >= Message::kFirstPriority; p--) { | 129 for (int p = Message::kNumPriorities-1; p >= min_priority; p--) { |
121 Message* result = head_[p]; | 130 Message* result = head_[p]; |
122 if (result != NULL) { | 131 if (result != NULL) { |
123 head_[p] = result->next_; | 132 head_[p] = result->next_; |
124 // The following update to tail_ is not strictly needed. | 133 // The following update to tail_ is not strictly needed. |
125 if (head_[p] == NULL) { | 134 if (head_[p] == NULL) { |
126 tail_[p] = NULL; | 135 tail_[p] = NULL; |
127 } | 136 } |
128 #if defined(DEBUG) | 137 #if defined(DEBUG) |
129 result->next_ = result; // Make sure to trigger ASSERT in Enqueue. | 138 result->next_ = result; // Make sure to trigger ASSERT in Enqueue. |
130 #endif // DEBUG | 139 #endif // DEBUG |
131 return result; | 140 return result; |
132 } | 141 } |
133 } | 142 } |
134 return NULL; | 143 return NULL; |
135 } | 144 } |
136 | 145 |
137 | 146 |
138 Message* MessageQueue::Dequeue(int64_t millis) { | 147 Message* MessageQueue::Dequeue(int64_t millis) { |
139 ASSERT(millis >= 0); | 148 ASSERT(millis >= 0); |
140 MonitorLocker ml(&monitor_); | 149 MonitorLocker ml(&monitor_); |
141 Message* result = DequeueNoWaitHoldsLock(); | 150 Message* result = DequeueNoWaitHoldsLock(Message::kFirstPriority); |
142 if (result == NULL) { | 151 if (result == NULL) { |
143 // No message available at any priority. | 152 // No message available at any priority. |
144 monitor_.Wait(millis); | 153 monitor_.Wait(millis); |
145 result = DequeueNoWaitHoldsLock(); | 154 result = DequeueNoWaitHoldsLock(Message::kFirstPriority); |
146 } | 155 } |
147 return result; | 156 return result; |
148 } | 157 } |
149 | 158 |
150 | 159 |
151 void MessageQueue::Flush(Dart_Port port) { | 160 void MessageQueue::Flush(Dart_Port port) { |
152 MonitorLocker ml(&monitor_); | 161 MonitorLocker ml(&monitor_); |
153 for (int p = Message::kFirstPriority; p < Message::kNumPriorities; p++) { | 162 for (int p = Message::kFirstPriority; p < Message::kNumPriorities; p++) { |
154 Message* cur = head_[p]; | 163 Message* cur = head_[p]; |
155 Message* prev = NULL; | 164 Message* prev = NULL; |
(...skipping 28 matching lines...) Expand all Loading... |
184 while (cur != NULL) { | 193 while (cur != NULL) { |
185 Message* next = cur->next_; | 194 Message* next = cur->next_; |
186 delete cur; | 195 delete cur; |
187 cur = next; | 196 cur = next; |
188 } | 197 } |
189 } | 198 } |
190 } | 199 } |
191 | 200 |
192 | 201 |
193 } // namespace dart | 202 } // namespace dart |
OLD | NEW |