summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;