mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-20 11:05:54 +00:00
109 lines
4.7 KiB
C++
109 lines
4.7 KiB
C++
//------------------------------------------------------------------------------
|
|
/*
|
|
This file is part of Beast: https://github.com/vinniefalco/Beast
|
|
Copyright 2013, Vinnie Falco <vinnie.falco@gmail.com>
|
|
|
|
Portions of this file are from JUCE.
|
|
Copyright (c) 2013 - Raw Material Software Ltd.
|
|
Please visit http://www.juce.com
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
purpose with or without fee is hereby granted, provided that the above
|
|
copyright notice and this permission notice appear in all copies.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
//==============================================================================
|
|
|
|
#ifndef BEAST_MEMORYMAPPEDFILE_H_INCLUDED
|
|
#define BEAST_MEMORYMAPPEDFILE_H_INCLUDED
|
|
|
|
|
|
//==============================================================================
|
|
/**
|
|
Maps a file into virtual memory for easy reading and/or writing.
|
|
*/
|
|
class BEAST_API MemoryMappedFile : LeakChecked <MemoryMappedFile>, public Uncopyable
|
|
{
|
|
public:
|
|
/** The read/write flags used when opening a memory mapped file. */
|
|
enum AccessMode
|
|
{
|
|
readOnly, /**< Indicates that the memory can only be read. */
|
|
readWrite /**< Indicates that the memory can be read and written to - changes that are
|
|
made will be flushed back to disk at the whim of the OS. */
|
|
};
|
|
|
|
/** Opens a file and maps it to an area of virtual memory.
|
|
|
|
The file should already exist, and should already be the size that you want to work with
|
|
when you call this. If the file is resized after being opened, the behaviour is undefined.
|
|
|
|
If the file exists and the operation succeeds, the getData() and getSize() methods will
|
|
return the location and size of the data that can be read or written. Note that the entire
|
|
file is not read into memory immediately - the OS simply creates a virtual mapping, which
|
|
will lazily pull the data into memory when blocks are accessed.
|
|
|
|
If the file can't be opened for some reason, the getData() method will return a null pointer.
|
|
*/
|
|
MemoryMappedFile (const File& file, AccessMode mode);
|
|
|
|
/** Opens a section of a file and maps it to an area of virtual memory.
|
|
|
|
The file should already exist, and should already be the size that you want to work with
|
|
when you call this. If the file is resized after being opened, the behaviour is undefined.
|
|
|
|
If the file exists and the operation succeeds, the getData() and getSize() methods will
|
|
return the location and size of the data that can be read or written. Note that the entire
|
|
file is not read into memory immediately - the OS simply creates a virtual mapping, which
|
|
will lazily pull the data into memory when blocks are accessed.
|
|
|
|
If the file can't be opened for some reason, the getData() method will return a null pointer.
|
|
|
|
NOTE: the start of the actual range used may be rounded-down to a multiple of the OS's page-size,
|
|
so do not assume that the mapped memory will begin at exactly the position you requested - always
|
|
use getRange() to check the actual range that is being used.
|
|
*/
|
|
MemoryMappedFile (const File& file,
|
|
const Range<int64>& fileRange,
|
|
AccessMode mode);
|
|
|
|
/** Destructor. */
|
|
~MemoryMappedFile();
|
|
|
|
/** Returns the address at which this file has been mapped, or a null pointer if
|
|
the file couldn't be successfully mapped.
|
|
*/
|
|
void* getData() const noexcept { return address; }
|
|
|
|
/** Returns the number of bytes of data that are available for reading or writing.
|
|
This will normally be the size of the file.
|
|
*/
|
|
size_t getSize() const noexcept { return (size_t) range.getLength(); }
|
|
|
|
/** Returns the section of the file at which the mapped memory represents. */
|
|
Range<int64> getRange() const noexcept { return range; }
|
|
|
|
private:
|
|
//==============================================================================
|
|
void* address;
|
|
Range<int64> range;
|
|
|
|
#if BEAST_WINDOWS
|
|
void* fileHandle;
|
|
#else
|
|
int fileHandle;
|
|
#endif
|
|
|
|
void openInternal (const File&, AccessMode);
|
|
};
|
|
|
|
|
|
#endif // BEAST_MEMORYMAPPEDFILE_H_INCLUDED
|