summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaymondWu <xywu@marvell.com>2010-10-29 15:35:18 +0800
committerJoseph Lo <jlo@marvell.com>2010-11-08 10:33:04 +0800
commitc93076fa32db30d63f3819a89f45e03a51db74a2 (patch)
treef6637a9edde254003f04ad491dc795df5aa5eb26
parent994f72319cf33dba0986b0e88469058dea245fbf (diff)
fix camcorder broken issue
Root cause is monitor and playback are in different threads. When vmeta exits, monitor will use some resourcs shared by the playback thread, which may have been released. This fix removes the private_lock(), which will use shared "fd". I think it's safe because when code enters here, it means an abnormal exit, so the instance will come to and end, we can safely release it's resources. Change-Id: Idc837e8135e393c2700961423258109706d20589 Signed-off-by: RaymondWu <xywu@marvell.com>
-rwxr-xr-xvmeta_lib.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/vmeta_lib.c b/vmeta_lib.c
index 60c438c..af953a6 100755
--- a/vmeta_lib.c
+++ b/vmeta_lib.c
@@ -778,19 +778,28 @@ SIGN32 vdec_os_api_free_user_id(SIGN32 user_id)
return VDEC_OS_DRIVER_OK;
}
-int vmeta_thread_monitor(struct monitor_data * p_md)
+int vmeta_thread_monitor(struct monitor_data * pmd)
{
kernel_share *p_ks;
unsigned int *ret;
vdec_os_driver_cb_t *p_cb = vdec_driver_get_cb();
pthread_attr_t pat;
int detach_attr;
+ struct monitor_data *p_md = NULL;
- if(p_cb->kernel_share_va==0 || p_md == NULL)
+ if(p_cb->kernel_share_va==0 || pmd == NULL)
{
printf("vdec_os_api_free_user_id error: not init yet\n");
return -1;
}
+
+ p_md = malloc(sizeof(struct monitor_data));
+ if(p_md == NULL)
+ return -1;
+
+ memcpy(p_md,pmd,sizeof(struct monitor_data));
+ dbg_printf(VDEC_DEBUG_LOCK,"ori 0x%x 0x%x pt=0x%x user_id=0x%x \n",pmd->pt, pmd->user_id, p_md->pt,p_md->user_id);
+
p_ks = (kernel_share *)p_cb->kernel_share_va;
if(pthread_getattr_np(p_md->pt,&pat) != 0)
@@ -816,33 +825,30 @@ int vmeta_thread_monitor(struct monitor_data * p_md)
dbg_printf(VDEC_DEBUG_LOCK,"pt=0x%x is killed user_id(%d)\n",p_md->pt,p_md->user_id);
if(p_md->user_id==p_ks->active_user_id) {
-
dbg_printf(VDEC_DEBUG_LOCK,"vmeta thread exit abnormally, instance id=%d lock flag=%d\n",p_md->user_id,p_ks->lock_flag);
if( p_ks->lock_flag==VMETA_LOCK_ON ) {
vdec_os_api_unlock(p_md->user_id);
- vmeta_private_lock();
p_ks->lock_flag = VMETA_LOCK_FORCE_INIT;
- vmeta_private_unlock();
}
- vmeta_private_lock();
p_ks->active_user_id = MAX_VMETA_INSTANCE;
- vmeta_private_unlock();
}
- vmeta_private_lock();
if(p_ks->user_id_list[p_md->user_id].status != 0) {
dbg_printf(VDEC_DEBUG_LOCK,"vmeta thread exit abnormally, clear instance(%d)\n",p_md->user_id);
memset(&(p_ks->user_id_list[p_md->user_id]),0x0,sizeof(id_instance));
p_ks->ref_count--;
}
- vmeta_private_unlock();
- free(p_md);//This is malloced in register function
+ free(p_md);
+ free(pmd);
pthread_attr_destroy(&pat);
+
return 0;
tag_monitor_fail:
free(p_md);
+ free(pmd);
+
pthread_attr_destroy(&pat);
return -1;