1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-02-05 03:50:07 +00:00

New class: MemoryMappedFile.

This commit is contained in:
Julian Storer 2011-05-12 21:28:05 +01:00
parent 981ef9313c
commit 3213bec481
23 changed files with 556 additions and 66 deletions

View file

@ -53,6 +53,7 @@ BEGIN_JUCE_NAMESPACE
#include "../../io/files/juce_FileOutputStream.h"
#include "../../io/files/juce_NamedPipe.h"
#include "../../io/files/juce_DirectoryIterator.h"
#include "../../io/files/juce_MemoryMappedFile.h"
#include "../../io/network/juce_URL.h"
#include "../../io/network/juce_MACAddress.h"
#include "../../core/juce_PlatformUtilities.h"

View file

@ -43,6 +43,7 @@
#include <sys/statfs.h>
#include <sys/ptrace.h>
#include <sys/sysinfo.h>
#include <sys/mman.h>
#include <pwd.h>
#include <dirent.h>
#include <fnmatch.h>

View file

@ -523,6 +523,47 @@ void FileOutputStream::flushInternal()
status = getResultForErrno();
}
//==============================================================================
MemoryMappedFile::MemoryMappedFile (const File& file, MemoryMappedFile::AccessMode mode)
: address (nullptr),
internal (nullptr),
length (0)
{
jassert (mode == readOnly || mode == readWrite);
const int fd = open (file.getFullPathName().toUTF8(),
mode == readWrite ? (O_CREAT + O_RDWR) : O_RDONLY, 00644);
internal = reinterpret_cast<void*> (fd);
if (fd != -1)
{
const int64 fileSize = file.getSize();
address = mmap (0, (size_t) fileSize,
mode == readWrite ? (PROT_READ | PROT_WRITE) : PROT_READ,
MAP_SHARED, fd, 0);
if (address == MAP_FAILED)
address = nullptr;
else
length = (size_t) fileSize;
}
}
MemoryMappedFile::~MemoryMappedFile()
{
const int fd = reinterpret_cast <int> (internal);
if (fd != 0)
{
if (address != nullptr)
munmap (address, length);
close (fd);
}
}
//==============================================================================
const File juce_getExecutableFile()
{

View file

@ -64,6 +64,7 @@ BEGIN_JUCE_NAMESPACE
#include "../../io/files/juce_FileInputStream.h"
#include "../../io/files/juce_FileOutputStream.h"
#include "../../io/files/juce_DirectoryIterator.h"
#include "../../io/files/juce_MemoryMappedFile.h"
#include "../../io/network/juce_URL.h"
#include "../../io/network/juce_MACAddress.h"
#include "../../io/streams/juce_MemoryInputStream.h"

View file

@ -42,6 +42,7 @@
#include <sys/ptrace.h>
#include <sys/vfs.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <fnmatch.h>
#include <utime.h>
#include <pwd.h>

View file

@ -53,6 +53,7 @@ BEGIN_JUCE_NAMESPACE
#include "../../io/files/juce_FileOutputStream.h"
#include "../../io/files/juce_NamedPipe.h"
#include "../../io/files/juce_DirectoryIterator.h"
#include "../../io/files/juce_MemoryMappedFile.h"
#include "../../io/network/juce_URL.h"
#include "../../io/network/juce_MACAddress.h"
#include "../../io/streams/juce_MemoryInputStream.h"

View file

@ -70,6 +70,7 @@
#include <sys/param.h>
#include <sys/mount.h>
#include <sys/utsname.h>
#include <sys/mman.h>
#include <fnmatch.h>
#include <utime.h>
#include <dlfcn.h>

View file

@ -299,6 +299,56 @@ void FileOutputStream::flushInternal()
status = WindowsFileHelpers::getResultForLastError();
}
//==============================================================================
MemoryMappedFile::MemoryMappedFile (const File& file, MemoryMappedFile::AccessMode mode)
: address (nullptr),
internal (nullptr),
length (0)
{
jassert (mode == readOnly || mode == readWrite);
DWORD accessMode = GENERIC_READ, shareMode = FILE_SHARE_READ, createType = OPEN_EXISTING;
DWORD protect = PAGE_READONLY, access = FILE_MAP_READ;
if (mode == readWrite)
{
accessMode = GENERIC_READ | GENERIC_WRITE;
createType = OPEN_ALWAYS;
protect = PAGE_READWRITE;
access = FILE_MAP_ALL_ACCESS;
}
HANDLE h = CreateFile (file.getFullPathName().toWideCharPointer(), accessMode, FILE_SHARE_READ, 0,
createType, FILE_ATTRIBUTE_NORMAL, 0);
internal = (void*) h;
if (h != INVALID_HANDLE_VALUE)
{
const int64 fileSize = file.getSize();
HANDLE mappingHandle = CreateFileMapping (h, 0, protect, (DWORD) (fileSize >> 32), (DWORD) fileSize, 0);
if (mappingHandle != 0)
{
address = MapViewOfFile (mappingHandle, access, 0, 0, (SIZE_T) fileSize);
if (address != nullptr)
length = (size_t) fileSize;
CloseHandle (mappingHandle);
}
}
}
MemoryMappedFile::~MemoryMappedFile()
{
if (address != nullptr)
UnmapViewOfFile (address);
if (internal != nullptr)
CloseHandle ((HANDLE) internal);
}
//==============================================================================
int64 File::getSize() const
{

View file

@ -54,6 +54,7 @@ BEGIN_JUCE_NAMESPACE
#include "../../io/streams/juce_MemoryOutputStream.h"
#include "../../io/files/juce_NamedPipe.h"
#include "../../io/files/juce_DirectoryIterator.h"
#include "../../io/files/juce_MemoryMappedFile.h"
#include "../../io/network/juce_URL.h"
#include "../../io/network/juce_MACAddress.h"
#include "../../core/juce_PlatformUtilities.h"