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

Commit 003bdee0 authored by John Reck's avatar John Reck
Browse files

Ensure munmap matches mmap

Bug: 31350622
Change-Id: I6d3f9faec32d54360caa6706d17405e20b50966c
parent bcd458d1
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -151,12 +151,12 @@ Bitmap::Bitmap(void* address, void* context, FreeFunc freeFunc,
    mPixelRef->unref();
    mPixelRef->unref();
}
}


Bitmap::Bitmap(void* address, int fd,
Bitmap::Bitmap(void* address, int fd, size_t mappedSize,
            const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable)
            const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable)
        : mPixelStorageType(PixelStorageType::Ashmem) {
        : mPixelStorageType(PixelStorageType::Ashmem) {
    mPixelStorage.ashmem.address = address;
    mPixelStorage.ashmem.address = address;
    mPixelStorage.ashmem.fd = fd;
    mPixelStorage.ashmem.fd = fd;
    mPixelStorage.ashmem.size = ashmem_get_size_region(fd);
    mPixelStorage.ashmem.size = mappedSize;
    mPixelRef.reset(new WrappedPixelRef(this, address, info, rowBytes, ctable));
    mPixelRef.reset(new WrappedPixelRef(this, address, info, rowBytes, ctable));
    // Note: this will trigger a call to onStrongRefDestroyed(), but
    // Note: this will trigger a call to onStrongRefDestroyed(), but
    // we want the pixel ref to have a ref count of 0 at this point
    // we want the pixel ref to have a ref count of 0 at this point
@@ -1027,7 +1027,7 @@ static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {


        // Map the pixels in place and take ownership of the ashmem region.
        // Map the pixels in place and take ownership of the ashmem region.
        nativeBitmap = GraphicsJNI::mapAshmemPixelRef(env, bitmap.get(),
        nativeBitmap = GraphicsJNI::mapAshmemPixelRef(env, bitmap.get(),
                ctable, dupFd, const_cast<void*>(blob.data()), !isMutable);
                ctable, dupFd, const_cast<void*>(blob.data()), size, !isMutable);
        SkSafeUnref(ctable);
        SkSafeUnref(ctable);
        if (!nativeBitmap) {
        if (!nativeBitmap) {
            close(dupFd);
            close(dupFd);
+2 −2
Original line number Original line Diff line number Diff line
@@ -51,8 +51,8 @@ public:
            const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable);
            const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable);
    Bitmap(void* address, void* context, FreeFunc freeFunc,
    Bitmap(void* address, void* context, FreeFunc freeFunc,
            const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable);
            const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable);
    Bitmap(void* address, int fd, const SkImageInfo& info, size_t rowBytes,
    Bitmap(void* address, int fd, size_t mappedSize, const SkImageInfo& info,
            SkColorTable* ctable);
            size_t rowBytes, SkColorTable* ctable);


    const SkImageInfo& info() const;
    const SkImageInfo& info() const;


+5 −4
Original line number Original line Diff line number Diff line
@@ -613,7 +613,7 @@ android::Bitmap* GraphicsJNI::allocateAshmemPixelRef(JNIEnv* env, SkBitmap* bitm
        return nullptr;
        return nullptr;
    }
    }


    android::Bitmap* wrapper = new android::Bitmap(addr, fd, info, rowBytes, ctable);
    android::Bitmap* wrapper = new android::Bitmap(addr, fd, size, info, rowBytes, ctable);
    wrapper->getSkBitmap(bitmap);
    wrapper->getSkBitmap(bitmap);
    // since we're already allocated, we lockPixels right away
    // since we're already allocated, we lockPixels right away
    // HeapAllocator behaves this way too
    // HeapAllocator behaves this way too
@@ -623,7 +623,7 @@ android::Bitmap* GraphicsJNI::allocateAshmemPixelRef(JNIEnv* env, SkBitmap* bitm
}
}


android::Bitmap* GraphicsJNI::mapAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
android::Bitmap* GraphicsJNI::mapAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
        SkColorTable* ctable, int fd, void* addr, bool readOnly) {
        SkColorTable* ctable, int fd, void* addr, size_t size, bool readOnly) {
    const SkImageInfo& info = bitmap->info();
    const SkImageInfo& info = bitmap->info();
    if (info.colorType() == kUnknown_SkColorType) {
    if (info.colorType() == kUnknown_SkColorType) {
        doThrowIAE(env, "unknown bitmap configuration");
        doThrowIAE(env, "unknown bitmap configuration");
@@ -633,7 +633,8 @@ android::Bitmap* GraphicsJNI::mapAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
    if (!addr) {
    if (!addr) {
        // Map existing ashmem region if not already mapped.
        // Map existing ashmem region if not already mapped.
        int flags = readOnly ? (PROT_READ) : (PROT_READ | PROT_WRITE);
        int flags = readOnly ? (PROT_READ) : (PROT_READ | PROT_WRITE);
        addr = mmap(NULL, ashmem_get_size_region(fd), flags, MAP_SHARED, fd, 0);
        size = ashmem_get_size_region(fd);
        addr = mmap(NULL, size, flags, MAP_SHARED, fd, 0);
        if (addr == MAP_FAILED) {
        if (addr == MAP_FAILED) {
            return nullptr;
            return nullptr;
        }
        }
@@ -643,7 +644,7 @@ android::Bitmap* GraphicsJNI::mapAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
    // attempting to compute our own.
    // attempting to compute our own.
    const size_t rowBytes = bitmap->rowBytes();
    const size_t rowBytes = bitmap->rowBytes();


    android::Bitmap* wrapper = new android::Bitmap(addr, fd, info, rowBytes, ctable);
    android::Bitmap* wrapper = new android::Bitmap(addr, fd, size, info, rowBytes, ctable);
    wrapper->getSkBitmap(bitmap);
    wrapper->getSkBitmap(bitmap);
    if (readOnly) {
    if (readOnly) {
        bitmap->pixelRef()->setImmutable();
        bitmap->pixelRef()->setImmutable();
+1 −1
Original line number Original line Diff line number Diff line
@@ -100,7 +100,7 @@ public:
            SkColorTable* ctable);
            SkColorTable* ctable);


    static android::Bitmap* mapAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
    static android::Bitmap* mapAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
            SkColorTable* ctable, int fd, void* addr, bool readOnly);
            SkColorTable* ctable, int fd, void* addr, size_t size, bool readOnly);


    /**
    /**
     * Given a bitmap we natively allocate a memory block to store the contents
     * Given a bitmap we natively allocate a memory block to store the contents