| 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 #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" |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 EndCallback end_callback, | 49 EndCallback end_callback, |
| 50 CallbackData data); | 50 CallbackData data); |
| 51 | 51 |
| 52 // Handles the next message for this message handler. Should only | 52 // Handles the next message for this message handler. Should only |
| 53 // 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 |
| 54 // or RunBlocking). | 54 // or RunBlocking). |
| 55 // | 55 // |
| 56 // Returns true on success. | 56 // Returns true on success. |
| 57 MessageStatus HandleNextMessage(); | 57 MessageStatus HandleNextMessage(); |
| 58 | 58 |
| 59 // Handles all messages for this message handler. Should only |
| 60 // be used when not running the handler on the thread pool (via Run |
| 61 // or RunBlocking). |
| 62 // |
| 63 // Returns true on success. |
| 64 MessageStatus HandleAllMessages(); |
| 65 |
| 59 // Handles any OOB messages for this message handler. Can be used | 66 // Handles any OOB messages for this message handler. Can be used |
| 60 // even if the message handler is running on the thread pool. | 67 // even if the message handler is running on the thread pool. |
| 61 // | 68 // |
| 62 // Returns true on success. | 69 // Returns true on success. |
| 63 MessageStatus HandleOOBMessages(); | 70 MessageStatus HandleOOBMessages(); |
| 64 | 71 |
| 65 // Returns true if there are pending OOB messages for this message | 72 // Returns true if there are pending OOB messages for this message |
| 66 // handler. | 73 // handler. |
| 67 bool HasOOBMessages(); | 74 bool HasOOBMessages(); |
| 68 | 75 |
| 69 // A message handler tracks how many live ports it has. | 76 // A message handler tracks how many live ports it has. |
| 70 bool HasLivePorts() const { return live_ports_ > 0; } | 77 bool HasLivePorts() const { return live_ports_ > 0; } |
| 71 | 78 |
| 72 intptr_t live_ports() const { | 79 intptr_t live_ports() const { |
| 73 return live_ports_; | 80 return live_ports_; |
| 74 } | 81 } |
| 75 | 82 |
| 76 bool paused() const { return paused_ > 0; } | 83 bool paused() const { return paused_ > 0; } |
| 77 | 84 |
| 78 void increment_paused() { paused_++; } | 85 void increment_paused() { paused_++; } |
| 79 void decrement_paused() { ASSERT(paused_ > 0); paused_--; } | 86 void decrement_paused() { ASSERT(paused_ > 0); paused_--; } |
| 80 | 87 |
| 81 bool pause_on_start() const { | 88 bool ShouldPauseOnStart(MessageStatus status) const; |
| 82 return pause_on_start_; | 89 bool should_pause_on_start() const { |
| 90 return should_pause_on_start_; |
| 83 } | 91 } |
| 84 | 92 |
| 85 void set_pause_on_start(bool pause_on_start) { | 93 void set_should_pause_on_start(bool should_pause_on_start) { |
| 86 pause_on_start_ = pause_on_start; | 94 should_pause_on_start_ = should_pause_on_start; |
| 87 } | 95 } |
| 88 | 96 |
| 89 bool paused_on_start() const { | 97 bool is_paused_on_start() const { |
| 90 // If pause_on_start_ is still set, tell the user we are paused, | 98 return is_paused_on_start_; |
| 91 // even if we haven't hit the pause point yet. | |
| 92 return paused_on_start_; | |
| 93 } | 99 } |
| 94 | 100 |
| 95 bool pause_on_exit() const { | 101 bool ShouldPauseOnExit(MessageStatus status) const; |
| 96 return pause_on_exit_; | 102 bool should_pause_on_exit() const { |
| 103 return should_pause_on_exit_; |
| 97 } | 104 } |
| 98 | 105 |
| 99 void set_pause_on_exit(bool pause_on_exit) { | 106 void set_should_pause_on_exit(bool should_pause_on_exit) { |
| 100 pause_on_exit_ = pause_on_exit; | 107 should_pause_on_exit_ = should_pause_on_exit; |
| 101 } | 108 } |
| 102 | 109 |
| 103 bool paused_on_exit() const { | 110 bool is_paused_on_exit() const { |
| 104 return paused_on_exit_; | 111 return is_paused_on_exit_; |
| 105 } | 112 } |
| 106 | 113 |
| 107 // Timestamp of the paused on start or paused on exit. | 114 // Timestamp of the paused on start or paused on exit. |
| 108 int64_t paused_timestamp() const { | 115 int64_t paused_timestamp() const { |
| 109 return paused_timestamp_; | 116 return paused_timestamp_; |
| 110 } | 117 } |
| 111 | 118 |
| 119 void PausedOnStart(bool paused); |
| 120 void PausedOnExit(bool paused); |
| 121 |
| 112 class AcquiredQueues : public ValueObject { | 122 class AcquiredQueues : public ValueObject { |
| 113 public: | 123 public: |
| 114 AcquiredQueues(); | 124 AcquiredQueues(); |
| 115 | 125 |
| 116 ~AcquiredQueues(); | 126 ~AcquiredQueues(); |
| 117 | 127 |
| 118 MessageQueue* queue() { | 128 MessageQueue* queue() { |
| 119 if (handler_ == NULL) { | 129 if (handler_ == NULL) { |
| 120 return NULL; | 130 return NULL; |
| 121 } | 131 } |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 Thread* thread() const { return Thread::Current(); } | 206 Thread* thread() const { return Thread::Current(); } |
| 197 | 207 |
| 198 private: | 208 private: |
| 199 friend class PortMap; | 209 friend class PortMap; |
| 200 friend class MessageHandlerTestPeer; | 210 friend class MessageHandlerTestPeer; |
| 201 friend class MessageHandlerTask; | 211 friend class MessageHandlerTask; |
| 202 | 212 |
| 203 // Called by MessageHandlerTask to process our task queue. | 213 // Called by MessageHandlerTask to process our task queue. |
| 204 void TaskCallback(); | 214 void TaskCallback(); |
| 205 | 215 |
| 216 // NOTE: These two functions release and reacquire the monitor, you may |
| 217 // need to call HandleMessages to ensure all pending messages are handled. |
| 218 void PausedOnStartLocked(bool paused); |
| 219 void PausedOnExitLocked(bool paused); |
| 220 |
| 206 // Dequeue the next message. Prefer messages from the oob_queue_ to | 221 // Dequeue the next message. Prefer messages from the oob_queue_ to |
| 207 // messages from the queue_. | 222 // messages from the queue_. |
| 208 Message* DequeueMessage(Message::Priority min_priority); | 223 Message* DequeueMessage(Message::Priority min_priority); |
| 209 | 224 |
| 210 void ClearOOBQueue(); | 225 void ClearOOBQueue(); |
| 211 | 226 |
| 212 // Handles any pending messages. | 227 // Handles any pending messages. |
| 213 MessageStatus HandleMessages(bool allow_normal_messages, | 228 MessageStatus HandleMessages(bool allow_normal_messages, |
| 214 bool allow_multiple_normal_messages); | 229 bool allow_multiple_normal_messages); |
| 215 | 230 |
| 216 Monitor monitor_; // Protects all fields in MessageHandler. | 231 Monitor monitor_; // Protects all fields in MessageHandler. |
| 217 MessageQueue* queue_; | 232 MessageQueue* queue_; |
| 218 MessageQueue* oob_queue_; | 233 MessageQueue* oob_queue_; |
| 219 // This flag is not thread safe and can only reliably be accessed on a single | 234 // This flag is not thread safe and can only reliably be accessed on a single |
| 220 // thread. | 235 // thread. |
| 221 bool oob_message_handling_allowed_; | 236 bool oob_message_handling_allowed_; |
| 222 intptr_t live_ports_; // The number of open ports, including control ports. | 237 intptr_t live_ports_; // The number of open ports, including control ports. |
| 223 intptr_t paused_; // The number of pause messages received. | 238 intptr_t paused_; // The number of pause messages received. |
| 224 bool pause_on_start_; | 239 bool should_pause_on_start_; |
| 225 bool pause_on_exit_; | 240 bool should_pause_on_exit_; |
| 226 bool paused_on_start_; | 241 bool is_paused_on_start_; |
| 227 bool paused_on_exit_; | 242 bool is_paused_on_exit_; |
| 228 int64_t paused_timestamp_; | 243 int64_t paused_timestamp_; |
| 229 ThreadPool* pool_; | 244 ThreadPool* pool_; |
| 230 ThreadPool::Task* task_; | 245 ThreadPool::Task* task_; |
| 231 StartCallback start_callback_; | 246 StartCallback start_callback_; |
| 232 EndCallback end_callback_; | 247 EndCallback end_callback_; |
| 233 CallbackData callback_data_; | 248 CallbackData callback_data_; |
| 234 | 249 |
| 235 DISALLOW_COPY_AND_ASSIGN(MessageHandler); | 250 DISALLOW_COPY_AND_ASSIGN(MessageHandler); |
| 236 }; | 251 }; |
| 237 | 252 |
| 238 } // namespace dart | 253 } // namespace dart |
| 239 | 254 |
| 240 #endif // VM_MESSAGE_HANDLER_H_ | 255 #endif // VM_MESSAGE_HANDLER_H_ |
| OLD | NEW |