Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(192)

Side by Side Diff: runtime/vm/message.cc

Issue 9169063: Add support for native ports in the vm. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Patch Set Four Rules Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698