diff options
Diffstat (limited to 'vmeta_lib.c')
-rwxr-xr-x | vmeta_lib.c | 26 |
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; |