diff options
author | Ho-Eun Ryu <ho-eun.ryu@windriver.com> | 2009-09-30 16:00:00 +0900 |
---|---|---|
committer | Patrick Tjin <pattjin@google.com> | 2014-07-21 22:03:27 -0700 |
commit | 9a02e273568833f7f87151227c44dbaf77c3de87 (patch) | |
tree | 0586280dfe0058b1d2ac1395ee8be63a5116bce5 /core/src | |
parent | 9efecd18c0d29b883f22cbd54aa4a51ca158040d (diff) | |
download | wrs_omxil_core-9a02e273568833f7f87151227c44dbaf77c3de87.tar.gz |
core: fix minor, prevent Deinit() if having component instances
Diffstat (limited to 'core/src')
-rw-r--r-- | core/src/wrs_omxcore.cpp | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/core/src/wrs_omxcore.cpp b/core/src/wrs_omxcore.cpp index b901a43..b54a81a 100644 --- a/core/src/wrs_omxcore.cpp +++ b/core/src/wrs_omxcore.cpp @@ -19,6 +19,7 @@ #include <log.h> static unsigned int g_initialized = 0; +static unsigned int g_nr_instances = 0; static struct list *g_module_list = NULL; static pthread_mutex_t g_module_lock = PTHREAD_MUTEX_INITIALIZER; @@ -123,11 +124,16 @@ OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Init(void) OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Deinit(void) { + OMX_ERRORTYPE ret = OMX_ErrorNone; + pthread_mutex_lock(&g_module_lock); - destruct_components(g_module_list); + if (!g_nr_instances) + g_module_list = destruct_components(g_module_list); + else + ret = OMX_ErrorUndefined; pthread_mutex_unlock(&g_module_lock); - return OMX_ErrorNone; + return ret; } OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_ComponentNameEnum( @@ -177,17 +183,29 @@ OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_GetHandle( ret = cmodule->Load(); if (ret != OMX_ErrorNone) - break; + goto unlock_list; ret = cmodule->InstantiateComponent(&cbase); - if (ret != OMX_ErrorNone) { - cmodule->Unload(); - break; - } + if (ret != OMX_ErrorNone) + goto unload_cmodule; + + ret = cbase->GetHandle(pHandle, pAppData, pCallBacks); + if (ret != OMX_ErrorNone) + goto delete_cbase; + cbase->SetCModule(cmodule); + g_nr_instances++; + pthread_mutex_unlock(&g_module_lock); + return OMX_ErrorNone; + + delete_cbase: + delete cbase; + unload_cmodule: + cmodule->Unload(); + unlock_list: pthread_mutex_unlock(&g_module_lock); - return cbase->GetHandle(pHandle, pAppData, pCallBacks); + return ret; } } pthread_mutex_unlock(&g_module_lock); @@ -216,6 +234,10 @@ OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_FreeHandle( return ret; } + pthread_mutex_lock(&g_module_lock); + g_nr_instances--; + pthread_mutex_unlock(&g_module_lock); + cmodule = cbase->GetCModule(); if (!cmodule) { LOGE("fatal error, %s does not have cmodule\n", cbase->GetName()); |