summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRicardo Cerqueira <cyanogenmod@cerqueira.org>2013-10-27 19:51:25 +0000
committerRicardo Cerqueira <cyanogenmod@cerqueira.org>2013-10-27 19:51:25 +0000
commita3a9aaa5bbf0a94f1039e3eda368fa8a28ddecf8 (patch)
tree75b9603704c176291b91c2e715e06ccdf00d693e
parent946eb0209562bda3cd99d0d0c6119e69e2ac3099 (diff)
downloadandroid_hardware_samsung-a3a9aaa5bbf0a94f1039e3eda368fa8a28ddecf8.tar.gz
android_hardware_samsung-a3a9aaa5bbf0a94f1039e3eda368fa8a28ddecf8.tar.bz2
android_hardware_samsung-a3a9aaa5bbf0a94f1039e3eda368fa8a28ddecf8.zip
gralloc: Allow unmapping concurrent handles
If we allow registering those buffers, we need to let them go, too Change-Id: I6c2dc862e1e783e2b0d3c7d37d60ebe2290173fa
-rw-r--r--exynos4/hal/libgralloc_ump/gralloc_module.cpp63
1 files changed, 30 insertions, 33 deletions
diff --git a/exynos4/hal/libgralloc_ump/gralloc_module.cpp b/exynos4/hal/libgralloc_ump/gralloc_module.cpp
index 3bbb831..79c4750 100644
--- a/exynos4/hal/libgralloc_ump/gralloc_module.cpp
+++ b/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,
"[unregister] handle %p still locked (state=%08x)", hnd, hnd->lockState);
- /* never unmap buffers that were created in this process */
- if (hnd->pid != getpid()) {
- pthread_mutex_lock(&s_map_lock);
- if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_UMP) {
- ump_mapped_pointer_release((ump_handle)hnd->ump_mem_handle);
- hnd->base = 0;
- ump_reference_release((ump_handle)hnd->ump_mem_handle);
- hnd->ump_mem_handle = (int)UMP_INVALID_MEMORY_HANDLE;
- hnd->lockState = 0;
- hnd->writeOwner = 0;
- } else if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_IOCTL) {
- 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_lock(&s_map_lock);
+ if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_UMP) {
+ ump_mapped_pointer_release((ump_handle)hnd->ump_mem_handle);
+ hnd->base = 0;
+ ump_reference_release((ump_handle)hnd->ump_mem_handle);
+ hnd->ump_mem_handle = (int)UMP_INVALID_MEMORY_HANDLE;
+ hnd->lockState = 0;
+ hnd->writeOwner = 0;
+ } else if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_IOCTL) {
+ 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);
+
return 0;
}