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_queue.h" | 5 #include "vm/message.h" |
6 | 6 |
7 namespace dart { | 7 namespace dart { |
8 | 8 |
9 DECLARE_FLAG(bool, trace_isolates); | |
10 | |
11 | |
12 MessageHandler::MessageHandler() | |
13 : live_ports_(0), | |
14 queue_(new MessageQueue()) { | |
15 ASSERT(queue_ != NULL); | |
16 } | |
17 | |
18 | |
19 MessageHandler::~MessageHandler() { | |
20 delete queue_; | |
21 } | |
22 | |
23 | |
24 const char* MessageHandler::name() const { | |
25 return "<unnamed>"; | |
26 } | |
27 | |
28 | |
29 #if defined(DEBUG) | |
30 void MessageHandler::CheckAccess() { | |
31 // By default there is no checking. | |
32 } | |
33 #endif | |
34 | |
35 | |
36 void MessageHandler::MessageNotify(Message::Priority priority) { | |
37 // By default, there is no custom message notification. | |
38 } | |
39 | |
40 | |
41 void MessageHandler::PostMessage(Message* message) { | |
42 if (FLAG_trace_isolates) { | |
43 const char* source_name = "<native code>"; | |
44 Isolate* source_isolate = Isolate::Current(); | |
45 if (source_isolate) { | |
46 source_name = source_isolate->name(); | |
47 } | |
48 OS::Print("[>] Posting message:\n" | |
49 "\tsource: %s\n" | |
50 "\treply_port: %lld\n" | |
51 "\tdest: %s\n" | |
52 "\tdest_port: %lld\n", | |
53 source_name, message->reply_port(), name(), message->dest_port()); | |
54 } | |
55 | |
56 Message::Priority priority = message->priority(); | |
57 queue()->Enqueue(message); | |
58 message = NULL; // Do not access message. May have been deleted. | |
59 | |
60 // Invoke any custom message notification. | |
61 MessageNotify(priority); | |
62 } | |
63 | |
64 | |
65 void MessageHandler::ClosePort(Dart_Port port) { | |
66 queue()->Flush(port); | |
67 } | |
68 | |
69 | |
70 void MessageHandler::CloseAllPorts() { | |
71 queue()->FlushAll(); | |
72 } | |
73 | |
74 | |
9 MessageQueue::MessageQueue() { | 75 MessageQueue::MessageQueue() { |
10 for (int p = Message::kFirstPriority; p < Message::kNumPriorities; p++) { | 76 for (int p = Message::kFirstPriority; p < Message::kNumPriorities; p++) { |
11 head_[p] = NULL; | 77 head_[p] = NULL; |
12 tail_[p] = NULL; | 78 tail_[p] = NULL; |
13 } | 79 } |
14 } | 80 } |
15 | 81 |
16 | 82 |
17 MessageQueue::~MessageQueue() { | 83 MessageQueue::~MessageQueue() { |
18 // Ensure that all pending messages have been released. | 84 // Ensure that all pending messages have been released. |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
70 #endif // DEBUG | 136 #endif // DEBUG |
71 return result; | 137 return result; |
72 } | 138 } |
73 } | 139 } |
74 return NULL; | 140 return NULL; |
75 } | 141 } |
76 | 142 |
77 | 143 |
78 Message* MessageQueue::Dequeue(int64_t millis) { | 144 Message* MessageQueue::Dequeue(int64_t millis) { |
79 ASSERT(millis >= 0); | 145 ASSERT(millis >= 0); |
80 MonitorLocker ml(&monitor_); | 146 monitor_.Enter(); |
81 | 147 |
82 Message* result = DequeueNoWaitHoldsLock(); | 148 Message* result = DequeueNoWaitHoldsLock(); |
83 if (result == NULL) { | 149 if (result == NULL) { |
84 // No message available at any priority. | 150 // No message available at any priority. |
85 ml.Wait(millis); | 151 monitor_.Wait(millis); |
86 result = DequeueNoWaitHoldsLock(); | 152 result = DequeueNoWaitHoldsLock(); |
87 } | 153 } |
154 | |
155 monitor_.Exit(); | |
88 return result; | 156 return result; |
89 } | 157 } |
90 | 158 |
91 | 159 |
92 void MessageQueue::Flush(Dart_Port port) { | 160 void MessageQueue::Flush(Dart_Port port) { |
93 MonitorLocker ml(&monitor_); | 161 monitor_.Enter(); |
Søren Gjesse
2012/01/27 13:33:14
In runtime/bin/thread.h we have a MonitorLocker wh
siva
2012/01/28 00:21:05
We should re-evaluate if MonitorLocker needs to be
turnidge
2012/01/31 20:04:31
I have partially addressed this by making StackRes
turnidge
2012/01/31 20:04:31
I have changed StackResource to function reasonabl
| |
94 for (int p = Message::kFirstPriority; p < Message::kNumPriorities; p++) { | 162 for (int p = Message::kFirstPriority; p < Message::kNumPriorities; p++) { |
95 Message* cur = head_[p]; | 163 Message* cur = head_[p]; |
96 Message* prev = NULL; | 164 Message* prev = NULL; |
97 while (cur != NULL) { | 165 while (cur != NULL) { |
98 Message* next = cur->next_; | 166 Message* next = cur->next_; |
99 // If the message matches, then remove it from the queue and delete it. | 167 // If the message matches, then remove it from the queue and delete it. |
100 if (cur->dest_port() == port) { | 168 if (cur->dest_port() == port) { |
101 if (prev != NULL) { | 169 if (prev != NULL) { |
102 prev->next_ = next; | 170 prev->next_ = next; |
103 } else { | 171 } else { |
104 head_[p] = next; | 172 head_[p] = next; |
105 } | 173 } |
106 delete cur; | 174 delete cur; |
107 } else { | 175 } else { |
108 // Move prev forward. | 176 // Move prev forward. |
109 prev = cur; | 177 prev = cur; |
110 } | 178 } |
111 // Advance to the next message in the queue. | 179 // Advance to the next message in the queue. |
112 cur = next; | 180 cur = next; |
113 } | 181 } |
114 tail_[p] = prev; | 182 tail_[p] = prev; |
115 } | 183 } |
184 monitor_.Exit(); | |
116 } | 185 } |
117 | 186 |
118 | 187 |
119 void MessageQueue::FlushAll() { | 188 void MessageQueue::FlushAll() { |
120 MonitorLocker ml(&monitor_); | 189 MonitorLocker ml(&monitor_); |
121 for (int p = Message::kFirstPriority; p < Message::kNumPriorities; p++) { | 190 for (int p = Message::kFirstPriority; p < Message::kNumPriorities; p++) { |
122 Message* cur = head_[p]; | 191 Message* cur = head_[p]; |
123 head_[p] = NULL; | 192 head_[p] = NULL; |
124 tail_[p] = NULL; | 193 tail_[p] = NULL; |
125 while (cur != NULL) { | 194 while (cur != NULL) { |
126 Message* next = cur->next_; | 195 Message* next = cur->next_; |
127 delete cur; | 196 delete cur; |
128 cur = next; | 197 cur = next; |
129 } | 198 } |
130 } | 199 } |
131 } | 200 } |
132 | 201 |
133 | 202 |
134 } // namespace dart | 203 } // namespace dart |
OLD | NEW |