🐛 fix(async_executor): implement cooperative cancellation

This commit is contained in:
csh
2026-07-13 16:03:56 +08:00
parent edea37202d
commit 89b8937697
17 changed files with 685 additions and 420 deletions
@@ -39,9 +39,6 @@ export namespace lsp::provider
namespace lsp::provider
{
std::string Initialize::ProvideResponse(const protocol::RequestMessage& request, ExecutionContext& context)
{
@@ -219,24 +216,24 @@ namespace lsp::provider
for (const auto& workspace_folder : workspace_folders)
{
auto task_id = std::format("Load workspace symbols: {}", workspace_folder.uri);
scheduler.Submit(task_id, [&manager_hub, uri = workspace_folder.uri, folder_name = workspace_folder.name]() -> std::optional<std::string> {
scheduler.Submit(task_id, [&manager_hub, uri = workspace_folder.uri, folder_name = workspace_folder.name](std::stop_token stop_token) -> std::optional<std::string> {
try
{
manager_hub.symbols().LoadWorkspace(uri);
manager_hub.symbols().LoadWorkspace(uri, stop_token);
return std::format("Loaded workspace {} symbols", uri);
}
catch (const std::exception& e)
{
spdlog::error("Failed to load workspace {} symbols: {}", folder_name, e.what());
throw; // Request会处理异常
} }, [](const std::optional<std::string>& result, bool cancelled) {
if (cancelled)
} }, [](const ::lsp::scheduler::async_executor::TaskResult& result) {
if (result.status == ::lsp::scheduler::async_executor::TaskStatus::kCancelled)
{
spdlog::debug("Workspace loading task cancelled");
}
else if (result)
else if (result.status == ::lsp::scheduler::async_executor::TaskStatus::kCompleted && result.value)
{
spdlog::info("Workspace loading result: {}", *result);
spdlog::info("Workspace loading result: {}", *result.value);
} });
}