| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 2587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2598 event_listener_(Handle<Object>()), | 2598 event_listener_(Handle<Object>()), |
| 2599 event_listener_data_(Handle<Object>()), | 2599 event_listener_data_(Handle<Object>()), |
| 2600 compiling_natives_(false), | 2600 compiling_natives_(false), |
| 2601 is_loading_debugger_(false), | 2601 is_loading_debugger_(false), |
| 2602 live_edit_enabled_(true), | 2602 live_edit_enabled_(true), |
| 2603 never_unload_debugger_(false), | 2603 never_unload_debugger_(false), |
| 2604 force_debugger_active_(false), | 2604 force_debugger_active_(false), |
| 2605 message_handler_(NULL), | 2605 message_handler_(NULL), |
| 2606 debugger_unload_pending_(false), | 2606 debugger_unload_pending_(false), |
| 2607 host_dispatch_handler_(NULL), | 2607 host_dispatch_handler_(NULL), |
| 2608 dispatch_handler_access_(OS::CreateMutex()), | |
| 2609 debug_message_dispatch_handler_(NULL), | 2608 debug_message_dispatch_handler_(NULL), |
| 2610 message_dispatch_helper_thread_(NULL), | 2609 message_dispatch_helper_thread_(NULL), |
| 2611 host_dispatch_micros_(100 * 1000), | 2610 host_dispatch_micros_(100 * 1000), |
| 2612 agent_(NULL), | 2611 agent_(NULL), |
| 2613 command_queue_(isolate->logger(), kQueueInitialSize), | 2612 command_queue_(isolate->logger(), kQueueInitialSize), |
| 2614 command_received_(OS::CreateSemaphore(0)), | 2613 command_received_(OS::CreateSemaphore(0)), |
| 2615 event_command_queue_(isolate->logger(), kQueueInitialSize), | 2614 event_command_queue_(isolate->logger(), kQueueInitialSize), |
| 2616 isolate_(isolate) { | 2615 isolate_(isolate) { |
| 2617 } | 2616 } |
| 2618 | 2617 |
| 2619 | 2618 |
| 2620 Debugger::~Debugger() { | 2619 Debugger::~Debugger() { |
| 2621 delete dispatch_handler_access_; | |
| 2622 dispatch_handler_access_ = 0; | |
| 2623 delete command_received_; | 2620 delete command_received_; |
| 2624 command_received_ = 0; | 2621 command_received_ = 0; |
| 2625 } | 2622 } |
| 2626 | 2623 |
| 2627 | 2624 |
| 2628 Handle<Object> Debugger::MakeJSObject(Vector<const char> constructor_name, | 2625 Handle<Object> Debugger::MakeJSObject(Vector<const char> constructor_name, |
| 2629 int argc, | 2626 int argc, |
| 2630 Handle<Object> argv[], | 2627 Handle<Object> argv[], |
| 2631 bool* caught_exception) { | 2628 bool* caught_exception) { |
| 2632 ASSERT(isolate_->context() == *isolate_->debug()->debug_context()); | 2629 ASSERT(isolate_->context() == *isolate_->debug()->debug_context()); |
| (...skipping 662 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3295 | 3292 |
| 3296 void Debugger::SetHostDispatchHandler(v8::Debug::HostDispatchHandler handler, | 3293 void Debugger::SetHostDispatchHandler(v8::Debug::HostDispatchHandler handler, |
| 3297 int period) { | 3294 int period) { |
| 3298 host_dispatch_handler_ = handler; | 3295 host_dispatch_handler_ = handler; |
| 3299 host_dispatch_micros_ = period * 1000; | 3296 host_dispatch_micros_ = period * 1000; |
| 3300 } | 3297 } |
| 3301 | 3298 |
| 3302 | 3299 |
| 3303 void Debugger::SetDebugMessageDispatchHandler( | 3300 void Debugger::SetDebugMessageDispatchHandler( |
| 3304 v8::Debug::DebugMessageDispatchHandler handler, bool provide_locker) { | 3301 v8::Debug::DebugMessageDispatchHandler handler, bool provide_locker) { |
| 3305 ScopedLock with(dispatch_handler_access_); | 3302 ScopedLock with(&dispatch_handler_access_); |
| 3306 debug_message_dispatch_handler_ = handler; | 3303 debug_message_dispatch_handler_ = handler; |
| 3307 | 3304 |
| 3308 if (provide_locker && message_dispatch_helper_thread_ == NULL) { | 3305 if (provide_locker && message_dispatch_helper_thread_ == NULL) { |
| 3309 message_dispatch_helper_thread_ = new MessageDispatchHelperThread(isolate_); | 3306 message_dispatch_helper_thread_ = new MessageDispatchHelperThread(isolate_); |
| 3310 message_dispatch_helper_thread_->Start(); | 3307 message_dispatch_helper_thread_->Start(); |
| 3311 } | 3308 } |
| 3312 } | 3309 } |
| 3313 | 3310 |
| 3314 | 3311 |
| 3315 // Calls the registered debug message handler. This callback is part of the | 3312 // Calls the registered debug message handler. This callback is part of the |
| (...skipping 22 matching lines...) Expand all Loading... |
| 3338 command_queue_.Put(message); | 3335 command_queue_.Put(message); |
| 3339 command_received_->Signal(); | 3336 command_received_->Signal(); |
| 3340 | 3337 |
| 3341 // Set the debug command break flag to have the command processed. | 3338 // Set the debug command break flag to have the command processed. |
| 3342 if (!isolate_->debug()->InDebugger()) { | 3339 if (!isolate_->debug()->InDebugger()) { |
| 3343 isolate_->stack_guard()->DebugCommand(); | 3340 isolate_->stack_guard()->DebugCommand(); |
| 3344 } | 3341 } |
| 3345 | 3342 |
| 3346 MessageDispatchHelperThread* dispatch_thread; | 3343 MessageDispatchHelperThread* dispatch_thread; |
| 3347 { | 3344 { |
| 3348 ScopedLock with(dispatch_handler_access_); | 3345 ScopedLock with(&dispatch_handler_access_); |
| 3349 dispatch_thread = message_dispatch_helper_thread_; | 3346 dispatch_thread = message_dispatch_helper_thread_; |
| 3350 } | 3347 } |
| 3351 | 3348 |
| 3352 if (dispatch_thread == NULL) { | 3349 if (dispatch_thread == NULL) { |
| 3353 CallMessageDispatchHandler(); | 3350 CallMessageDispatchHandler(); |
| 3354 } else { | 3351 } else { |
| 3355 dispatch_thread->Schedule(); | 3352 dispatch_thread->Schedule(); |
| 3356 } | 3353 } |
| 3357 } | 3354 } |
| 3358 | 3355 |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3458 void Debugger::WaitForAgent() { | 3455 void Debugger::WaitForAgent() { |
| 3459 ASSERT(Isolate::Current() == isolate_); | 3456 ASSERT(Isolate::Current() == isolate_); |
| 3460 if (agent_ != NULL) | 3457 if (agent_ != NULL) |
| 3461 agent_->WaitUntilListening(); | 3458 agent_->WaitUntilListening(); |
| 3462 } | 3459 } |
| 3463 | 3460 |
| 3464 | 3461 |
| 3465 void Debugger::CallMessageDispatchHandler() { | 3462 void Debugger::CallMessageDispatchHandler() { |
| 3466 v8::Debug::DebugMessageDispatchHandler handler; | 3463 v8::Debug::DebugMessageDispatchHandler handler; |
| 3467 { | 3464 { |
| 3468 ScopedLock with(dispatch_handler_access_); | 3465 ScopedLock with(&dispatch_handler_access_); |
| 3469 handler = Debugger::debug_message_dispatch_handler_; | 3466 handler = Debugger::debug_message_dispatch_handler_; |
| 3470 } | 3467 } |
| 3471 if (handler != NULL) { | 3468 if (handler != NULL) { |
| 3472 handler(); | 3469 handler(); |
| 3473 } | 3470 } |
| 3474 } | 3471 } |
| 3475 | 3472 |
| 3476 | 3473 |
| 3477 EnterDebugger::EnterDebugger() | 3474 EnterDebugger::EnterDebugger() |
| 3478 : isolate_(Isolate::Current()), | 3475 : isolate_(Isolate::Current()), |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3779 CommandMessage* array_to_free = messages_; | 3776 CommandMessage* array_to_free = messages_; |
| 3780 *this = new_queue; | 3777 *this = new_queue; |
| 3781 new_queue.messages_ = array_to_free; | 3778 new_queue.messages_ = array_to_free; |
| 3782 // Make the new_queue empty so that it doesn't call Dispose on any messages. | 3779 // Make the new_queue empty so that it doesn't call Dispose on any messages. |
| 3783 new_queue.start_ = new_queue.end_; | 3780 new_queue.start_ = new_queue.end_; |
| 3784 // Automatic destructor called on new_queue, freeing array_to_free. | 3781 // Automatic destructor called on new_queue, freeing array_to_free. |
| 3785 } | 3782 } |
| 3786 | 3783 |
| 3787 | 3784 |
| 3788 LockingCommandMessageQueue::LockingCommandMessageQueue(Logger* logger, int size) | 3785 LockingCommandMessageQueue::LockingCommandMessageQueue(Logger* logger, int size) |
| 3789 : logger_(logger), queue_(size) { | 3786 : logger_(logger), queue_(size) {} |
| 3790 lock_ = OS::CreateMutex(); | |
| 3791 } | |
| 3792 | 3787 |
| 3793 | 3788 |
| 3794 LockingCommandMessageQueue::~LockingCommandMessageQueue() { | 3789 LockingCommandMessageQueue::~LockingCommandMessageQueue() {} |
| 3795 delete lock_; | |
| 3796 } | |
| 3797 | 3790 |
| 3798 | 3791 |
| 3799 bool LockingCommandMessageQueue::IsEmpty() const { | 3792 bool LockingCommandMessageQueue::IsEmpty() { |
| 3800 ScopedLock sl(lock_); | 3793 ScopedLock sl(&lock_); |
| 3801 return queue_.IsEmpty(); | 3794 return queue_.IsEmpty(); |
| 3802 } | 3795 } |
| 3803 | 3796 |
| 3804 | 3797 |
| 3805 CommandMessage LockingCommandMessageQueue::Get() { | 3798 CommandMessage LockingCommandMessageQueue::Get() { |
| 3806 ScopedLock sl(lock_); | 3799 ScopedLock sl(&lock_); |
| 3807 CommandMessage result = queue_.Get(); | 3800 CommandMessage result = queue_.Get(); |
| 3808 logger_->DebugEvent("Get", result.text()); | 3801 logger_->DebugEvent("Get", result.text()); |
| 3809 return result; | 3802 return result; |
| 3810 } | 3803 } |
| 3811 | 3804 |
| 3812 | 3805 |
| 3813 void LockingCommandMessageQueue::Put(const CommandMessage& message) { | 3806 void LockingCommandMessageQueue::Put(const CommandMessage& message) { |
| 3814 ScopedLock sl(lock_); | 3807 ScopedLock sl(&lock_); |
| 3815 queue_.Put(message); | 3808 queue_.Put(message); |
| 3816 logger_->DebugEvent("Put", message.text()); | 3809 logger_->DebugEvent("Put", message.text()); |
| 3817 } | 3810 } |
| 3818 | 3811 |
| 3819 | 3812 |
| 3820 void LockingCommandMessageQueue::Clear() { | 3813 void LockingCommandMessageQueue::Clear() { |
| 3821 ScopedLock sl(lock_); | 3814 ScopedLock sl(&lock_); |
| 3822 queue_.Clear(); | 3815 queue_.Clear(); |
| 3823 } | 3816 } |
| 3824 | 3817 |
| 3825 | 3818 |
| 3826 MessageDispatchHelperThread::MessageDispatchHelperThread(Isolate* isolate) | 3819 MessageDispatchHelperThread::MessageDispatchHelperThread(Isolate* isolate) |
| 3827 : Thread("v8:MsgDispHelpr"), | 3820 : Thread("v8:MsgDispHelpr"), |
| 3828 isolate_(isolate), sem_(OS::CreateSemaphore(0)), | 3821 isolate_(isolate), sem_(OS::CreateSemaphore(0)), |
| 3829 mutex_(OS::CreateMutex()), already_signalled_(false) { | 3822 already_signalled_(false) {} |
| 3830 } | |
| 3831 | 3823 |
| 3832 | 3824 |
| 3833 MessageDispatchHelperThread::~MessageDispatchHelperThread() { | 3825 MessageDispatchHelperThread::~MessageDispatchHelperThread() { |
| 3834 delete mutex_; | |
| 3835 delete sem_; | 3826 delete sem_; |
| 3836 } | 3827 } |
| 3837 | 3828 |
| 3838 | 3829 |
| 3839 void MessageDispatchHelperThread::Schedule() { | 3830 void MessageDispatchHelperThread::Schedule() { |
| 3840 { | 3831 { |
| 3841 ScopedLock lock(mutex_); | 3832 ScopedLock lock(&mutex_); |
| 3842 if (already_signalled_) { | 3833 if (already_signalled_) { |
| 3843 return; | 3834 return; |
| 3844 } | 3835 } |
| 3845 already_signalled_ = true; | 3836 already_signalled_ = true; |
| 3846 } | 3837 } |
| 3847 sem_->Signal(); | 3838 sem_->Signal(); |
| 3848 } | 3839 } |
| 3849 | 3840 |
| 3850 | 3841 |
| 3851 void MessageDispatchHelperThread::Run() { | 3842 void MessageDispatchHelperThread::Run() { |
| 3852 while (true) { | 3843 while (true) { |
| 3853 sem_->Wait(); | 3844 sem_->Wait(); |
| 3854 { | 3845 { |
| 3855 ScopedLock lock(mutex_); | 3846 ScopedLock lock(&mutex_); |
| 3856 already_signalled_ = false; | 3847 already_signalled_ = false; |
| 3857 } | 3848 } |
| 3858 { | 3849 { |
| 3859 Locker locker(reinterpret_cast<v8::Isolate*>(isolate_)); | 3850 Locker locker(reinterpret_cast<v8::Isolate*>(isolate_)); |
| 3860 isolate_->debugger()->CallMessageDispatchHandler(); | 3851 isolate_->debugger()->CallMessageDispatchHandler(); |
| 3861 } | 3852 } |
| 3862 } | 3853 } |
| 3863 } | 3854 } |
| 3864 | 3855 |
| 3865 #endif // ENABLE_DEBUGGER_SUPPORT | 3856 #endif // ENABLE_DEBUGGER_SUPPORT |
| 3866 | 3857 |
| 3867 } } // namespace v8::internal | 3858 } } // namespace v8::internal |
| OLD | NEW |