blob: fb193bf8ded9d2f147aea1fdb26d9a530e1947ab [file] [log] [blame]
// 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<int> getBreakpoints() const override;
protected:
FileBase(ID id, std::string dir, std::string name, std::string source);
private:
mutable marl::mutex breakpointMutex;
std::unordered_set<int> 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<int> 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> File::createVirtual(ID id, std::string name, std::string source)
{
return std::make_shared<VirtualFile>(id, std::move(name), std::move(source));
}
std::shared_ptr<File> 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<PhysicalFile>(id, dir.c_str(), name.c_str());
}
return std::make_shared<PhysicalFile>(id, "", std::move(path));
}
} // namespace dbg
} // namespace vk