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

Commit df44034c authored by Jeff Brown's avatar Jeff Brown Committed by Android (Google) Code Review
Browse files

Merge "Fix SDK build on Windows due to use of mmap."

parents a5632374 9ee93d18
Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -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 {
@@ -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();
@@ -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;


+17 −15
Original line number Original line Diff line number Diff line
@@ -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>


@@ -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) {
@@ -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);
    }
    }