Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 8 additions & 41 deletions lldb/tools/lldb-dap/Handler/PauseRequestHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,53 +8,20 @@

#include "DAP.h"
#include "EventHelper.h"
#include "JSONUtils.h"
#include "LLDBUtils.h"
#include "Protocol/ProtocolRequests.h"
#include "RequestHandler.h"

namespace lldb_dap {

// "PauseRequest": {
// "allOf": [ { "$ref": "#/definitions/Request" }, {
// "type": "object",
// "description": "Pause request; value of command field is 'pause'. The
// request suspenses the debuggee. The debug adapter first sends the
// PauseResponse and then a StoppedEvent (event type 'pause') after the
// thread has been paused successfully.", "properties": {
// "command": {
// "type": "string",
// "enum": [ "pause" ]
// },
// "arguments": {
// "$ref": "#/definitions/PauseArguments"
// }
// },
// "required": [ "command", "arguments" ]
// }]
// },
// "PauseArguments": {
// "type": "object",
// "description": "Arguments for 'pause' request.",
// "properties": {
// "threadId": {
// "type": "integer",
// "description": "Pause execution for this thread."
// }
// },
// "required": [ "threadId" ]
// },
// "PauseResponse": {
// "allOf": [ { "$ref": "#/definitions/Response" }, {
// "type": "object",
// "description": "Response to 'pause' request. This is just an
// acknowledgement, so no body field is required."
// }]
// }
void PauseRequestHandler::operator()(const llvm::json::Object &request) const {
llvm::json::Object response;
FillResponse(request, response);
/// The request suspenses the debuggee. The debug adapter first sends the
/// PauseResponse and then a StoppedEvent (event type 'pause') after the thread
/// has been paused successfully.
llvm::Error
PauseRequestHandler::Run(const protocol::PauseArguments &args) const {
lldb::SBProcess process = dap.target.GetProcess();
lldb::SBError error = process.Stop();
dap.SendJSON(llvm::json::Value(std::move(response)));
return ToError(error);
}

} // namespace lldb_dap
7 changes: 4 additions & 3 deletions lldb/tools/lldb-dap/Handler/RequestHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -492,11 +492,12 @@ class ModulesRequestHandler final
Run(const std::optional<protocol::ModulesArguments> &args) const override;
};

class PauseRequestHandler : public LegacyRequestHandler {
class PauseRequestHandler
: public RequestHandler<protocol::PauseArguments, protocol::PauseResponse> {
public:
using LegacyRequestHandler::LegacyRequestHandler;
using RequestHandler::RequestHandler;
static llvm::StringLiteral GetCommand() { return "pause"; }
void operator()(const llvm::json::Object &request) const override;
llvm::Error Run(const protocol::PauseArguments &args) const override;
};

class ScopesRequestHandler final
Expand Down
6 changes: 6 additions & 0 deletions lldb/tools/lldb-dap/Protocol/ProtocolRequests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -695,4 +695,10 @@ llvm::json::Value toJSON(const EvaluateResponseBody &Body) {
return result;
}

bool fromJSON(const llvm::json::Value &Params, PauseArguments &Args,
llvm::json::Path Path) {
json::ObjectMapper O(Params, Path);
return O && O.map("threadId", Args.threadId);
}

} // namespace lldb_dap::protocol
11 changes: 11 additions & 0 deletions lldb/tools/lldb-dap/Protocol/ProtocolRequests.h
Original file line number Diff line number Diff line change
Expand Up @@ -1184,6 +1184,17 @@ struct EvaluateResponseBody {
};
llvm::json::Value toJSON(const EvaluateResponseBody &);

/// Arguments for `pause` request.
struct PauseArguments {
/// Pause execution for this thread.
lldb::tid_t threadId = LLDB_INVALID_THREAD_ID;
};
bool fromJSON(const llvm::json::Value &, PauseArguments &, llvm::json::Path);

/// Response to `pause` request. This is just an acknowledgement, so no body
/// field is required.
using PauseResponse = VoidResponse;

} // namespace lldb_dap::protocol

#endif
11 changes: 11 additions & 0 deletions lldb/unittests/DAP/ProtocolRequestsTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -182,3 +182,14 @@ TEST(ProtocolRequestsTest, InitializeRequestArguments) {
EXPECT_THAT_EXPECTED(parse<InitializeRequestArguments>(R"({})"),
FailedWithMessage("missing value at (root).adapterID"));
}

TEST(ProtocolRequestsTest, PauseRequestArguments) {
llvm::Expected<PauseArguments> expected =
parse<PauseArguments>(R"({"threadId": 123})");
ASSERT_THAT_EXPECTED(expected, llvm::Succeeded());
EXPECT_EQ(expected->threadId, 123U);

// Check required keys.
EXPECT_THAT_EXPECTED(parse<PauseArguments>(R"({})"),
FailedWithMessage("missing value at (root).threadId"));
}
Loading