2018-07-12 22:49:52 +08:00
|
|
|
//===--- FSProvider.h - VFS provider for ClangdServer ------------*- C++-*-===//
|
|
|
|
//
|
2019-01-19 16:50:56 +08:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2018-07-12 22:49:52 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_FSPROVIDER_H
|
|
|
|
#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_FSPROVIDER_H
|
|
|
|
|
|
|
|
#include "llvm/ADT/IntrusiveRefCntPtr.h"
|
2018-10-10 21:27:25 +08:00
|
|
|
#include "llvm/Support/VirtualFileSystem.h"
|
2018-07-12 22:49:52 +08:00
|
|
|
|
|
|
|
namespace clang {
|
|
|
|
namespace clangd {
|
|
|
|
|
|
|
|
// Wrapper for vfs::FileSystem for use in multithreaded programs like clangd.
|
|
|
|
// As FileSystem is not threadsafe, concurrent threads must each obtain one.
|
|
|
|
class FileSystemProvider {
|
|
|
|
public:
|
|
|
|
virtual ~FileSystemProvider() = default;
|
|
|
|
/// Called by ClangdServer to obtain a vfs::FileSystem to be used for parsing.
|
|
|
|
/// Context::current() will be the context passed to the clang entrypoint,
|
|
|
|
/// such as addDocument(), and will also be propagated to result callbacks.
|
|
|
|
/// Embedders may use this to isolate filesystem accesses.
|
2018-10-11 16:05:10 +08:00
|
|
|
virtual llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>
|
|
|
|
getFileSystem() const = 0;
|
2018-07-12 22:49:52 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
class RealFileSystemProvider : public FileSystemProvider {
|
|
|
|
public:
|
|
|
|
// FIXME: returns the single real FS instance, which is not threadsafe.
|
2018-10-11 16:05:10 +08:00
|
|
|
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>
|
[clangd] Avoid memory-mapping files on Windows
Summary:
Memory-mapping files on Windows leads to them being locked and prevents
editors from saving changes to those files on disk. This is fine for the
compiler, but not acceptable for an interactive tool like clangd.
Therefore, we choose to avoid using memory-mapped files on Windows.
Reviewers: hokein, kadircet
Reviewed By: kadircet
Subscribers: yvvan, zturner, nik, malaperle, mgorny, ioeric, MaskRay, jkorous, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D55139
llvm-svn: 348147
2018-12-03 23:21:49 +08:00
|
|
|
getFileSystem() const override;
|
2018-07-12 22:49:52 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace clangd
|
|
|
|
} // namespace clang
|
|
|
|
|
|
|
|
#endif
|