Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9ee93d18 authored by Jeff Brown's avatar Jeff Brown
Browse files

Fix SDK build on Windows due to use of mmap.

Change-Id: Id4bd9a6f932285c93c5853e540efc20b99876564
parent a5632374
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@

#include <assert.h>
#include <utils/Errors.h>
#include <utils/FileMap.h>
#include <utils/String8.h>

namespace android {
@@ -27,7 +28,7 @@ namespace android {
 * A simple tokenizer for loading and parsing ASCII text files line by line.
 */
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:
    ~Tokenizer();
@@ -108,6 +109,7 @@ private:
    Tokenizer(const Tokenizer& other); // not copyable

    String8 mFilename;
    FileMap* mFileMap;
    const char* mBuffer;
    size_t mLength;

+17 −15
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <utils/Log.h>
#include <utils/Tokenizer.h>

@@ -37,13 +36,16 @@ static inline bool isDelimiter(char ch, const char* delimiters) {
}


Tokenizer::Tokenizer(const String8& filename, const char* buffer, size_t length) :
        mFilename(filename), mBuffer(buffer), mLength(length),
Tokenizer::Tokenizer(const String8& filename, FileMap* fileMap,
        const char* buffer, size_t length) :
        mFilename(filename), mFileMap(fileMap), mBuffer(buffer), mLength(length),
        mCurrent(buffer), mLineNumber(1) {
}

Tokenizer::~Tokenizer() {
    munmap((void*)mBuffer, mLength);
    if (mFileMap) {
        mFileMap->release();
    }
}

status_t Tokenizer::open(const String8& filename, Tokenizer** outTokenizer) {
@@ -55,29 +57,29 @@ status_t Tokenizer::open(const String8& filename, Tokenizer** outTokenizer) {
        result = -errno;
        LOGE("Error opening file '%s', %s.", filename.string(), strerror(errno));
    } else {
        struct stat64 stat;
        if (fstat64(fd, &stat)) {
        struct stat stat;
        if (fstat(fd, &stat)) {
            result = -errno;
            LOGE("Error getting size of file '%s', %s.", filename.string(), strerror(errno));
        } else {
            size_t length = size_t(stat.st_size);
            void* buffer = mmap(NULL, length, PROT_READ, MAP_FILE | MAP_PRIVATE, fd, 0);
            if (buffer == MAP_FAILED) {
                result = -errno;
            FileMap* fileMap = new FileMap();
            if (!fileMap->create(NULL, fd, 0, length, true)) {
                result = NO_MEMORY;
                LOGE("Error mapping file '%s', %s.", filename.string(), strerror(errno));
            } else {
                if (madvise(buffer, length, MADV_SEQUENTIAL)) {
                    LOGW("Error calling madvise for mmapped file '%s', %s.", filename.string(),
                            strerror(errno));
                }
                fileMap->advise(FileMap::SEQUENTIAL);

                *outTokenizer = new Tokenizer(filename, static_cast<const char*>(buffer), length);
                *outTokenizer = new Tokenizer(filename, fileMap,
                        static_cast<const char*>(fileMap->getDataPtr()), length);
                if (!*outTokenizer) {
                    result = NO_MEMORY;
                    LOGE("Error allocating tokenizer for file=%s.", filename.string());
                    munmap(buffer, length);
                }
            }
            if (result) {
                fileMap->release();
            }
        }
        close(fd);
    }