static int gralloc_unmap(gralloc_module_t const* module, buffer_handle_t handle) { private_handle_t* hnd = (private_handle_t*)handle; if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER)) { if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_IOCTL) { void* base = (void*)(intptr_t(hnd->base) - hnd->offset); size_t size = FIMC1_RESERVED_SIZE * 1024; if (munmap(base, size) < 0) ALOGE("Could not unmap %s", strerror(errno)); } else if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) { void* base = (void*)hnd->base; size_t size = hnd->size; if (ion_unmap(base, size) < 0) ALOGE("Could not ion_unmap %s", strerror(errno)); ion_client_destroy(hnd->ion_client); } else { void* base = (void*)hnd->base; size_t size = hnd->size; #if PMEM_HACK base = (void*)(intptr_t(base) - hnd->offset); size += hnd->offset; #endif if (munmap(base, size) < 0) ALOGE("Could not unmap %s", strerror(errno)); } } hnd->base = 0; return 0; }
MemoryHeapIon::~MemoryHeapIon() { if (mIonClient != -1) { ion_unmap(getBase(), getSize()); ion_client_destroy(mIonClient); mIonClient = -1; } }
void ExynosVirtualDisplay::unmapAddrFBTarget() { for (int i = 0; i < NUM_FB_TARGET; i++) { if (fbTargetInfo[i].fd != -1) { ion_unmap((void *)fbTargetInfo[i].mappedAddr, fbTargetInfo[i].mapSize); fbTargetInfo[i].fd = -1; fbTargetInfo[i].mappedAddr = 0; fbTargetInfo[i].mapSize = 0; } } }