diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-12-12 23:43:03 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-12-12 23:43:03 +0000 |
commit | 7856bb83df917cfaebfe7881dc620bf264a94885 (patch) | |
tree | 441a77bf222db624ec3c3bbf58f0f3f9698befd9 /base | |
parent | 6d2b8132aaa55a9e01b8b49bcce5eb44c68a1972 (diff) | |
download | chromium_src-7856bb83df917cfaebfe7881dc620bf264a94885.zip chromium_src-7856bb83df917cfaebfe7881dc620bf264a94885.tar.gz chromium_src-7856bb83df917cfaebfe7881dc620bf264a94885.tar.bz2 |
revert r6938
(i.e. reapply 6935, with fix)
Review URL: http://codereview.chromium.org/14087
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@6953 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base')
-rw-r--r-- | base/file_util.cc | 23 | ||||
-rw-r--r-- | base/file_util.h | 14 | ||||
-rw-r--r-- | base/file_util_posix.cc | 40 | ||||
-rw-r--r-- | base/file_util_win.cc | 22 |
4 files changed, 72 insertions, 27 deletions
diff --git a/base/file_util.cc b/base/file_util.cc index 10e08d5..1cf22b7 100644 --- a/base/file_util.cc +++ b/base/file_util.cc @@ -275,6 +275,29 @@ bool CloseFile(FILE* file) { return fclose(file) == 0; } +/////////////////////////////////////////////// +// MemoryMappedFile + +MemoryMappedFile::~MemoryMappedFile() { + CloseHandles(); +} + +bool MemoryMappedFile::Initialize(const FilePath& file_name) { + if (IsValid()) + return false; + + if (!MapFileToMemory(file_name)) { + CloseHandles(); + return false; + } + + return true; +} + +bool MemoryMappedFile::IsValid() { + return data_ != NULL; +} + // Deprecated functions ---------------------------------------------------- bool AbsolutePath(std::wstring* path_str) { diff --git a/base/file_util.h b/base/file_util.h index 854703f..d1cfb05 100644 --- a/base/file_util.h +++ b/base/file_util.h @@ -414,8 +414,6 @@ class FileEnumerator { DISALLOW_EVIL_CONSTRUCTORS(FileEnumerator); }; -// TODO(port): port this class to posix. -#if defined(OS_WIN) class MemoryMappedFile { public: // The default constructor sets all members to invalid/null values. @@ -429,8 +427,8 @@ class MemoryMappedFile { // Later we may want to allow the user to specify access. bool Initialize(const FilePath& file_name); - const uint8* Data() const { return data_; } - size_t Length() const { return length_; } + const uint8* data() const { return data_; } + size_t length() const { return length_; } // Is file_ a valid file handle that points to an open, memory mapped file? bool IsValid(); @@ -443,14 +441,18 @@ class MemoryMappedFile { // Closes all open handles. Later we may want to make this public. void CloseHandles(); +#if defined(OS_WIN) HANDLE file_; HANDLE file_mapping_; - const uint8* data_; +#elif defined(OS_POSIX) + // The file descriptor. + int file_; +#endif + uint8* data_; size_t length_; DISALLOW_COPY_AND_ASSIGN(MemoryMappedFile); }; -#endif // defined(OS_WIN) // Renames a file using the SHFileOperation API to ensure that the target file // gets the correct default security descriptor in the new path. diff --git a/base/file_util_posix.cc b/base/file_util_posix.cc index 153f70a..7448ed8 100644 --- a/base/file_util_posix.cc +++ b/base/file_util_posix.cc @@ -12,6 +12,7 @@ #include <stdio.h> #include <string.h> #include <sys/errno.h> +#include <sys/mman.h> #include <sys/stat.h> #include <time.h> @@ -378,6 +379,9 @@ bool SetCurrentDirectory(const FilePath& path) { return !ret; } +/////////////////////////////////////////////// +// FileEnumerator + FileEnumerator::FileEnumerator(const FilePath& root_path, bool recursive, FileEnumerator::FILE_TYPE file_type) @@ -479,5 +483,41 @@ FilePath FileEnumerator::Next() { return Next(); } +/////////////////////////////////////////////// +// MemoryMappedFile + +MemoryMappedFile::MemoryMappedFile() + : file_(-1), + data_(NULL), + length_(0) { +} + +bool MemoryMappedFile::MapFileToMemory(const FilePath& file_name) { + file_ = open(file_name.value().c_str(), O_RDONLY); + if (file_ == -1) + return false; + + struct stat file_stat; + if (fstat(file_, &file_stat) == -1) + return false; + length_ = file_stat.st_size; + + data_ = static_cast<uint8*>( + mmap(NULL, length_, PROT_READ, MAP_SHARED, file_, 0)); + if (data_ == MAP_FAILED) + data_ = NULL; + return data_ != NULL; +} + +void MemoryMappedFile::CloseHandles() { + if (data_ != NULL) + munmap(data_, length_); + if (file_ != -1) + close(file_); + + data_ = NULL; + length_ = 0; + file_ = -1; +} } // namespace file_util diff --git a/base/file_util_win.cc b/base/file_util_win.cc index c287129..8f372b1 100644 --- a/base/file_util_win.cc +++ b/base/file_util_win.cc @@ -704,22 +704,6 @@ MemoryMappedFile::MemoryMappedFile() length_(INVALID_FILE_SIZE) { } -MemoryMappedFile::~MemoryMappedFile() { - CloseHandles(); -} - -bool MemoryMappedFile::Initialize(const FilePath& file_name) { - if (IsValid()) - return false; - - if (!MapFileToMemory(file_name)) { - CloseHandles(); - return false; - } - - return true; -} - bool MemoryMappedFile::MapFileToMemory(const FilePath& file_name) { file_ = ::CreateFile(file_name.value().c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, @@ -736,15 +720,11 @@ bool MemoryMappedFile::MapFileToMemory(const FilePath& file_name) { if (file_mapping_ == INVALID_HANDLE_VALUE) return false; - data_ = reinterpret_cast<const uint8*>( + data_ = static_cast<uint8*>( ::MapViewOfFile(file_mapping_, FILE_MAP_READ, 0, 0, length_)); return data_ != NULL; } -bool MemoryMappedFile::IsValid() { - return data_ != NULL; -} - void MemoryMappedFile::CloseHandles() { if (data_) ::UnmapViewOfFile(data_); |