
Since it will become a stream in a little bit, it should behave like all non-trivial stream classes, who are not primarily intended to have shared ownership to make closing behavior more predictable. Across all uses of MappedFile, there is only one use case of shared mapped files in LibVideo, which now uses the thin SharedMappedFile wrapper.
56 lines
1.4 KiB
C++
56 lines
1.4 KiB
C++
/*
|
|
* Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
|
|
* Copyright (c) 2023, kleines Filmröllchen <filmroellchen@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Error.h>
|
|
#include <AK/Noncopyable.h>
|
|
#include <AK/NonnullOwnPtr.h>
|
|
#include <AK/RefCounted.h>
|
|
#include <LibCore/Forward.h>
|
|
|
|
namespace Core {
|
|
|
|
class MappedFile {
|
|
AK_MAKE_NONCOPYABLE(MappedFile);
|
|
AK_MAKE_NONMOVABLE(MappedFile);
|
|
|
|
public:
|
|
static ErrorOr<NonnullOwnPtr<MappedFile>> map(StringView path);
|
|
static ErrorOr<NonnullOwnPtr<MappedFile>> map_from_file(NonnullOwnPtr<Core::File>, StringView path);
|
|
static ErrorOr<NonnullOwnPtr<MappedFile>> map_from_fd_and_close(int fd, StringView path);
|
|
~MappedFile();
|
|
|
|
void* data() { return m_data; }
|
|
void const* data() const { return m_data; }
|
|
|
|
size_t size() const { return m_size; }
|
|
|
|
ReadonlyBytes bytes() const { return { m_data, m_size }; }
|
|
|
|
private:
|
|
explicit MappedFile(void*, size_t);
|
|
|
|
void* m_data { nullptr };
|
|
size_t m_size { 0 };
|
|
};
|
|
|
|
class SharedMappedFile : public RefCounted<SharedMappedFile> {
|
|
public:
|
|
explicit SharedMappedFile(NonnullOwnPtr<MappedFile> file)
|
|
: m_file(move(file))
|
|
{
|
|
}
|
|
|
|
MappedFile const& operator->() const { return *m_file; }
|
|
MappedFile& operator->() { return *m_file; }
|
|
|
|
private:
|
|
NonnullOwnPtr<MappedFile> m_file;
|
|
};
|
|
|
|
}
|