| // Copyright 2020 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef V8_DEBUG_WASM_GDB_SERVER_GDB_SERVER_THREAD_H_ |
| #define V8_DEBUG_WASM_GDB_SERVER_GDB_SERVER_THREAD_H_ |
| |
| #include "src/base/platform/platform.h" |
| #include "src/base/platform/semaphore.h" |
| #include "src/debug/wasm/gdb-server/target.h" |
| #include "src/debug/wasm/gdb-server/transport.h" |
| |
| namespace v8 { |
| namespace internal { |
| namespace wasm { |
| namespace gdb_server { |
| |
| class GdbServer; |
| |
| // class GdbServerThread spawns a thread where all communication with a debugger |
| // happens. |
| class GdbServerThread : public v8::base::Thread { |
| public: |
| explicit GdbServerThread(GdbServer* gdb_server); |
| |
| // base::Thread |
| void Run() override; |
| |
| // Starts the GDB-server thread and waits Run() method is called on the new |
| // thread and the initialization completes. |
| bool StartAndInitialize(); |
| |
| // Stops the GDB-server thread when the V8 process shuts down; gracefully |
| // closes any active debugging session. |
| void Stop(); |
| |
| Target& GetTarget() { return *target_; } |
| |
| private: |
| void CleanupThread(); |
| |
| GdbServer* gdb_server_; |
| |
| // Used to block the caller on StartAndInitialize() waiting for the new thread |
| // to have completed its initialization. |
| // (Note that Thread::StartSynchronously() wouldn't work in this case because |
| // it returns as soon as the new thread starts, but before Run() is called). |
| base::Semaphore start_semaphore_; |
| |
| base::Mutex mutex_; |
| // Protected by {mutex_}: |
| std::unique_ptr<TransportBase> transport_; |
| std::unique_ptr<Target> target_; |
| |
| DISALLOW_COPY_AND_ASSIGN(GdbServerThread); |
| }; |
| |
| } // namespace gdb_server |
| } // namespace wasm |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_DEBUG_WASM_GDB_SERVER_GDB_SERVER_THREAD_H_ |