From 5146b13160d7d1cf0b828104503aa67a88e7cc6d Mon Sep 17 00:00:00 2001 From: Sunita Nadampalli Date: Wed, 22 Apr 2015 14:36:37 -0500 Subject: libdce[Linux]: Add mutex protection for dce_buf_lock/dce_buf_unlock The dce_buf_lock and dce_buf_unlock are meant for any video buffer locking and unlocking with the GEM allocator. Currently, these methods are being called from libdce apis with ipc mutex held. In order to enable other media components to make use of these buffer lock/unlock apis, explicit ipc mutex protection is added. Change-Id: Ibb4976120e5dfe6f88b42359655a460cafc223ac Signed-off-by: Sunita Nadampalli --- libdce_linux.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/libdce_linux.c b/libdce_linux.c index 85dc517..3de2e0a 100644 --- a/libdce_linux.c +++ b/libdce_linux.c @@ -34,6 +34,8 @@ #include #include +#include + #include #include #include @@ -51,12 +53,19 @@ int bDrmOpenedByDce = FALSE; struct omap_device *OmapDev = NULL; extern MmRpc_Handle MmRpcHandle[]; +extern pthread_mutex_t ipc_mutex; + void *dce_init(void) { dce_error_status eError = DCE_EOK; DEBUG(" >> dce_init"); + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&ipc_mutex, &attr); + /* Open omapdrm device */ if( OmapDrm_FD == INVALID_DRM_FD ) { DEBUG("Open omapdrm device"); @@ -90,6 +99,8 @@ int dce_buf_lock(int num, size_t *handle) MmRpc_BufDesc *desc = NULL; dce_error_status eError = DCE_EOK; + pthread_mutex_lock(&ipc_mutex); + _ASSERT(num > 0, DCE_EINVALID_INPUT); desc = malloc(num * sizeof(MmRpc_BufDesc)); @@ -106,6 +117,9 @@ EXIT: if( desc ) { free(desc); } + + pthread_mutex_unlock(&ipc_mutex); + return (eError); } @@ -115,6 +129,8 @@ int dce_buf_unlock(int num, size_t *handle) MmRpc_BufDesc *desc = NULL; dce_error_status eError = DCE_EOK; + pthread_mutex_lock(&ipc_mutex); + _ASSERT(num > 0, DCE_EINVALID_INPUT); desc = malloc(num * sizeof(MmRpc_BufDesc)); @@ -131,6 +147,9 @@ EXIT: if( desc ) { free(desc); } + + pthread_mutex_unlock(&ipc_mutex); + return (eError); } @@ -156,6 +175,8 @@ int dsp_dce_buf_lock(int num, size_t *handle) MmRpc_BufDesc *desc = NULL; dce_error_status eError = DCE_EOK; + pthread_mutex_lock(&ipc_mutex); + _ASSERT(num > 0, DCE_EINVALID_INPUT); desc = malloc(num * sizeof(MmRpc_BufDesc)); @@ -172,6 +193,9 @@ EXIT: if( desc ) { free(desc); } + + pthread_mutex_unlock(&ipc_mutex); + return (eError); } @@ -181,6 +205,8 @@ int dsp_dce_buf_unlock(int num, size_t *handle) MmRpc_BufDesc *desc = NULL; dce_error_status eError = DCE_EOK; + pthread_mutex_lock(&ipc_mutex); + _ASSERT(num > 0, DCE_EINVALID_INPUT); desc = malloc(num * sizeof(MmRpc_BufDesc)); @@ -197,6 +223,8 @@ EXIT: if( desc ) { free(desc); } + + pthread_mutex_unlock(&ipc_mutex); return (eError); } /* Incase of X11 or Wayland the fd can be shared to libdce using this call */ -- cgit v1.2.3-54-g00ecf