// Copyright 2019 The SwiftShader Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "File.hpp" #include "marl/mutex.h" namespace { //////////////////////////////////////////////////////////////////////////////// // FileBase //////////////////////////////////////////////////////////////////////////////// class FileBase : public vk::dbg::File { public: void clearBreakpoints() override; void addBreakpoint(int line) override; bool hasBreakpoint(int line) const override; std::unordered_set getBreakpoints() const override; protected: FileBase(ID id, std::string dir, std::string name, std::string source); private: mutable marl::mutex breakpointMutex; std::unordered_set breakpoints GUARDED_BY(breakpointMutex); }; FileBase::FileBase(ID id, std::string dir, std::string name, std::string source) : File(id, std::move(dir), std::move(name), std::move(source)) {} void FileBase::clearBreakpoints() { marl::lock lock(breakpointMutex); breakpoints.clear(); } void FileBase::addBreakpoint(int line) { marl::lock lock(breakpointMutex); breakpoints.emplace(line); } bool FileBase::hasBreakpoint(int line) const { marl::lock lock(breakpointMutex); return breakpoints.count(line) > 0; } std::unordered_set FileBase::getBreakpoints() const { marl::lock lock(breakpointMutex); return breakpoints; } //////////////////////////////////////////////////////////////////////////////// // VirtualFile //////////////////////////////////////////////////////////////////////////////// class VirtualFile : public FileBase { public: VirtualFile(ID id, std::string name, std::string source); bool isVirtual() const override; private: }; VirtualFile::VirtualFile(ID id, std::string name, std::string source) : FileBase(id, "", std::move(name), std::move(source)) {} bool VirtualFile::isVirtual() const { return true; } //////////////////////////////////////////////////////////////////////////////// // PhysicalFile //////////////////////////////////////////////////////////////////////////////// struct PhysicalFile : public FileBase { PhysicalFile(ID id, std::string dir, std::string name); bool isVirtual() const override; }; PhysicalFile::PhysicalFile(ID id, std::string dir, std::string name) : FileBase(id, std::move(dir), std::move(name), "") {} bool PhysicalFile::isVirtual() const { return false; } } // anonymous namespace namespace vk { namespace dbg { std::shared_ptr File::createVirtual(ID id, std::string name, std::string source) { return std::make_shared(id, std::move(name), std::move(source)); } std::shared_ptr File::createPhysical(ID id, std::string path) { auto pathstr = path; auto pos = pathstr.rfind("/"); if(pos != std::string::npos) { auto dir = pathstr.substr(0, pos); auto name = pathstr.substr(pos + 1); return std::make_shared(id, dir.c_str(), name.c_str()); } return std::make_shared(id, "", std::move(path)); } } // namespace dbg } // namespace vk