Loading include/utils/Tokenizer.h +3 −1 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include <assert.h> #include <assert.h> #include <utils/Errors.h> #include <utils/Errors.h> #include <utils/FileMap.h> #include <utils/String8.h> #include <utils/String8.h> namespace android { namespace android { Loading @@ -27,7 +28,7 @@ namespace android { * A simple tokenizer for loading and parsing ASCII text files line by line. * A simple tokenizer for loading and parsing ASCII text files line by line. */ */ class Tokenizer { class Tokenizer { Tokenizer(const String8& filename, const char* buffer, size_t length); Tokenizer(const String8& filename, FileMap* fileMap, const char* buffer, size_t length); public: public: ~Tokenizer(); ~Tokenizer(); Loading Loading @@ -108,6 +109,7 @@ private: Tokenizer(const Tokenizer& other); // not copyable Tokenizer(const Tokenizer& other); // not copyable String8 mFilename; String8 mFilename; FileMap* mFileMap; const char* mBuffer; const char* mBuffer; size_t mLength; size_t mLength; Loading libs/utils/Tokenizer.cpp +17 −15 Original line number Original line Diff line number Diff line Loading @@ -22,7 +22,6 @@ #include <errno.h> #include <errno.h> #include <sys/types.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/stat.h> #include <sys/mman.h> #include <utils/Log.h> #include <utils/Log.h> #include <utils/Tokenizer.h> #include <utils/Tokenizer.h> Loading @@ -37,13 +36,16 @@ static inline bool isDelimiter(char ch, const char* delimiters) { } } Tokenizer::Tokenizer(const String8& filename, const char* buffer, size_t length) : Tokenizer::Tokenizer(const String8& filename, FileMap* fileMap, mFilename(filename), mBuffer(buffer), mLength(length), const char* buffer, size_t length) : mFilename(filename), mFileMap(fileMap), mBuffer(buffer), mLength(length), mCurrent(buffer), mLineNumber(1) { mCurrent(buffer), mLineNumber(1) { } } Tokenizer::~Tokenizer() { Tokenizer::~Tokenizer() { munmap((void*)mBuffer, mLength); if (mFileMap) { mFileMap->release(); } } } status_t Tokenizer::open(const String8& filename, Tokenizer** outTokenizer) { status_t Tokenizer::open(const String8& filename, Tokenizer** outTokenizer) { Loading @@ -55,29 +57,29 @@ status_t Tokenizer::open(const String8& filename, Tokenizer** outTokenizer) { result = -errno; result = -errno; LOGE("Error opening file '%s', %s.", filename.string(), strerror(errno)); LOGE("Error opening file '%s', %s.", filename.string(), strerror(errno)); } else { } else { struct stat64 stat; struct stat stat; if (fstat64(fd, &stat)) { if (fstat(fd, &stat)) { result = -errno; result = -errno; LOGE("Error getting size of file '%s', %s.", filename.string(), strerror(errno)); LOGE("Error getting size of file '%s', %s.", filename.string(), strerror(errno)); } else { } else { size_t length = size_t(stat.st_size); size_t length = size_t(stat.st_size); void* buffer = mmap(NULL, length, PROT_READ, MAP_FILE | MAP_PRIVATE, fd, 0); FileMap* fileMap = new FileMap(); if (buffer == MAP_FAILED) { if (!fileMap->create(NULL, fd, 0, length, true)) { result = -errno; result = NO_MEMORY; LOGE("Error mapping file '%s', %s.", filename.string(), strerror(errno)); LOGE("Error mapping file '%s', %s.", filename.string(), strerror(errno)); } else { } else { if (madvise(buffer, length, MADV_SEQUENTIAL)) { fileMap->advise(FileMap::SEQUENTIAL); LOGW("Error calling madvise for mmapped file '%s', %s.", filename.string(), strerror(errno)); } *outTokenizer = new Tokenizer(filename, static_cast<const char*>(buffer), length); *outTokenizer = new Tokenizer(filename, fileMap, static_cast<const char*>(fileMap->getDataPtr()), length); if (!*outTokenizer) { if (!*outTokenizer) { result = NO_MEMORY; result = NO_MEMORY; LOGE("Error allocating tokenizer for file=%s.", filename.string()); LOGE("Error allocating tokenizer for file=%s.", filename.string()); munmap(buffer, length); } } } } if (result) { fileMap->release(); } } } close(fd); close(fd); } } Loading Loading
include/utils/Tokenizer.h +3 −1 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include <assert.h> #include <assert.h> #include <utils/Errors.h> #include <utils/Errors.h> #include <utils/FileMap.h> #include <utils/String8.h> #include <utils/String8.h> namespace android { namespace android { Loading @@ -27,7 +28,7 @@ namespace android { * A simple tokenizer for loading and parsing ASCII text files line by line. * A simple tokenizer for loading and parsing ASCII text files line by line. */ */ class Tokenizer { class Tokenizer { Tokenizer(const String8& filename, const char* buffer, size_t length); Tokenizer(const String8& filename, FileMap* fileMap, const char* buffer, size_t length); public: public: ~Tokenizer(); ~Tokenizer(); Loading Loading @@ -108,6 +109,7 @@ private: Tokenizer(const Tokenizer& other); // not copyable Tokenizer(const Tokenizer& other); // not copyable String8 mFilename; String8 mFilename; FileMap* mFileMap; const char* mBuffer; const char* mBuffer; size_t mLength; size_t mLength; Loading
libs/utils/Tokenizer.cpp +17 −15 Original line number Original line Diff line number Diff line Loading @@ -22,7 +22,6 @@ #include <errno.h> #include <errno.h> #include <sys/types.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/stat.h> #include <sys/mman.h> #include <utils/Log.h> #include <utils/Log.h> #include <utils/Tokenizer.h> #include <utils/Tokenizer.h> Loading @@ -37,13 +36,16 @@ static inline bool isDelimiter(char ch, const char* delimiters) { } } Tokenizer::Tokenizer(const String8& filename, const char* buffer, size_t length) : Tokenizer::Tokenizer(const String8& filename, FileMap* fileMap, mFilename(filename), mBuffer(buffer), mLength(length), const char* buffer, size_t length) : mFilename(filename), mFileMap(fileMap), mBuffer(buffer), mLength(length), mCurrent(buffer), mLineNumber(1) { mCurrent(buffer), mLineNumber(1) { } } Tokenizer::~Tokenizer() { Tokenizer::~Tokenizer() { munmap((void*)mBuffer, mLength); if (mFileMap) { mFileMap->release(); } } } status_t Tokenizer::open(const String8& filename, Tokenizer** outTokenizer) { status_t Tokenizer::open(const String8& filename, Tokenizer** outTokenizer) { Loading @@ -55,29 +57,29 @@ status_t Tokenizer::open(const String8& filename, Tokenizer** outTokenizer) { result = -errno; result = -errno; LOGE("Error opening file '%s', %s.", filename.string(), strerror(errno)); LOGE("Error opening file '%s', %s.", filename.string(), strerror(errno)); } else { } else { struct stat64 stat; struct stat stat; if (fstat64(fd, &stat)) { if (fstat(fd, &stat)) { result = -errno; result = -errno; LOGE("Error getting size of file '%s', %s.", filename.string(), strerror(errno)); LOGE("Error getting size of file '%s', %s.", filename.string(), strerror(errno)); } else { } else { size_t length = size_t(stat.st_size); size_t length = size_t(stat.st_size); void* buffer = mmap(NULL, length, PROT_READ, MAP_FILE | MAP_PRIVATE, fd, 0); FileMap* fileMap = new FileMap(); if (buffer == MAP_FAILED) { if (!fileMap->create(NULL, fd, 0, length, true)) { result = -errno; result = NO_MEMORY; LOGE("Error mapping file '%s', %s.", filename.string(), strerror(errno)); LOGE("Error mapping file '%s', %s.", filename.string(), strerror(errno)); } else { } else { if (madvise(buffer, length, MADV_SEQUENTIAL)) { fileMap->advise(FileMap::SEQUENTIAL); LOGW("Error calling madvise for mmapped file '%s', %s.", filename.string(), strerror(errno)); } *outTokenizer = new Tokenizer(filename, static_cast<const char*>(buffer), length); *outTokenizer = new Tokenizer(filename, fileMap, static_cast<const char*>(fileMap->getDataPtr()), length); if (!*outTokenizer) { if (!*outTokenizer) { result = NO_MEMORY; result = NO_MEMORY; LOGE("Error allocating tokenizer for file=%s.", filename.string()); LOGE("Error allocating tokenizer for file=%s.", filename.string()); munmap(buffer, length); } } } } if (result) { fileMap->release(); } } } close(fd); close(fd); } } Loading