🐛 fix(async_executor): implement cooperative cancellation
This commit is contained in:
@@ -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);
|
||||
} });
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user