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

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: fix ups 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
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
21 virtual ~MessageHandler(); 28 virtual ~MessageHandler();
22 29
23 // Allow subclasses to provide a handler name. 30 // Allow subclasses to provide a handler name.
24 virtual const char* name() const; 31 virtual const char* name() const;
25 32
26 typedef uword CallbackData; 33 typedef uword CallbackData;
27 typedef bool (*StartCallback)(CallbackData data); 34 typedef MessageStatus (*StartCallback)(CallbackData data);
28 typedef void (*EndCallback)(CallbackData data); 35 typedef void (*EndCallback)(CallbackData data);
29 36
30 // Runs this message handler on the thread pool. 37 // Runs this message handler on the thread pool.
31 // 38 //
32 // Before processing messages, the optional StartFunction is run. 39 // Before processing messages, the optional StartFunction is run.
33 // 40 //
34 // A message handler will run until it terminates either normally or 41 // A message handler will run until it terminates either normally or
35 // abnormally. Normal termination occurs when the message handler 42 // abnormally. Normal termination occurs when the message handler
36 // no longer has any live ports. Abnormal termination occurs when 43 // no longer has any live ports. Abnormal termination occurs when
37 // HandleMessage() indicates that an error has occurred during 44 // HandleMessage() indicates that an error has occurred during
38 // message processing. 45 // message processing.
39 void Run(ThreadPool* pool, 46 void Run(ThreadPool* pool,
40 StartCallback start_callback, 47 StartCallback start_callback,
41 EndCallback end_callback, 48 EndCallback end_callback,
42 CallbackData data); 49 CallbackData data);
43 50
44 // Handles the next message for this message handler. Should only 51 // Handles the next message for this message handler. Should only
45 // be used when not running the handler on the thread pool (via Run 52 // be used when not running the handler on the thread pool (via Run
46 // or RunBlocking). 53 // or RunBlocking).
47 // 54 //
48 // Returns true on success. 55 // Returns true on success.
49 bool HandleNextMessage(); 56 MessageStatus HandleNextMessage();
50 57
51 // Handles any OOB messages for this message handler. Can be used 58 // Handles any OOB messages for this message handler. Can be used
52 // even if the message handler is running on the thread pool. 59 // even if the message handler is running on the thread pool.
53 // 60 //
54 // Returns true on success. 61 // Returns true on success.
55 bool HandleOOBMessages(); 62 MessageStatus HandleOOBMessages();
56 63
57 // Returns true if there are pending OOB messages for this message 64 // Returns true if there are pending OOB messages for this message
58 // handler. 65 // handler.
59 bool HasOOBMessages(); 66 bool HasOOBMessages();
60 67
61 // A message handler tracks how many live ports it has. 68 // A message handler tracks how many live ports it has.
62 bool HasLivePorts() const { return live_ports_ > 0; } 69 bool HasLivePorts() const { return live_ports_ > 0; }
63 70
64 intptr_t live_ports() const { 71 intptr_t live_ports() const {
65 return live_ports_; 72 return live_ports_;
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 void increment_live_ports(); 179 void increment_live_ports();
173 void decrement_live_ports(); 180 void decrement_live_ports();
174 // ------------ END PortMap API ------------ 181 // ------------ END PortMap API ------------
175 182
176 // Custom message notification. Optionally provided by subclass. 183 // Custom message notification. Optionally provided by subclass.
177 virtual void MessageNotify(Message::Priority priority); 184 virtual void MessageNotify(Message::Priority priority);
178 185
179 // Handles a single message. Provided by subclass. 186 // Handles a single message. Provided by subclass.
180 // 187 //
181 // Returns true on success. 188 // Returns true on success.
182 virtual bool HandleMessage(Message* message) = 0; 189 virtual MessageStatus HandleMessage(Message* message) = 0;
183 190
184 virtual void NotifyPauseOnStart() {} 191 virtual void NotifyPauseOnStart() {}
185 virtual void NotifyPauseOnExit() {} 192 virtual void NotifyPauseOnExit() {}
186 193
187 // TODO(iposva): Set a local field before entering MessageHandler methods. 194 // TODO(iposva): Set a local field before entering MessageHandler methods.
188 Thread* thread() const { return Thread::Current(); } 195 Thread* thread() const { return Thread::Current(); }
189 196
190 private: 197 private:
191 friend class PortMap; 198 friend class PortMap;
192 friend class MessageHandlerTestPeer; 199 friend class MessageHandlerTestPeer;
193 friend class MessageHandlerTask; 200 friend class MessageHandlerTask;
194 201
195 // Called by MessageHandlerTask to process our task queue. 202 // Called by MessageHandlerTask to process our task queue.
196 void TaskCallback(); 203 void TaskCallback();
197 204
198 // Dequeue the next message. Prefer messages from the oob_queue_ to 205 // Dequeue the next message. Prefer messages from the oob_queue_ to
199 // messages from the queue_. 206 // messages from the queue_.
200 Message* DequeueMessage(Message::Priority min_priority); 207 Message* DequeueMessage(Message::Priority min_priority);
201 208
209 void ClearOOBQueue();
210
202 // Handles any pending messages. 211 // Handles any pending messages.
203 bool HandleMessages(bool allow_normal_messages, 212 MessageStatus HandleMessages(bool allow_normal_messages,
204 bool allow_multiple_normal_messages); 213 bool allow_multiple_normal_messages);
205 214
206 Monitor monitor_; // Protects all fields in MessageHandler. 215 Monitor monitor_; // Protects all fields in MessageHandler.
207 MessageQueue* queue_; 216 MessageQueue* queue_;
208 MessageQueue* oob_queue_; 217 MessageQueue* oob_queue_;
209 // This flag is not thread safe and can only reliably be accessed on a single 218 // This flag is not thread safe and can only reliably be accessed on a single
210 // thread. 219 // thread.
211 bool oob_message_handling_allowed_; 220 bool oob_message_handling_allowed_;
212 intptr_t live_ports_; // The number of open ports, including control ports. 221 intptr_t live_ports_; // The number of open ports, including control ports.
213 intptr_t paused_; // The number of pause messages received. 222 intptr_t paused_; // The number of pause messages received.
214 bool pause_on_start_; 223 bool pause_on_start_;
215 bool pause_on_exit_; 224 bool pause_on_exit_;
216 bool paused_on_start_; 225 bool paused_on_start_;
217 bool paused_on_exit_; 226 bool paused_on_exit_;
218 int64_t paused_timestamp_; 227 int64_t paused_timestamp_;
219 ThreadPool* pool_; 228 ThreadPool* pool_;
220 ThreadPool::Task* task_; 229 ThreadPool::Task* task_;
221 StartCallback start_callback_; 230 StartCallback start_callback_;
222 EndCallback end_callback_; 231 EndCallback end_callback_;
223 CallbackData callback_data_; 232 CallbackData callback_data_;
224 233
225 DISALLOW_COPY_AND_ASSIGN(MessageHandler); 234 DISALLOW_COPY_AND_ASSIGN(MessageHandler);
226 }; 235 };
227 236
228 } // namespace dart 237 } // namespace dart
229 238
230 #endif // VM_MESSAGE_HANDLER_H_ 239 #endif // VM_MESSAGE_HANDLER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698