gralloc: Allow unmapping concurrent handles

If we allow registering those buffers, we need to let them go, too

Change-Id: I6c2dc862e1e783e2b0d3c7d37d60ebe2290173fa
tirimbino
Ricardo Cerqueira 11 years ago
parent 946eb02095
commit a3a9aaa5bb
  1. 63
      exynos4/hal/libgralloc_ump/gralloc_module.cpp

@ -318,43 +318,40 @@ static int gralloc_unregister_buffer(gralloc_module_t const* module, buffer_hand
ALOGE_IF(hnd->lockState & private_handle_t::LOCK_STATE_READ_MASK, ALOGE_IF(hnd->lockState & private_handle_t::LOCK_STATE_READ_MASK,
"[unregister] handle %p still locked (state=%08x)", hnd, hnd->lockState); "[unregister] handle %p still locked (state=%08x)", hnd, hnd->lockState);
/* never unmap buffers that were created in this process */ pthread_mutex_lock(&s_map_lock);
if (hnd->pid != getpid()) { if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_UMP) {
pthread_mutex_lock(&s_map_lock); ump_mapped_pointer_release((ump_handle)hnd->ump_mem_handle);
if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_UMP) { hnd->base = 0;
ump_mapped_pointer_release((ump_handle)hnd->ump_mem_handle); ump_reference_release((ump_handle)hnd->ump_mem_handle);
hnd->base = 0; hnd->ump_mem_handle = (int)UMP_INVALID_MEMORY_HANDLE;
ump_reference_release((ump_handle)hnd->ump_mem_handle); hnd->lockState = 0;
hnd->ump_mem_handle = (int)UMP_INVALID_MEMORY_HANDLE; hnd->writeOwner = 0;
hnd->lockState = 0; } else if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_IOCTL) {
hnd->writeOwner = 0; if(hnd->base != 0)
} else if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_IOCTL) { gralloc_unmap(module, handle);
if(hnd->base != 0)
gralloc_unmap(module, handle);
pthread_mutex_unlock(&s_map_lock);
if (0 < gMemfd) {
close(gMemfd);
gMemfd = 0;
}
return 0;
} else if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) {
ump_mapped_pointer_release((ump_handle)hnd->ump_mem_handle);
ump_reference_release((ump_handle)hnd->ump_mem_handle);
if (hnd->base)
gralloc_unmap(module, handle);
hnd->base = 0;
hnd->ump_mem_handle = (int)UMP_INVALID_MEMORY_HANDLE;
hnd->lockState = 0;
hnd->writeOwner = 0;
} else {
ALOGE("unregistering non-UMP buffer not supported");
}
pthread_mutex_unlock(&s_map_lock); pthread_mutex_unlock(&s_map_lock);
if (0 < gMemfd) {
close(gMemfd);
gMemfd = 0;
}
return 0;
} else if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) {
ump_mapped_pointer_release((ump_handle)hnd->ump_mem_handle);
ump_reference_release((ump_handle)hnd->ump_mem_handle);
if (hnd->base)
gralloc_unmap(module, handle);
hnd->base = 0;
hnd->ump_mem_handle = (int)UMP_INVALID_MEMORY_HANDLE;
hnd->lockState = 0;
hnd->writeOwner = 0;
} else {
ALOGE("unregistering non-UMP buffer not supported");
} }
pthread_mutex_unlock(&s_map_lock);
return 0; return 0;
} }

Loading…
Cancel
Save