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

Side by Side Diff: src/debug.cc

Issue 23748003: Cleanup Semaphore class. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Build fix for Mac OS X. Created 7 years, 3 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
« no previous file with comments | « src/debug.h ('k') | src/debug-agent.h » ('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 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 2596 matching lines...) Expand 10 before | Expand all | Expand 10 after
2607 compiling_natives_(false), 2607 compiling_natives_(false),
2608 is_loading_debugger_(false), 2608 is_loading_debugger_(false),
2609 live_edit_enabled_(true), 2609 live_edit_enabled_(true),
2610 never_unload_debugger_(false), 2610 never_unload_debugger_(false),
2611 force_debugger_active_(false), 2611 force_debugger_active_(false),
2612 message_handler_(NULL), 2612 message_handler_(NULL),
2613 debugger_unload_pending_(false), 2613 debugger_unload_pending_(false),
2614 host_dispatch_handler_(NULL), 2614 host_dispatch_handler_(NULL),
2615 debug_message_dispatch_handler_(NULL), 2615 debug_message_dispatch_handler_(NULL),
2616 message_dispatch_helper_thread_(NULL), 2616 message_dispatch_helper_thread_(NULL),
2617 host_dispatch_micros_(100 * 1000), 2617 host_dispatch_period_(TimeDelta::FromMilliseconds(100)),
2618 agent_(NULL), 2618 agent_(NULL),
2619 command_queue_(isolate->logger(), kQueueInitialSize), 2619 command_queue_(isolate->logger(), kQueueInitialSize),
2620 command_received_(OS::CreateSemaphore(0)), 2620 command_received_(0),
2621 event_command_queue_(isolate->logger(), kQueueInitialSize), 2621 event_command_queue_(isolate->logger(), kQueueInitialSize),
2622 isolate_(isolate) { 2622 isolate_(isolate) {
2623 } 2623 }
2624 2624
2625 2625
2626 Debugger::~Debugger() { 2626 Debugger::~Debugger() {}
2627 delete command_received_;
2628 command_received_ = 0;
2629 }
2630 2627
2631 2628
2632 Handle<Object> Debugger::MakeJSObject(Vector<const char> constructor_name, 2629 Handle<Object> Debugger::MakeJSObject(Vector<const char> constructor_name,
2633 int argc, 2630 int argc,
2634 Handle<Object> argv[], 2631 Handle<Object> argv[],
2635 bool* caught_exception) { 2632 bool* caught_exception) {
2636 ASSERT(isolate_->context() == *isolate_->debug()->debug_context()); 2633 ASSERT(isolate_->context() == *isolate_->debug()->debug_context());
2637 2634
2638 // Create the execution state object. 2635 // Create the execution state object.
2639 Handle<String> constructor_str = 2636 Handle<String> constructor_str =
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after
3142 } 3139 }
3143 } 3140 }
3144 3141
3145 bool running = auto_continue; 3142 bool running = auto_continue;
3146 3143
3147 // Process requests from the debugger. 3144 // Process requests from the debugger.
3148 while (true) { 3145 while (true) {
3149 // Wait for new command in the queue. 3146 // Wait for new command in the queue.
3150 if (Debugger::host_dispatch_handler_) { 3147 if (Debugger::host_dispatch_handler_) {
3151 // In case there is a host dispatch - do periodic dispatches. 3148 // In case there is a host dispatch - do periodic dispatches.
3152 if (!command_received_->Wait(host_dispatch_micros_)) { 3149 if (!command_received_.WaitFor(host_dispatch_period_)) {
3153 // Timout expired, do the dispatch. 3150 // Timout expired, do the dispatch.
3154 Debugger::host_dispatch_handler_(); 3151 Debugger::host_dispatch_handler_();
3155 continue; 3152 continue;
3156 } 3153 }
3157 } else { 3154 } else {
3158 // In case there is no host dispatch - just wait. 3155 // In case there is no host dispatch - just wait.
3159 command_received_->Wait(); 3156 command_received_.Wait();
3160 } 3157 }
3161 3158
3162 // Get the command from the queue. 3159 // Get the command from the queue.
3163 CommandMessage command = command_queue_.Get(); 3160 CommandMessage command = command_queue_.Get();
3164 isolate_->logger()->DebugTag( 3161 isolate_->logger()->DebugTag(
3165 "Got request from command queue, in interactive loop."); 3162 "Got request from command queue, in interactive loop.");
3166 if (!Debugger::IsDebuggerActive()) { 3163 if (!Debugger::IsDebuggerActive()) {
3167 // Delete command text and user data. 3164 // Delete command text and user data.
3168 command.Dispose(); 3165 command.Dispose();
3169 return; 3166 return;
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
3291 } else { 3288 } else {
3292 isolate_->compilation_cache()->Enable(); 3289 isolate_->compilation_cache()->Enable();
3293 // Unload the debugger if event listener and message handler cleared. 3290 // Unload the debugger if event listener and message handler cleared.
3294 // Schedule this for later, because we may be in non-V8 thread. 3291 // Schedule this for later, because we may be in non-V8 thread.
3295 debugger_unload_pending_ = true; 3292 debugger_unload_pending_ = true;
3296 } 3293 }
3297 } 3294 }
3298 3295
3299 3296
3300 void Debugger::SetHostDispatchHandler(v8::Debug::HostDispatchHandler handler, 3297 void Debugger::SetHostDispatchHandler(v8::Debug::HostDispatchHandler handler,
3301 int period) { 3298 TimeDelta period) {
3302 host_dispatch_handler_ = handler; 3299 host_dispatch_handler_ = handler;
3303 host_dispatch_micros_ = period * 1000; 3300 host_dispatch_period_ = period;
3304 } 3301 }
3305 3302
3306 3303
3307 void Debugger::SetDebugMessageDispatchHandler( 3304 void Debugger::SetDebugMessageDispatchHandler(
3308 v8::Debug::DebugMessageDispatchHandler handler, bool provide_locker) { 3305 v8::Debug::DebugMessageDispatchHandler handler, bool provide_locker) {
3309 LockGuard<Mutex> lock_guard(&dispatch_handler_access_); 3306 LockGuard<Mutex> lock_guard(&dispatch_handler_access_);
3310 debug_message_dispatch_handler_ = handler; 3307 debug_message_dispatch_handler_ = handler;
3311 3308
3312 if (provide_locker && message_dispatch_helper_thread_ == NULL) { 3309 if (provide_locker && message_dispatch_helper_thread_ == NULL) {
3313 message_dispatch_helper_thread_ = new MessageDispatchHelperThread(isolate_); 3310 message_dispatch_helper_thread_ = new MessageDispatchHelperThread(isolate_);
(...skipping 19 matching lines...) Expand all
3333 // by the API client thread. 3330 // by the API client thread.
3334 void Debugger::ProcessCommand(Vector<const uint16_t> command, 3331 void Debugger::ProcessCommand(Vector<const uint16_t> command,
3335 v8::Debug::ClientData* client_data) { 3332 v8::Debug::ClientData* client_data) {
3336 // Need to cast away const. 3333 // Need to cast away const.
3337 CommandMessage message = CommandMessage::New( 3334 CommandMessage message = CommandMessage::New(
3338 Vector<uint16_t>(const_cast<uint16_t*>(command.start()), 3335 Vector<uint16_t>(const_cast<uint16_t*>(command.start()),
3339 command.length()), 3336 command.length()),
3340 client_data); 3337 client_data);
3341 isolate_->logger()->DebugTag("Put command on command_queue."); 3338 isolate_->logger()->DebugTag("Put command on command_queue.");
3342 command_queue_.Put(message); 3339 command_queue_.Put(message);
3343 command_received_->Signal(); 3340 command_received_.Signal();
3344 3341
3345 // Set the debug command break flag to have the command processed. 3342 // Set the debug command break flag to have the command processed.
3346 if (!isolate_->debug()->InDebugger()) { 3343 if (!isolate_->debug()->InDebugger()) {
3347 isolate_->stack_guard()->DebugCommand(); 3344 isolate_->stack_guard()->DebugCommand();
3348 } 3345 }
3349 3346
3350 MessageDispatchHelperThread* dispatch_thread; 3347 MessageDispatchHelperThread* dispatch_thread;
3351 { 3348 {
3352 LockGuard<Mutex> lock_guard(&dispatch_handler_access_); 3349 LockGuard<Mutex> lock_guard(&dispatch_handler_access_);
3353 dispatch_thread = message_dispatch_helper_thread_; 3350 dispatch_thread = message_dispatch_helper_thread_;
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after
3815 3812
3816 3813
3817 void LockingCommandMessageQueue::Clear() { 3814 void LockingCommandMessageQueue::Clear() {
3818 LockGuard<Mutex> lock_guard(&mutex_); 3815 LockGuard<Mutex> lock_guard(&mutex_);
3819 queue_.Clear(); 3816 queue_.Clear();
3820 } 3817 }
3821 3818
3822 3819
3823 MessageDispatchHelperThread::MessageDispatchHelperThread(Isolate* isolate) 3820 MessageDispatchHelperThread::MessageDispatchHelperThread(Isolate* isolate)
3824 : Thread("v8:MsgDispHelpr"), 3821 : Thread("v8:MsgDispHelpr"),
3825 isolate_(isolate), sem_(OS::CreateSemaphore(0)), 3822 isolate_(isolate), sem_(0),
3826 already_signalled_(false) { 3823 already_signalled_(false) {
3827 } 3824 }
3828 3825
3829 3826
3830 MessageDispatchHelperThread::~MessageDispatchHelperThread() {
3831 delete sem_;
3832 }
3833
3834
3835 void MessageDispatchHelperThread::Schedule() { 3827 void MessageDispatchHelperThread::Schedule() {
3836 { 3828 {
3837 LockGuard<Mutex> lock_guard(&mutex_); 3829 LockGuard<Mutex> lock_guard(&mutex_);
3838 if (already_signalled_) { 3830 if (already_signalled_) {
3839 return; 3831 return;
3840 } 3832 }
3841 already_signalled_ = true; 3833 already_signalled_ = true;
3842 } 3834 }
3843 sem_->Signal(); 3835 sem_.Signal();
3844 } 3836 }
3845 3837
3846 3838
3847 void MessageDispatchHelperThread::Run() { 3839 void MessageDispatchHelperThread::Run() {
3848 while (true) { 3840 while (true) {
3849 sem_->Wait(); 3841 sem_.Wait();
3850 { 3842 {
3851 LockGuard<Mutex> lock_guard(&mutex_); 3843 LockGuard<Mutex> lock_guard(&mutex_);
3852 already_signalled_ = false; 3844 already_signalled_ = false;
3853 } 3845 }
3854 { 3846 {
3855 Locker locker(reinterpret_cast<v8::Isolate*>(isolate_)); 3847 Locker locker(reinterpret_cast<v8::Isolate*>(isolate_));
3856 isolate_->debugger()->CallMessageDispatchHandler(); 3848 isolate_->debugger()->CallMessageDispatchHandler();
3857 } 3849 }
3858 } 3850 }
3859 } 3851 }
3860 3852
3861 #endif // ENABLE_DEBUGGER_SUPPORT 3853 #endif // ENABLE_DEBUGGER_SUPPORT
3862 3854
3863 } } // namespace v8::internal 3855 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/debug.h ('k') | src/debug-agent.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698