Ensure munmap matches mmap
Bug: 31350622 Change-Id: I6d3f9faec32d54360caa6706d17405e20b50966c
This commit is contained in:
@@ -149,12 +149,12 @@ Bitmap::Bitmap(void* address, void* context, FreeFunc freeFunc,
|
||||
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)
|
||||
: mPixelStorageType(PixelStorageType::Ashmem) {
|
||||
mPixelStorage.ashmem.address = address;
|
||||
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));
|
||||
// Note: this will trigger a call to onStrongRefDestroyed(), but
|
||||
// we want the pixel ref to have a ref count of 0 at this point
|
||||
@@ -1013,7 +1013,7 @@ static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {
|
||||
|
||||
// Map the pixels in place and take ownership of the ashmem region.
|
||||
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);
|
||||
if (!nativeBitmap) {
|
||||
close(dupFd);
|
||||
|
||||
@@ -51,8 +51,8 @@ public:
|
||||
const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable);
|
||||
Bitmap(void* address, void* context, FreeFunc freeFunc,
|
||||
const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable);
|
||||
Bitmap(void* address, int fd, const SkImageInfo& info, size_t rowBytes,
|
||||
SkColorTable* ctable);
|
||||
Bitmap(void* address, int fd, size_t mappedSize, const SkImageInfo& info,
|
||||
size_t rowBytes, SkColorTable* ctable);
|
||||
|
||||
const SkImageInfo& info() const;
|
||||
|
||||
|
||||
@@ -613,7 +613,7 @@ android::Bitmap* GraphicsJNI::allocateAshmemPixelRef(JNIEnv* env, SkBitmap* bitm
|
||||
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);
|
||||
// since we're already allocated, we lockPixels right away
|
||||
// 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,
|
||||
SkColorTable* ctable, int fd, void* addr, bool readOnly) {
|
||||
SkColorTable* ctable, int fd, void* addr, size_t size, bool readOnly) {
|
||||
const SkImageInfo& info = bitmap->info();
|
||||
if (info.fColorType == kUnknown_SkColorType) {
|
||||
doThrowIAE(env, "unknown bitmap configuration");
|
||||
@@ -633,7 +633,8 @@ android::Bitmap* GraphicsJNI::mapAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
|
||||
if (!addr) {
|
||||
// Map existing ashmem region if not already mapped.
|
||||
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) {
|
||||
return nullptr;
|
||||
}
|
||||
@@ -643,7 +644,7 @@ android::Bitmap* GraphicsJNI::mapAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
|
||||
// attempting to compute our own.
|
||||
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);
|
||||
if (readOnly) {
|
||||
bitmap->pixelRef()->setImmutable();
|
||||
|
||||
@@ -99,7 +99,7 @@ public:
|
||||
SkColorTable* ctable);
|
||||
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user