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

Side by Side Diff: src/debug.h

Issue 505025: Implement issue 549 Make V8 call DebugMessageDispatchHandler with Locker locked (Closed)
Patch Set: move debug command back Created 10 years, 11 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 | « src/api.cc ('k') | src/debug.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 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 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 541 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 // Doubles the size of the message queue, and copies the messages. 552 // Doubles the size of the message queue, and copies the messages.
553 void Expand(); 553 void Expand();
554 554
555 CommandMessage* messages_; 555 CommandMessage* messages_;
556 int start_; 556 int start_;
557 int end_; 557 int end_;
558 int size_; // The size of the queue buffer. Queue can hold size-1 messages. 558 int size_; // The size of the queue buffer. Queue can hold size-1 messages.
559 }; 559 };
560 560
561 561
562 class MessageDispatchHelperThread;
563
564
562 // LockingCommandMessageQueue is a thread-safe circular buffer of CommandMessage 565 // LockingCommandMessageQueue is a thread-safe circular buffer of CommandMessage
563 // messages. The message data is not managed by LockingCommandMessageQueue. 566 // messages. The message data is not managed by LockingCommandMessageQueue.
564 // Pointers to the data are passed in and out. Implemented by adding a 567 // Pointers to the data are passed in and out. Implemented by adding a
565 // Mutex to CommandMessageQueue. Includes logging of all puts and gets. 568 // Mutex to CommandMessageQueue. Includes logging of all puts and gets.
566 class LockingCommandMessageQueue BASE_EMBEDDED { 569 class LockingCommandMessageQueue BASE_EMBEDDED {
567 public: 570 public:
568 explicit LockingCommandMessageQueue(int size); 571 explicit LockingCommandMessageQueue(int size);
569 ~LockingCommandMessageQueue(); 572 ~LockingCommandMessageQueue();
570 bool IsEmpty() const; 573 bool IsEmpty() const;
571 CommandMessage Get(); 574 CommandMessage Get();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 bool auto_continue); 615 bool auto_continue);
613 static void NotifyMessageHandler(v8::DebugEvent event, 616 static void NotifyMessageHandler(v8::DebugEvent event,
614 Handle<JSObject> exec_state, 617 Handle<JSObject> exec_state,
615 Handle<JSObject> event_data, 618 Handle<JSObject> event_data,
616 bool auto_continue); 619 bool auto_continue);
617 static void SetEventListener(Handle<Object> callback, Handle<Object> data); 620 static void SetEventListener(Handle<Object> callback, Handle<Object> data);
618 static void SetMessageHandler(v8::Debug::MessageHandler2 handler); 621 static void SetMessageHandler(v8::Debug::MessageHandler2 handler);
619 static void SetHostDispatchHandler(v8::Debug::HostDispatchHandler handler, 622 static void SetHostDispatchHandler(v8::Debug::HostDispatchHandler handler,
620 int period); 623 int period);
621 static void SetDebugMessageDispatchHandler( 624 static void SetDebugMessageDispatchHandler(
622 v8::Debug::DebugMessageDispatchHandler handler); 625 v8::Debug::DebugMessageDispatchHandler handler,
626 bool provide_locker);
623 627
624 // Invoke the message handler function. 628 // Invoke the message handler function.
625 static void InvokeMessageHandler(MessageImpl message); 629 static void InvokeMessageHandler(MessageImpl message);
626 630
627 // Add a debugger command to the command queue. 631 // Add a debugger command to the command queue.
628 static void ProcessCommand(Vector<const uint16_t> command, 632 static void ProcessCommand(Vector<const uint16_t> command,
629 v8::Debug::ClientData* client_data = NULL); 633 v8::Debug::ClientData* client_data = NULL);
630 634
631 // Check whether there are commands in the command queue. 635 // Check whether there are commands in the command queue.
632 static bool HasCommands(); 636 static bool HasCommands();
633 637
634 static Handle<Object> Call(Handle<JSFunction> fun, 638 static Handle<Object> Call(Handle<JSFunction> fun,
635 Handle<Object> data, 639 Handle<Object> data,
636 bool* pending_exception); 640 bool* pending_exception);
637 641
638 // Start the debugger agent listening on the provided port. 642 // Start the debugger agent listening on the provided port.
639 static bool StartAgent(const char* name, int port, 643 static bool StartAgent(const char* name, int port,
640 bool wait_for_connection = false); 644 bool wait_for_connection = false);
641 645
642 // Stop the debugger agent. 646 // Stop the debugger agent.
643 static void StopAgent(); 647 static void StopAgent();
644 648
645 // Blocks until the agent has started listening for connections 649 // Blocks until the agent has started listening for connections
646 static void WaitForAgent(); 650 static void WaitForAgent();
647 651
652 static void CallMessageDispatchHandler();
653
648 // Unload the debugger if possible. Only called when no debugger is currently 654 // Unload the debugger if possible. Only called when no debugger is currently
649 // active. 655 // active.
650 static void UnloadDebugger(); 656 static void UnloadDebugger();
651 657
652 inline static bool EventActive(v8::DebugEvent event) { 658 inline static bool EventActive(v8::DebugEvent event) {
653 ScopedLock with(debugger_access_); 659 ScopedLock with(debugger_access_);
654 660
655 // Check whether the message handler was been cleared. 661 // Check whether the message handler was been cleared.
656 if (debugger_unload_pending_) { 662 if (debugger_unload_pending_) {
657 if (Debug::debugger_entry() == NULL) { 663 if (Debug::debugger_entry() == NULL) {
(...skipping 18 matching lines...) Expand all
676 682
677 static Mutex* debugger_access_; // Mutex guarding debugger variables. 683 static Mutex* debugger_access_; // Mutex guarding debugger variables.
678 static Handle<Object> event_listener_; // Global handle to listener. 684 static Handle<Object> event_listener_; // Global handle to listener.
679 static Handle<Object> event_listener_data_; 685 static Handle<Object> event_listener_data_;
680 static bool compiling_natives_; // Are we compiling natives? 686 static bool compiling_natives_; // Are we compiling natives?
681 static bool is_loading_debugger_; // Are we loading the debugger? 687 static bool is_loading_debugger_; // Are we loading the debugger?
682 static bool never_unload_debugger_; // Can we unload the debugger? 688 static bool never_unload_debugger_; // Can we unload the debugger?
683 static v8::Debug::MessageHandler2 message_handler_; 689 static v8::Debug::MessageHandler2 message_handler_;
684 static bool debugger_unload_pending_; // Was message handler cleared? 690 static bool debugger_unload_pending_; // Was message handler cleared?
685 static v8::Debug::HostDispatchHandler host_dispatch_handler_; 691 static v8::Debug::HostDispatchHandler host_dispatch_handler_;
692 static Mutex* dispatch_handler_access_; // Mutex guarding dispatch handler.
686 static v8::Debug::DebugMessageDispatchHandler debug_message_dispatch_handler_; 693 static v8::Debug::DebugMessageDispatchHandler debug_message_dispatch_handler_;
694 static MessageDispatchHelperThread* message_dispatch_helper_thread_;
687 static int host_dispatch_micros_; 695 static int host_dispatch_micros_;
688 696
689 static DebuggerAgent* agent_; 697 static DebuggerAgent* agent_;
690 698
691 static const int kQueueInitialSize = 4; 699 static const int kQueueInitialSize = 4;
692 static LockingCommandMessageQueue command_queue_; 700 static LockingCommandMessageQueue command_queue_;
693 static Semaphore* command_received_; // Signaled for each command received. 701 static Semaphore* command_received_; // Signaled for each command received.
694 702
695 friend class EnterDebugger; 703 friend class EnterDebugger;
696 }; 704 };
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
853 default: 861 default:
854 UNREACHABLE(); 862 UNREACHABLE();
855 return NULL; 863 return NULL;
856 } 864 }
857 } 865 }
858 private: 866 private:
859 Debug::AddressId id_; 867 Debug::AddressId id_;
860 int reg_; 868 int reg_;
861 }; 869 };
862 870
871 // The optional thread that Debug Agent may use to temporary call V8 to process
872 // pending debug requests if debuggee is not running V8 at the moment.
873 // Techincally it does not call V8 itself, rather it asks embedding program
874 // to do this via v8::Debug::HostDispatchHandler
875 class MessageDispatchHelperThread: public Thread {
876 public:
877 MessageDispatchHelperThread();
878 ~MessageDispatchHelperThread();
879
880 void Schedule();
881
882 private:
883 void Run();
884
885 Semaphore* const sem_;
886 Mutex* const mutex_;
887 bool already_signalled_;
888
889 DISALLOW_COPY_AND_ASSIGN(MessageDispatchHelperThread);
890 };
891
863 892
864 } } // namespace v8::internal 893 } } // namespace v8::internal
865 894
866 #endif // ENABLE_DEBUGGER_SUPPORT 895 #endif // ENABLE_DEBUGGER_SUPPORT
867 896
868 #endif // V8_DEBUG_H_ 897 #endif // V8_DEBUG_H_
OLDNEW
« no previous file with comments | « src/api.cc ('k') | src/debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698