aboutsummaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
authorHo-Eun Ryu <ho-eun.ryu@windriver.com>2009-09-30 16:00:00 +0900
committerPatrick Tjin <pattjin@google.com>2014-07-21 22:03:27 -0700
commit9a02e273568833f7f87151227c44dbaf77c3de87 (patch)
tree0586280dfe0058b1d2ac1395ee8be63a5116bce5 /core/src
parent9efecd18c0d29b883f22cbd54aa4a51ca158040d (diff)
downloadwrs_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.cpp38
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());