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

Side by Side Diff: runtime/vm/message_handler.h

Issue 1371193005: VM restart + shutdown fixes (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: more code review Created 5 years, 2 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
« no previous file with comments | « runtime/vm/isolate.cc ('k') | runtime/vm/message_handler.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #ifndef VM_MESSAGE_HANDLER_H_ 5 #ifndef VM_MESSAGE_HANDLER_H_
6 #define VM_MESSAGE_HANDLER_H_ 6 #define VM_MESSAGE_HANDLER_H_
7 7
8 #include "vm/isolate.h" 8 #include "vm/isolate.h"
9 #include "vm/message.h" 9 #include "vm/message.h"
10 #include "vm/os_thread.h" 10 #include "vm/os_thread.h"
11 #include "vm/thread_pool.h" 11 #include "vm/thread_pool.h"
12 12
13 namespace dart { 13 namespace dart {
14 14
15 // A MessageHandler is an entity capable of accepting messages. 15 // A MessageHandler is an entity capable of accepting messages.
16 class MessageHandler { 16 class MessageHandler {
17 protected: 17 protected:
18 MessageHandler(); 18 MessageHandler();
19 19
20 public: 20 public:
21 enum MessageStatus {
22 kOK, // We successfully handled a message.
23 kError, // We encountered an error handling a message.
24 kRestart, // The VM is restarting.
25 kShutdown, // The VM is shutting down.
26 };
27 static const char* MessageStatusString(MessageStatus status);
28
21 virtual ~MessageHandler(); 29 virtual ~MessageHandler();
22 30
23 // Allow subclasses to provide a handler name. 31 // Allow subclasses to provide a handler name.
24 virtual const char* name() const; 32 virtual const char* name() const;
25 33
26 typedef uword CallbackData; 34 typedef uword CallbackData;
27 typedef bool (*StartCallback)(CallbackData data); 35 typedef MessageStatus (*StartCallback)(CallbackData data);
28 typedef void (*EndCallback)(CallbackData data); 36 typedef void (*EndCallback)(CallbackData data);
29 37
30 // Runs this message handler on the thread pool. 38 // Runs this message handler on the thread pool.
31 // 39 //
32 // Before processing messages, the optional StartFunction is run. 40 // Before processing messages, the optional StartFunction is run.
33 // 41 //
34 // A message handler will run until it terminates either normally or 42 // A message handler will run until it terminates either normally or
35 // abnormally. Normal termination occurs when the message handler 43 // abnormally. Normal termination occurs when the message handler
36 // no longer has any live ports. Abnormal termination occurs when 44 // no longer has any live ports. Abnormal termination occurs when
37 // HandleMessage() indicates that an error has occurred during 45 // HandleMessage() indicates that an error has occurred during
38 // message processing. 46 // message processing.
39 void Run(ThreadPool* pool, 47 void Run(ThreadPool* pool,
40 StartCallback start_callback, 48 StartCallback start_callback,
41 EndCallback end_callback, 49 EndCallback end_callback,
42 CallbackData data); 50 CallbackData data);
43 51
44 // Handles the next message for this message handler. Should only 52 // Handles the next message for this message handler. Should only
45 // be used when not running the handler on the thread pool (via Run 53 // be used when not running the handler on the thread pool (via Run
46 // or RunBlocking). 54 // or RunBlocking).
47 // 55 //
48 // Returns true on success. 56 // Returns true on success.
49 bool HandleNextMessage(); 57 MessageStatus HandleNextMessage();
50 58
51 // Handles any OOB messages for this message handler. Can be used 59 // Handles any OOB messages for this message handler. Can be used
52 // even if the message handler is running on the thread pool. 60 // even if the message handler is running on the thread pool.
53 // 61 //
54 // Returns true on success. 62 // Returns true on success.
55 bool HandleOOBMessages(); 63 MessageStatus HandleOOBMessages();
56 64
57 // Returns true if there are pending OOB messages for this message 65 // Returns true if there are pending OOB messages for this message
58 // handler. 66 // handler.
59 bool HasOOBMessages(); 67 bool HasOOBMessages();
60 68
61 // A message handler tracks how many live ports it has. 69 // A message handler tracks how many live ports it has.
62 bool HasLivePorts() const { return live_ports_ > 0; } 70 bool HasLivePorts() const { return live_ports_ > 0; }
63 71
64 intptr_t live_ports() const { 72 intptr_t live_ports() const {
65 return live_ports_; 73 return live_ports_;
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 void increment_live_ports(); 180 void increment_live_ports();
173 void decrement_live_ports(); 181 void decrement_live_ports();
174 // ------------ END PortMap API ------------ 182 // ------------ END PortMap API ------------
175 183
176 // Custom message notification. Optionally provided by subclass. 184 // Custom message notification. Optionally provided by subclass.
177 virtual void MessageNotify(Message::Priority priority); 185 virtual void MessageNotify(Message::Priority priority);
178 186
179 // Handles a single message. Provided by subclass. 187 // Handles a single message. Provided by subclass.
180 // 188 //
181 // Returns true on success. 189 // Returns true on success.
182 virtual bool HandleMessage(Message* message) = 0; 190 virtual MessageStatus HandleMessage(Message* message) = 0;
183 191
184 virtual void NotifyPauseOnStart() {} 192 virtual void NotifyPauseOnStart() {}
185 virtual void NotifyPauseOnExit() {} 193 virtual void NotifyPauseOnExit() {}
186 194
187 // TODO(iposva): Set a local field before entering MessageHandler methods. 195 // TODO(iposva): Set a local field before entering MessageHandler methods.
188 Thread* thread() const { return Thread::Current(); } 196 Thread* thread() const { return Thread::Current(); }
189 197
190 private: 198 private:
191 friend class PortMap; 199 friend class PortMap;
192 friend class MessageHandlerTestPeer; 200 friend class MessageHandlerTestPeer;
193 friend class MessageHandlerTask; 201 friend class MessageHandlerTask;
194 202
195 // Called by MessageHandlerTask to process our task queue. 203 // Called by MessageHandlerTask to process our task queue.
196 void TaskCallback(); 204 void TaskCallback();
197 205
198 // Dequeue the next message. Prefer messages from the oob_queue_ to 206 // Dequeue the next message. Prefer messages from the oob_queue_ to
199 // messages from the queue_. 207 // messages from the queue_.
200 Message* DequeueMessage(Message::Priority min_priority); 208 Message* DequeueMessage(Message::Priority min_priority);
201 209
210 void ClearOOBQueue();
211
202 // Handles any pending messages. 212 // Handles any pending messages.
203 bool HandleMessages(bool allow_normal_messages, 213 MessageStatus HandleMessages(bool allow_normal_messages,
204 bool allow_multiple_normal_messages); 214 bool allow_multiple_normal_messages);
205 215
206 Monitor monitor_; // Protects all fields in MessageHandler. 216 Monitor monitor_; // Protects all fields in MessageHandler.
207 MessageQueue* queue_; 217 MessageQueue* queue_;
208 MessageQueue* oob_queue_; 218 MessageQueue* oob_queue_;
209 // This flag is not thread safe and can only reliably be accessed on a single 219 // This flag is not thread safe and can only reliably be accessed on a single
210 // thread. 220 // thread.
211 bool oob_message_handling_allowed_; 221 bool oob_message_handling_allowed_;
212 intptr_t live_ports_; // The number of open ports, including control ports. 222 intptr_t live_ports_; // The number of open ports, including control ports.
213 intptr_t paused_; // The number of pause messages received. 223 intptr_t paused_; // The number of pause messages received.
214 bool pause_on_start_; 224 bool pause_on_start_;
215 bool pause_on_exit_; 225 bool pause_on_exit_;
216 bool paused_on_start_; 226 bool paused_on_start_;
217 bool paused_on_exit_; 227 bool paused_on_exit_;
218 int64_t paused_timestamp_; 228 int64_t paused_timestamp_;
219 ThreadPool* pool_; 229 ThreadPool* pool_;
220 ThreadPool::Task* task_; 230 ThreadPool::Task* task_;
221 StartCallback start_callback_; 231 StartCallback start_callback_;
222 EndCallback end_callback_; 232 EndCallback end_callback_;
223 CallbackData callback_data_; 233 CallbackData callback_data_;
224 234
225 DISALLOW_COPY_AND_ASSIGN(MessageHandler); 235 DISALLOW_COPY_AND_ASSIGN(MessageHandler);
226 }; 236 };
227 237
228 } // namespace dart 238 } // namespace dart
229 239
230 #endif // VM_MESSAGE_HANDLER_H_ 240 #endif // VM_MESSAGE_HANDLER_H_
OLDNEW
« no previous file with comments | « runtime/vm/isolate.cc ('k') | runtime/vm/message_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698