summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-12-12 23:43:03 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-12-12 23:43:03 +0000
commit7856bb83df917cfaebfe7881dc620bf264a94885 (patch)
tree441a77bf222db624ec3c3bbf58f0f3f9698befd9 /base
parent6d2b8132aaa55a9e01b8b49bcce5eb44c68a1972 (diff)
downloadchromium_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.cc23
-rw-r--r--base/file_util.h14
-rw-r--r--base/file_util_posix.cc40
-rw-r--r--base/file_util_win.cc22
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_);