gralloc1: Support GRALLOC1_CAPABILITY_RELEASE_IMPLY_DELETE
v2: Handle buffers allocated outside gralloc with flag
PRIV_FLAGS_CLIENT_ALLOCATED.
CRs-Fixed: 2041607
Bug: 36355756
Change-Id: Icb0c4b724f7bf7097812f6306fb0b9a56bb790a9
diff --git a/libgralloc1/gr_buf_mgr.cpp b/libgralloc1/gr_buf_mgr.cpp
index 4c3f7d4..d7e6727 100644
--- a/libgralloc1/gr_buf_mgr.cpp
+++ b/libgralloc1/gr_buf_mgr.cpp
@@ -211,11 +211,10 @@
return GRALLOC1_ERROR_BAD_HANDLE;
}
- // TODO(user): delete handle once framework bug around this is confirmed
- // to be resolved. This is tracked in bug 36355756
private_handle_t * handle = const_cast<private_handle_t *>(hnd);
handle->fd = -1;
handle->fd_metadata = -1;
+ delete handle;
return GRALLOC1_ERROR_NONE;
}
@@ -278,6 +277,10 @@
}
gralloc1_error_t BufferManager::RetainBuffer(private_handle_t const *hnd) {
+ if (hnd->flags & private_handle_t::PRIV_FLAGS_CLIENT_ALLOCATED) {
+ return GRALLOC1_ERROR_NONE;
+ }
+
ALOGD_IF(DEBUG, "Retain buffer handle:%p id: %" PRIu64, hnd, hnd->id);
gralloc1_error_t err = GRALLOC1_ERROR_NONE;
std::lock_guard<std::mutex> lock(buffer_lock_);
@@ -299,6 +302,10 @@
}
gralloc1_error_t BufferManager::ReleaseBuffer(private_handle_t const *hnd) {
+ if (hnd->flags & private_handle_t::PRIV_FLAGS_CLIENT_ALLOCATED) {
+ return GRALLOC1_ERROR_NONE;
+ }
+
ALOGD_IF(DEBUG, "Release buffer handle:%p id: %" PRIu64, hnd, hnd->id);
std::lock_guard<std::mutex> lock(buffer_lock_);
auto buf = GetBufferFromHandleLocked(hnd);
@@ -327,16 +334,16 @@
return GRALLOC1_ERROR_BAD_VALUE;
}
- if (hnd->base == 0) {
- // we need to map for real
- err = MapBuffer(hnd);
- }
-
auto buf = GetBufferFromHandleLocked(hnd);
if (buf == nullptr) {
return GRALLOC1_ERROR_BAD_HANDLE;
}
+ if (hnd->base == 0) {
+ // we need to map for real
+ err = MapBuffer(hnd);
+ }
+
// Invalidate if CPU reads in software and there are non-CPU
// writers. No need to do this for the metadata buffer as it is
// only read/written in software.